串列周邊介面 ( Serial Peripheral Interface,簡記 SPI ) 是一種應用於微控制器與一個或多個周邊裝置通訊的短距離、快速、同步串列資料協定,它也可以應用於兩個微控制器之間的通訊。 Arduino 的 SPI 函式庫支援 SPI 通訊標準,讓我們很容易使用 SPI 來連結 Arduino 與周邊裝置。 SPI 有一個主控裝置 ( 通常是微控制器 ) 與所有受控的周邊裝置,利用 MOSI ( Master Out Slave In )、MISO ( Master In Slave Out )、SCK ( Serial Clock ) 等三條線來建立通訊連結。 另外,主控裝置再利用個別連接至每一個周邊裝置的 SS ( Slave Select ) 線來致能或除能周邊裝置。 MOSI、MISO、SCK 等三條線分別連接至 Arduino Uno 開發板的數位接腳 11、12、13,同時也連接至如下圖所示的 ICSP 介面。
☛ begin() 函式
begin() 函式的功用是初始化 SPI 匯流排,同時設定 CK、MOSI、SS 等接腳為輸出模式,且 SCK 及 MOSI 腳輸出為 LOW,SS 腳輸出為 HIGH。 一旦建立 SPI 通訊連線後,Arduino UNO 數位接腳 11、12、13 即不可以再做為其他 I/O 使用。
格式
SPI.begin()
範例
#include <SPI.h> //使用 SPI 函式庫 SPI.begin(); //初始化 SPI
☛ end() 函式
end() 函式的功用是禁用 SPI,結束使用 SPI 匯流排後,Arduino UNO 數位接腳 11、12、13 即可再做為其他 I/O 使用。
格式
SPI.end()
範例
#include <SPI.h> //使用 SPI 函式庫 SPI.end(); //禁用 SPI
☛ transfer() 函式
transfer() 函式的功用是利用 SPI 匯流排傳送或接收一個位元組資料,value 參數為所要傳送的位元組資料,傳回值為所接收的位元組資料。
格式
SPI.transfer(value)
範例
#include<SPI.h> //使用 SPI 函式庫 SPI.transfer(10); //傳送位元組資料 10
☛ setBitOrder() 函式
setBitOrder() 函式的功用是設定傳送或接收位元組的順序,order 參數有 LSBFIRST 及 MSBFIRST 兩種選擇:
⑴ LSBFIRST : 表示由最低有效位元開始移位。
⑵ MSBFIRST : 表示由最高有效位元開始移位。
預設值為 MSBFIRST,傳送或接收位元組的順序與所使用的周邊裝置有關。
格式
SPI.setBitOrder(order)
範例
#include<SPI.h> //使用 SPI 函式庫 SPI.setBitOrder(LSBFIRST); //由最低有效位元開始移位
☛ setClockDivider() 函式
setClockDivider() 函式的功用是設定傳送或接收的速率,divider 參數有 SPI_CLOCK_DIV2、SPI_CLOCK_DIV4、SPI_CLOCK_DIV8、SPI_CLOCK_DIV16、SPI_CLOCK_DIV32、SPI_CLOCK_DIV64 及 SPI_CLOCK_DIV128 等選擇。 預設為 SPI_CLOCK_DIV4,使用 1/4 倍系統頻率速度,如果系統頻率為 16MHz,則速率為 4MHz。 傳送或接收速率的設定與所使用的周邊裝置有關,SPI 裝置最大速率為 4MHz。
格式
SPI.setClockDivider(divider)
範例
#include<SPI.h> //使用 SPI 函式庫 SPI.setClockDivider(SPI_CLOCK_DIV8); //SPI 使用 2MHz 傳輸速率
☛ setDataMode() 函式
setDataMode() 函式的功用是設定傳送或接收脈波的極性與相位,mode 參數有 SPI_MODE0、SPI_MODE1、SPI_MODE2、SPI_MODE3 等四種傳輸模式可以選擇。 這些模式控制資料移入或移出時的脈波相位 ( 正緣或負緣 ),以及在 idle 狀態下的脈波極性 ( 高準位或過低準 )。 脈波的相位及極性選擇與所使用的周邊裝置有關。
格式
SPI.setDataMode(mode)
範例
#include<SPI.h> //使用 SPI 函式庫 SPI.setDataMode(SPI_MODE0); //選擇Mode0模式