程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 在.Net Micro Framework中訪問硬件 - part2

在.Net Micro Framework中訪問硬件 - part2

編輯:關於.NET

摘要:本文介紹了.Net Micro Framework中對硬件的簡單而獨特的訪問方式。涉及I2C,SPI等。通過簡明的例程說明了如何在.Net MF中創建並訪問I2C和SPI設備

I2C Bus

盡管MCU采用I2C(Inter-Integrated Circuit)總線的方式與外設通信會比很多其他總線系統要慢(最高100kbps),但是由於其成本低,對可插拔的設備支持較好,在很多場合它仍是作為標准的feature得到支持。

那麼如何在.Net Micro Framework中訪問I2C方式連接的設備呢?

.Net MF提供了一個Microsoft.SPOT.Hardware.I2CDevice的類來實現訪問IIC設備的功能。首先,你需要為每個IIC設備創建一個I2CDevice的實例,和之前提到的SerialPort類似的,你需要為它的構造函數傳入一個I2CDevice.Configuration的配置對象。在這個配置對象裡面你需要指定該設備的地址和通信速度(khz)。接著,你需要創建一組事務對象(CreateReadTransaction和CreateWriteTransaction)來進行讀寫操作,具體的事務類型自然是取決於你的具體組件的作用了。當你創建事務時,你需要傳入一個待讀(寫)的緩沖區。

然後,你需要把這組事務以數組的形式傳遞給Execute方法供執行並開始進行通信。Execute方法將會在所有事務執行完畢或者方法超時的時候返回。

下面的代碼演示了如何對地址編號為58的I2C設備進行通信。

using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
namespace I2CSample
{
public class Program
{
public static void Main()
{
I2CDevice.Configuration config =
new I2CDevice.Configuration(
58, //地址號
100 //100khz的時鐘頻率
);
I2CDevice device = new I2CDevice(config);
byte[] outBuffer = new byte[] { 0xAA }; //待寫buffer
byte[] inBuffer = new byte[4];//待讀buffer
I2CDevice.I2CWriteTransaction writeTransaction =
device.CreateWriteTransaction(outBuffer);
I2CDevice.I2CReadTransaction readTransaction =
device.CreateReadTransaction(inBuffer);
//創建一個事務數組
I2CDevice.I2CTransaction[] transactions =
new I2CDevice.I2CTransaction[] {
writeTransaction,
readTransaction
};
int transferred = device.Execute(
transactions,
100 //超時時間設為100ms
);
//transferred bytes should be 1 + 4 = 5
}
}
}

SPI BUS

SPI(Serial peripheral interface)連接需要三條線:時鐘(SCLK),輸入(MISO)和輸出(MOSI),支持全雙工的通信方式。對SPI的設備來說,不存在地址的概念,它們與MCU之間通過一個單獨的引腳相連,在這條連線上的信號即所謂的片選信號(SS,CS或STE)。MCU為SPI設備提供時鐘信號,每一個時鐘周期(總線時鐘)內MCU與SPI之間發送一位(1 bit)數據(在片選信號到來之後)。

在.Net Microframework中提供了Microsoft.SPOT.Hardware.SPI類來訪問SPI設備。對於每一台SPI的設備,你首先需要為之創建一個SPI類的實例。和前面提到的其他連接方式的設備類似,在構造函數中你同樣需要傳遞給它一個SPI.Confuguration實例來配置它,當然,在完成這個配置之前,需要先參考一下你的SPI組件的Data Sheet了.

下面的代碼演示了如何在.NET MF中使用SPI:

SPI.Configuration config = new SPI.Configuration(
chipSelectPin, //片選引腳號
false, //片選信號為低時訪問SPI設備
1, //在傳輸數據前,片選信號setup的時間(ms)
1, //芯片的片選保持時間(ms)
true, //在設備沒有被選擇的時候,SCKL設置為高電平
false, //數據在下降沿采集
15000, //時鐘頻率為15000khz(即15MHz)
SPI.SPI_module1 //使用的MCU的哪一組SPI
);
SPI spi = new SPI(config);//使用上述配置構造SPI實例

在創建好這個spi的實例之後,數據的傳輸可以通過它的Write或者WriteRead方法來實現.片選的運作由.NET MF維持,你不需要按一定的時許手動從GPIO讀寫。下面的代碼段演示了如何從MCU發送一個16位的命令並讀取數據(反饋結果):

ushort writeBuffer = new ushort[1] = 0xAAAA;
ushort readBuffer = new ushort[1];
spi.WriteRead(writeBuffer, readBuffer);

SPI的HardwareProvider

我們同樣可以為SPI注冊HardwareProvider來保留相應的3個管腳。你需要重載HardverProvider的GetSpiPins虛方法並傳遞給相應的SPI總線需要的三個Cpu的引腳號:

public override void GetSpiPins(SPI.SPI_module spi_mod,
out Cpu.Pin msk,
out Cpu.Pin miso,
out Cpu.Pin mosi)
{
msk = Cpu.Pin.GPIO_Pin1;//serial clock line(SCKL)
miso = Cpu.Pin.GPIO_Pin2;//master in/slave out line(MISO)
mosi = Cpu.Pin.GPIO_Pin3;//master out/slave in line(MOSI)
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved