一 什么是SPI接口?
SPI是一種高速、高效率的串行接口技術。通常由一個主模塊和一個或多個從模塊組成,主模塊選擇一個從模塊進行同步通信,從而完成數據的交換。SPI是一個環形結構,通信時需要至少4根線(事實上在單向傳輸時3根線也可以)
。SPI的通信原理很簡單,它以主從方式工作,這種模式通常有一個主設備和一個或多個從設備,需要至少4根線,事實上3根也可以(單向傳輸時)。也是所有基於SPI的設備共有的,它們是MISO(主設備數據輸入)、MOSI(主設備數據輸出)、SCLK(時鍾)、CS(片選)。
(1)MISO– Master Input Slave Output,主設備數據輸入,從設備數據輸出;
(2)MOSI– Master Output Slave Input,主設備數據輸出,從設備數據輸入;
(3)SCLK – Serial Clock,時鍾信號,由主設備產生;
(4)CS – Chip Select,從設備使能信號,由主設備控制。
其中,CS是從芯片是否被主芯片選中的控制信號,也就是說只有片選信號為預先規定的使能信號時(高電位或低電位),主芯片對此從芯片的操作才有效。這就使在同一條總線上連接多個SPI設備成為可能。
接下來就負責通訊的3根線了。通訊是通過數據交換完成的,這里先要知道SPI是串行通訊協議,也就是說數據是一位一位的傳輸的。這就是SCLK時鍾線存在的原因,由SCLK提供時鍾脈沖,SDI,SDO則基於此脈沖完成數據傳輸。數據輸出通過 SDO線,數據在時鍾上升沿或下降沿時改變,在緊接着的下降沿或上升沿被讀取。完成一位數據傳輸,輸入也使用同樣原理。因此,至少需要8次時鍾信號的改變(上沿和下沿為一次),才能完成8位數據的傳輸。
SCLK信號線只由主設備控制,從設備不能控制信號線。同樣,在一個基於SPI的設備中,至少有一個主控設備。這樣傳輸的特點:這樣的傳輸方式有一個優點,與普通的串行通訊不同,普通的串行通訊一次連續傳送至少8位數據,而SPI允許數據一位一位的傳送,甚至允許暫停,因為SCLK時鍾線由主控設備控制,當沒有時鍾跳變時,從設備不采集或傳送數據。也就是說,主設備通過對SCLK時鍾線的控制可以完成對通訊的控制。SPI還是一個數據交換協議:因為SPI的數據輸入和輸出線獨立,所以允許同時完成數據的輸入和輸出。不同的SPI設備的實現方式不盡相同,主要是數據改變和采集的時間不同,在時鍾信號上沿或下沿采集有不同定義,具體請參考相關器件的文檔。
最后,SPI接口的一個缺點:沒有指定的流控制,沒有應答機制確認是否接收到數據。
二 硬件接口
ESP8266對SPI支持的特別好,可以支持HSPI,也就是高速SPI,最高速率可達80M。這個數據,直接碾壓stm32 f407了。
它占用的pin腳如下所示:
這里面有6個管教,其實,正常使用的時候,一般需要前4個即可工作,單向的話三個就行了。
三 工作流程
根據官方提供的例子,我分析了一下他們的工作流程:具工作流程如下所示:
A 首先SPI的硬件相關接口配置:
spi_init
B 其次,是SPI的傳輸控制配置,這里的配置主要是地址位和cmd
函數:
spi_trans(HSPI_HOST, trans);
C 數據讀寫:這里的數據讀寫使用了兩個線程,保證兩個互不干擾,非常的nice.
// create spi_slave_write_master_task xTaskCreate(spi_slave_write_master_task, "spi_slave_write_master_task", 2048, NULL, 10, NULL); // create spi_slave_read_master_task xTaskCreate(spi_slave_read_master_task, "spi_slave_read_master_task", 2048, NULL, 10, NULL);
我這個是以slave模式為例子的,master的配置要稍微復雜一些。有興趣的同學可以做一下分析。