- 創客機器人實戰:基于Arduino和樹莓派
- 何福貴等編著
- 1515字
- 2020-10-23 14:26:24
4.9 Arduino SPI
串行外設接口(Serial Peripheral Interface,SPI)是一種高速的、全雙工、同步的通信總線,并且在芯片的管腳上只占用4根線,節約了芯片的管腳,同時為PCB的布局節省空間,提供方便。
SPI的通信原理很簡單,它以主從方式工作,這種模式通常有一個主設備和一個或多個從設備,需要至少4根線,事實上3根也可以(單向傳輸時)。
(1)MOSI(Master In Slave Out):主器件數據輸出,從器件數據輸入。
(2)MISO(Master Out Slave In):主器件數據輸入,從器件數據輸出。
(3)SCK(Serial Clock):時鐘信號,由主器件產生,最大為fPCLK/2,從模式頻率最大為fCPU/2。
(4)SS:從器件使能信號,由主器件控制,有的IC會標注為CS(Chip Select)。
其中,SS是控制芯片是否被選中的,也就是說,只有片選信號為預先規定的使能信號時(高電位或低電位),對此芯片的操作才有效。這就允許在同一總線上連接多個SPI設備成為可能。
Arduino開發板ICSP接口中包含MOSI、MISO、SCK為SPI接口,如圖4-4所示,有的開發板D11、D12、D13管腳默認和SPI接口連接(如UNO PLUS)。

圖4-4 Arduino UNO開發板ICSP
不同的Arduino開發板的SPI引腳如表4-1所示。
表4-1 不同的Arduino開發板的SPI引腳

注意:MOSI、MISO、SCK的使用必須與ICSP的物理位置一致才有效。
Arduino IDE自帶的SPI例程,在Arduino IDE的菜單中選擇“文件”>“示例”>“SPI”>“DigitalPotControl”命令,打開工程,如圖4-5所示。
這個例程介紹如何使用串行外設接口(SPI)來控制AD5206數字電位器,當需要用電而不是用手來改變電路中的電阻時,數字電位器是有用的。示例應用包括LED調光、音頻信號調節和音頻生成。在這個例子中,將使用一個6通道的數字電位器來控制6個LED的亮度。

圖4-5 Arduino自帶的SPI例程
AD5206是一個6通道數字電位器。這就意味著有6個可變電阻(電位器)內置在個人電子控制。有6個內部可變電阻的三引腳芯片,獨特的可變電阻引腳標記為Ax,Bx和Wx,即A1、B1和W1。例如,在本教程中,我們將用每個可變電阻作為一個電壓分壓器,把一個引腳(引腳B)拉高,另一側引腳(引腳A)拉低,并采取可變電壓輸出的中心引腳(Wiper)。在這種情況下,該AD5206提供一個最大值10000歐姆的電阻,分為255個等級(255是最大,0最?。?。
例程的接線圖如圖4-6所示。

圖4-6 例程的接線圖
例程的代碼如下:


程序先引入SPI頭文件SPI.h。SPI接口包含MOSI、MISO、SCK、CS四根線。其中MOSI、MISO、SCK已經固定引腳。而CS為片選引腳,可隨意選擇某個引腳作為CS。程序中const int slaveSelectPin=10,定義D10作為片選信號。
程序先引入SPI頭文件SPI.h。SPI接口包含MOSI、MISO、SCK、CS四根線。其中MOSI、MISO、SCK已經固定引腳。而CS為片選引腳,可隨意選擇哪個引腳作為CS。程序中const int slaveSelectPin=10,定義D10作為片選信號。
setup()函數調用SPI.begin()初始化SPI接口。此處為默認設置。若要設置具體參數可使用如下語句初始化SPI:

SPISettings()函數設置SPI傳輸模式,SPI.beginTransaction()函數根據SPISettings()初始化SPI。
此處設置SPI速率為14MHz,高位先傳輸,模式0。
傳輸SPI前先拉低片選管腳,使能SPI設備,語句如下:

使用SPI傳輸函數,參數val為要發送的字節,函數返回值為接收到的數據,語句如下:

SPI傳輸結束后釋放片選管腳,語句如下:

Arduino開發板也可以通過SPI接口讀寫存儲模塊,例如Micro SD卡,讀寫Micro SD卡模塊如圖4-7所示。

圖4-7 Micro SD卡SPI接口讀寫模塊
TF卡模塊使用SPI總線連接方式實現與Arduino控制器的通信,穩壓芯片輸出的3.3V為電平轉換芯片、Micro SD卡進行供電,電平轉換電路往Micro SD卡方向的信號轉換成3.3V,Micro SD卡往控制接口方向的MISO信號也轉換成了3.3V,一般AVR單片機系統都可以讀取該信號,產品使用自彈式卡座,方便卡的插拔。
注意:Arduino的sd.h庫文件目前對2GB及其以下的支持比較好,對2GB以上的支持不好,所以在使用時,建議選用2GB或以下的內存卡。
TF卡模塊共引出6個引腳,其中DO、CK、DI是SPI總線接口,“+”為電源正,“-”為電源GND,CS為片選端,實際使用時按照下面的接線圖連接即可,使用Arduino IDE自帶的例子程序就可以進行測試。
連接示意圖如圖4-8所示。

圖4-8 SPI總線讀寫存儲模塊Micro SD卡連接示意圖