SPI簡介:
SPI是串行外設接口(Serial Peripheral Interface)的縮寫。SPI,是一種高速的,全雙工,同步的通信總線,並且在芯片的管腳上只占用四根線,節約了芯片的管腳,同時為PCB的布局上節省空間,提供方便。
SPI的通信原理:
它以主從方式工作,這種模式通常有一個主設備和一個或多個從設備,需要至少4根線,事實上3根也可以(單向傳輸時)。也是所有基於SPI的設備共有的,它們是:
SCLK, Serial Clock, 主要的作用是 Master 設備往 Slave 設備傳輸時鍾信號, 控制數據交換的時機以及速率;
SS/CS, Slave Select/Chip Select, 用於 Master 設備片選 Slave 設備, 使被選中的 Slave 設備能夠被 Master 設備所訪問;
SDO/MOSI, Serial Data Output/Master Out Slave In, 在 Master 上面也被稱為 Tx-Channel, 作為數據的出口, 主要用於 SPI 設備發送數據;
SDI/MISO, Serial Data Input/Master In Slave Out, 在 Master 上面也被稱為 Rx-Channel, 作為數據的入口, 主要用於SPI 設備接收數據;
其中,CS是從芯片是否被主芯片選中的控制信號,也就是說只有片選信號為預先規定的使能信號時(高電位或低電位),主芯片對此從芯片的操作才有效。這就使在同一條總線上連接多個SPI設備成為可能。另外SPI沒有讀和寫的說法,因為實質上每次SPI是主從設備在交換數據。也就是說,你發一個數據必然會收到一個數據;你要收一個數據必須也要先發一個數據。
SPI通信模式:
有4種不同的模式,不同的從設備可能在出廠是就是配置為某種模式,這是不能改變的;但我們的通信雙方必須是工作在同一模式下,所以我們可以對我們的主設備的SPI模式進行配置,通過CPOL(時鍾極性)和CPHA(時鍾相位)來控制我們主設備的通信模式,具體如下:
Mode0:CPOL=0,CPHA=0
Mode1:CPOL=0,CPHA=1
Mode2:CPOL=1,CPHA=0
Mode3:CPOL=1,CPHA=1
時鍾極性CPOL是用來配置SCLK的電平出於哪種狀態時是空閑態或者有效態,時鍾相位CPHA
是用來配置數據采樣是在第幾個邊沿:
CPHA=0,表示第一個邊沿:
對於CPOL=0,閑時是低電平,第一個邊沿就是從低變到高,所以是上升沿;
對於CPOL=1,閑時的是高電平,第一個邊沿就是從高變到低,所以是下降沿;
CPHA=1,表示第二個邊沿:
對於CPOL=0,閑時是低電平,第二個邊沿就是從高變到低,所以是下降沿;
對於CPOL=1,閑時是高電平,第一個邊沿就是從低變到高,所以是上升沿;
另外SCLK信號線只由主設備控制,從設備不能控制信號線。同樣,在一個基於SPI的設備中,至少有一個主控設備。這樣傳輸的特點:這樣的傳輸方式有一個優點,與普通的串行通訊不同,普通的串行通訊一次連續傳送至少8位數據,而SPI允許數據一位一位的傳送,甚至允許暫停,因為SCLK時鍾線由主控設備控制,當沒有時鍾跳變時,從設備不采集或傳送數據。也就是說,主設備通過對SCLK時鍾線的控制可以完成對通訊的控制。SPI還是一個數據交換協議:因為SPI的數據輸入和輸出線獨立,所以允許同時完成數據的輸入和輸出。不同的SPI設備的實現方式不盡相同,主要是數據改變和采集的時間不同,在時鍾信號上沿或下沿采集有不同定義,具體請參考相關器件的文檔。最后,SPI接口的一個缺點:沒有指定的流控制,沒有應答機制確認是否接收到數據。
基於ESP8266的SPI通訊測試:
硬件接口:
| Signal | Slave | Master |
| ------------------- | ----------- | ---------- |
| SCLK | GPIO14 | GPIO14 |
| MISO | GPIO12 | GPIO12 |
| MOSI | GPIO13 | GPIO13 |
| CS | GPIO15 | GPIO15 |
| HANDSHARK | GPIO4 | GPIO4 |
| GND | GND | GND |
利用官方提供的例子,准備兩個ESP8266芯片,一個燒錄主機程序,一個燒錄從機程序:
對數據進行監視:
完成ESP8266的SPI通訊測試。