首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET Micro Framework 硬體存取實戰 (二):I2C 與 SPI 總線通訊完整範例

     編輯:關於.NET

I2C 總線:低成本、可插拔、半雙工

適用於感測器、EEPROM、RTC 等低速周邊 (標準 100kbps、快速 400kbps)。

核心類別:I2CDevice

using Microsoft.SPOT.Hardware;

public static void Main()
{
    // 1. 建立設備配置:位址 0x3A (58),時脈 100kHz
    var config = new I2CDevice.Configuration(58, 100);

    // 2. 實例化設備
    var device = new I2CDevice(config);

    // 3. 準備讀寫緩衝區
    byte[] writeBuf = { 0xAA };       // 發送指令/暫存器位址
    byte[] readBuf = new byte[4];     // 接收資料

    // 4. 建立事務
    var writeTrans = device.CreateWriteTransaction(writeBuf);
    var readTrans = device.CreateReadTransaction(readBuf);

    // 5. 批次執行 (原子性:Start → Write → Restart → Read → Stop)
    var transactions = new I2CDevice.I2CTransaction[] { writeTrans, readTrans };
    int transferred = device.Execute(transactions, 100); // 逾時 100ms

    Debug.Print($"Transferred: {transferred} bytes"); // 預期 5
}
  • Execute 會依序執行事務陣列,**單一總線鎖定**,確保原子性。
  • 支援 CreateWriteReadTransaction 合併讀寫 (部分硬體支援)。

SPI 總線:高速、全雙工、主從架構

四線制:SCLK (時脈)、MOSI (主出從入)、MISO (主入從出)、CS/SS (片選)。速率可達數十 MHz。

核心類別:SPI

// 1. 依據資料手冊建立配置
var config = new SPI.Configuration(
    chipSelectPin: Cpu.Pin.GPIO_Pin1,   // CS 腳位
    chipSelectActiveState: false,       // 低電平有效
    chipSelectSetupTime: 1,             // CS 建立時間 ms
    chipSelectHoldTime: 1,              // CS 保持時間 ms
    clockIdleState: true,               // 閒置高電平 (CPOL=1)
    clockEdge: false,                   // 下降沿取樣 (CPHA=0) → Mode 3
    clockRateKHz: 15000,                // 15 MHz
    spiModule: SPI.SPI_module1          // MCU SPI 控制器編號
);

// 2. 實例化
var spi = new SPI(config);

// 3. 全雙工收發 (WriteRead 同時發送與接收)
ushort[] tx = { 0xAAAA };
ushort[] rx = new ushort[1];
spi.WriteRead(tx, rx); // 發送 0xAAAA,同步接收 16-bit 回應

Debug.Print($"Received: 0x{rx[0]:X4}");
  • WriteRead 內部自動處理 CS 拉低/釋放、時脈產生、移位暫存器操作。
  • 單純發送用 Write,單純接收用 Read (需先發送 dummy bytes)。

HardwareProvider:腳位保留與衝突避免

自訂 HardwareProvider 向 Micro Kernel 宣告腳位用途,防止 GPIO/I2C/SPI/Serial 重複佔用:


public class MyHardwareProvider : HardwareProvider
{
    public override void GetSpiPins(SPI.SPI_module spiMod,
        out Cpu.Pin sclk, out Cpu.Pin miso, out Cpu.Pin mosi)
    {
        sclk = Cpu.Pin.GPIO_Pin1;
        miso = Cpu.Pin.GPIO_Pin2;
        mosi = Cpu.Pin.GPIO_Pin3;
    }
    // 同理實作 GetI2CPins、GetSerialPins
}

// 程式啟動時註冊
HardwareProvider.Register(new MyHardwareProvider());

若嘗試建立衝突的 SPI/SerialPort 實例,運行時拋出例外,避免硬體誤動作。

總結

特性I2CSPI
速率100/400 kbps~50 MHz
線數2 (SDA, SCL)4 (SCLK, MOSI, MISO, CS)
拓撲多主多從,位址選擇單主多從,片選選擇
全/半雙工半雙工全雙工
.NET MF APII2CDevice + TransactionSPI + Write/Read/WriteRead

選型建議:板載感測器/EEPROM 用 I2C;高速 ADC/DAC、無線模組、TFT 螢幕用 SPI。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved