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.beginTransaction
的 SPISettings
物件設定 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,則可能會引發錯誤 - 如何完成取決於實現。
在中斷服務程式中使用 SPI
如果必須在 ISR 中使用 SPI,則不能同時進行其他事務。SPI 庫提供了 usingInterrupt(interrupt_number)
來促進這一點。它通過在呼叫 beginTransaction()
時禁用給定的中斷來工作,因此中斷不能在呼叫 beginTransaction()
和 endTransaction()
之間觸發。