適用於感測器、EEPROM、RTC 等低速周邊 (標準 100kbps、快速 400kbps)。
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 合併讀寫 (部分硬體支援)。四線制:SCLK (時脈)、MOSI (主出從入)、MISO (主入從出)、CS/SS (片選)。速率可達數十 MHz。
// 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 向 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 實例,運行時拋出例外,避免硬體誤動作。
| 特性 | I2C | SPI |
|---|---|---|
| 速率 | 100/400 kbps | ~50 MHz |
| 線數 | 2 (SDA, SCL) | 4 (SCLK, MOSI, MISO, CS) |
| 拓撲 | 多主多從,位址選擇 | 單主多從,片選選擇 |
| 全/半雙工 | 半雙工 | 全雙工 |
| .NET MF API | I2CDevice + Transaction | SPI + Write/Read/WriteRead |
選型建議:板載感測器/EEPROM 用 I2C;高速 ADC/DAC、無線模組、TFT 螢幕用 SPI。