SPI 通訊

片選訊號

大多數從器件具有有效的低晶片選擇輸入。因此,初始化和使用晶片選擇引腳的正確程式碼是:

#define CSPIN 1 // or whatever else your CS pin is
// init:
pinMode(CSPIN, OUTPUT);
digitalWrite(CSPIN, 1); // deselect

// use:
digitalWrite(CSPIN, 0); // select
... perform data transfer ...
digitalWrite(CSPIN, 1); // deselect

取消選擇從站與選擇它同樣重要,因為從站可以在選擇時驅動 MISO 線。可能有很多 slave,但只有一個可能會推動 MISO。如果未正確取消選擇從站,則兩個或多個從站可能正在驅動 MISO,這可能導致其輸出之間出現短路並可能損壞裝置。

交易

交易有兩個目的:

  • 告訴 SPI 什麼時候我們想要在特定的上下文中開始和結束使用它
  • 為特定晶片配置 SPI

時鐘線在不同的 SPI 模式下具有不同的空閒狀態。選擇從器件時更改 SPI 模式可能會使從器件混淆,因此在選擇從器件之前始終要設定 SPI 模式。可以使用傳遞給 SPI.beginTransactionSPISettings 物件設定 SPI 模式:

SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(CSPIN, 0);
... perform data transfer ...
digitalWrite(CSPIN, 1);
SPI.endTransaction();

SPISettings 也可以儲存在別處:

SPISettings mySettings(1000000, MSBFIRST, SPI_MODE0);
SPI.beginTransaction(mySettings);

如果程式碼的另一部分試圖在對 beginTransaction()endTransaction() 的一對呼叫之間使用 SPI,則可能會引發錯誤 - 如何完成取決於實現。

另見 Arduino 參考:SPISettings

在中斷服務程式中使用 SPI

如果必須在 ISR 中使用 SPI,則不能同時進行其他事務。SPI 庫提供了 usingInterrupt(interrupt_number) 來促進這一點。它通過在呼叫 beginTransaction() 時禁用給定的中斷來工作,因此中斷不能在呼叫 beginTransaction()endTransaction() 之間觸發。

另請參閱 Arduino 參考:SPI:usingInterrupt