SPI 是英語Serial Peripheral interface的縮寫,顧名思義就是串行外圍設(shè)備接口。是Motorola(摩托羅拉)首先在其MC68HCXX系列處理器上定義的。SPI是一種單主機、高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時為PCB的布局上節(jié)省空間,提供方便,主要應用在 EEPROM,F(xiàn)LASH,實時時鐘,AD轉(zhuǎn)換器,還有數(shù)字信號處理器和數(shù)字信號解碼器之間。SPI分為主、從兩種模式,一個SPI通訊系統(tǒng)需要包含一個(且只能是一個)主設(shè)備,一個或多個從設(shè)備。提供時鐘的為主設(shè)備(Master),接收時鐘的設(shè)備為從設(shè)備(Slave),SPI接口的讀寫操作,都是由主設(shè)備發(fā)起。當存在多個從設(shè)備時,通過各自的片選信號進行管理。 SPI是全雙工且SPI沒有定義速度限制,一般的實現(xiàn)通常能達到甚至超過10 Mbps
SPI 接口一般使用 4 條線通信:
MISO 主設(shè)備數(shù)據(jù)輸入,從設(shè)備數(shù)據(jù)輸出。
MOSI 主設(shè)備數(shù)據(jù)輸出,從設(shè)備數(shù)據(jù)輸入。
SCLK 時鐘信號,由主設(shè)備產(chǎn)生。
CS 從設(shè)備片選信號,由主設(shè)備控制。
SPI允許至少有一個主機,一般都是一個主機多個從機,當只有一個從機時:
這站圖來自于STM32參考手冊,這個應該是STM雙機通訊的接線,而且主機從機都工作在硬件模式(對于雙擊通訊不太懂),一會兒再聊移位寄存器的原理,現(xiàn)在先看個大概接法。
當有多個從機時,每個從機單獨接一個片選信號:
這個圖片很好的描述了主設(shè)備與多個從設(shè)備的接線
STM32中的SPI_CR寄存器的CPOL和CPHA位,能夠組合成四種可能的時序關(guān)系。
CPOL=0:SCLK=0時處于空閑態(tài);CPOL=1:SCLK=1時處于空閑態(tài);
CPHA=0:數(shù)據(jù)采樣在第1個邊沿;CPHA=1:數(shù)據(jù)采樣在第2個邊沿。
CPOL與CPHA各有兩種狀態(tài),所以可以組成四種不同的工作方式。
為了能讓主機與從機正常通訊,主機與從機應當設(shè)置為相同的模式,一般從機是出場就固定好的(一般在手冊的SPECIFICATIONS->
TIMING CHARACTERISTICS中說明 ),我們要做的就是在SPI初始化時設(shè)置成與從機相同的工作方式。至于他不同模式時的時序圖,一百度就能搜到,我覺得也不是重點,重點是你能在手冊找到從機是哪種工作方式。
SPI的三種模式
SPI工作在3中模式下,分別是運行、等待和停止。
運行模式(Run Mode)
這是基本的操作模式
等待模式(Wait Mode)
SPI工作在等待模式是一種可配置的低功耗模式,可以通過SPICR2寄存器的SPISWAI位進行控制。在等待模式下,如果SPISWAI位清0,SPI操作類似于運行模式。如果SPISWAI位置1,SPI進入低功耗狀態(tài),并且SPI時鐘將關(guān)閉。如果SPI配置為主機,所有的傳輸將停止,但是會在CPU進入運行模式后重新開始。如果SPI配置為從機,會繼續(xù)接收和傳輸一個字節(jié),這樣就保證從機與主機同步。
停止模式(Stop Mode)
為了降低功耗,SPI在停止模式是不活躍的。如果SPI配置為主機,正在進行的傳輸會停止,但是在CPU進入運行模式后會重新開始。如果SPI配置為從機,會繼續(xù)接受和發(fā)送一個字節(jié),這樣就保證了從機與主機同步
SPI通訊的優(yōu)勢
· 全雙工串行通信;
· 高速數(shù)據(jù)傳輸速率。
· 簡單的軟件配置;
· 極其靈活的數(shù)據(jù)傳輸,不限于8位,它可以是任意大小的字;
· 非常簡單的硬件結(jié)構(gòu)。從站不需要唯一地址(與I2C不同)。從機使用主機時鐘,不需要精密時鐘振蕩器/晶振(與UART不同)。不需要收發(fā)器(與CAN不同)。
SPI的缺點
· 沒有硬件從機應答信號(主機可能在不知情的情況下無處發(fā)送);
· 通常僅支持一個主設(shè)備;
· 需要更多的引腳(與I2C不同);
· 沒有定義硬件級別的錯誤檢查協(xié)議;
· 與RS-232和CAN總線相比,只能支持非常短的距離;