摘要:本文介紹了.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)