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