SPI通信協議詳解(二)


SPI是一個同步的數據總線,也就是說它是用單獨的數據線和一個單獨的時鍾信號來保證發送端和接收端的完美同步。
時鍾是一個振盪信號,它告訴接收端在確切的時機對數據線上的信號進行采樣。
產生時鍾的一側稱為主機,另一側稱為從機。總是只有一個主機(一般來說可以是微控制器/MCU),但是可以有多個從機(后面詳細介紹);
數據的采集時機可能是時鍾信號的上升沿(從低到高)或下降沿(從高到低)。

整體的傳輸大概可以分為以下幾個過程:
1.主機先將NSS信號拉低,這樣保證開始接收數據;
2.當接收端檢測到時鍾的邊沿信號時,它將立即讀取數據線上的信號,這樣就得到了一位數據(1bit);
由於時鍾是隨數據一起發送的,因此指定數據的傳輸速度並不重要,盡管設備將具有可以運行的最高速度(稍后我們將討論選擇合適的時鍾邊沿和速度)。
3.主機發送到從機時:主機產生相應的時鍾信號,然后數據一位一位地將從MOSI信號線上進行發送到從機;
4.主機接收從機數據:如果從機需要將數據發送回主機,則主機將繼續生成預定數量的時鍾信號,並且從機會將數據通過MISO信號線發送;

注意,SPI是“全雙工”(具有單獨的發送和接收線路),因此可以在同一時間發送和接收數據,另外SPI的接收硬件可以是一個簡單的移位寄存器。這比異步串行通信所需的完整UART要簡單得多,並且更加便宜。

SPI特性
SPI總線包括4條邏輯線,定義如下:
MISO:Master input slave output 主機輸入,從機輸出(數據來自從機);
MOSI:Master output slave input 主機輸出,從機輸入(數據來自主機);
SCLK :Serial Clock 串行時鍾信號,由主機產生發送給從機;
SS:Slave Select 片選信號,由主機發送,以控制與哪個從機通信,通常是低電平有效信號。
其他制造商可能會遵循其他命名規則,但是最終他們指的相同的含義。以下是一些常用術語;
MISO也可以是SIMO,DOUT,DO,SDO或SO(在主機端);
MOSI也可以是SOMI,DIN,DI,SDI或SI(在主機端);
NSS也可以是CE,CS或SSEL;
SCLK也可以是SCK;

本文將按照以下命名進行講解[MISO, MOSI, SCK,NSS]
下圖顯示了單個主機和單個從機之間的典型SPI連接。

時鍾頻率
SPI總線上的主機必須在通信開始時候配置並生成相應的時鍾信號。在每個SPI時鍾周期內,都會發生全雙工數據傳輸。
主機在MOSI線上發送一位數據,從機讀取它,而從機在MISO線上發送一位數據,主機讀取它。
就算只進行單向的數據傳輸,也要保持這樣的順序。這就意味着無論接收任何數據,必須實際發送一些東西!在這種情況下,我們稱其為虛擬數據;
從理論上講,只要實際可行,時鍾速率就可以是您想要的任何速率,當然這個速率受限於每個系統能提供多大的系統時鍾頻率,以及最大的SPI傳輸速率。

時鍾極性 CKP/Clock Polarity
除了配置串行時鍾速率(頻率)外,SPI主設備還需要配置時鍾極性。
根據硬件制造商的命名規則不同,時鍾極性通常寫為CKP或CPOL。時鍾極性和相位共同決定讀取數據的方式,比如信號上升沿讀取數據還是信號下降沿讀取數據;
CKP可以配置為1或0。這意味着您可以根據需要將時鍾的默認狀態(IDLE)設置為高或低。極性反轉可以通過簡單的邏輯逆變器實現。您必須參考設備的數據手冊才能正確設置CKP和CKE。
CKP = 0:時鍾空閑IDLE為低電平0;
CKP = 1:時鍾空閑IDLE為高電平1;

時鍾相位 CKE /Clock Phase (Edge)
除配置串行時鍾速率和極性外,SPI主設備還應配置時鍾相位(或邊沿)。根據硬件制造商的不同,時鍾相位通常寫為CKE或CPHA;
顧名思義,時鍾相位/邊沿,也就是采集數據時是在時鍾信號的具體相位或者邊沿;
CKE = 0:在時鍾信號SCK的第一個跳變沿采樣;
CKE = 1:在時鍾信號SCK的第二個跳變沿采樣;

時鍾配置總結
綜上幾種情況,下圖總結了所有時鍾配置組合,並突出顯示了實際采樣數據的時刻;
其中黑色線為采樣數據的時刻;藍色線為SCK時鍾信號;
具體如下圖所示;

模式編號
SPI的時鍾極性和相位的配置通常稱為SPI模式,所有可能的模式都遵循以下約定;具體如下表所示;

除此之外,我們還應該仔細檢查微控制器數據手冊中包含的模式表,以確保一切正常。

多從機模式
前面說到SPI總線必須有一個主機,可以有多個從機,那么具體連接到SPI總線的方法有以下兩種:
第一種方法:多NSS
通常,每個從機都需要一條單獨的SS線。
如果要和特定的從機進行通訊,可以將相應的NSS信號線拉低,並保持其他NSS信號線的狀態為高電平;如果同時將兩個NSS信號線拉低,則可能會出現亂碼,因為從機可能都試圖在同一條MISO線上傳輸數據,最終導致接收數據亂碼。
具體連接方式如下圖所示;

第二種方法:菊花鏈
在數字通信世界中,在設備信號(總線信號或中斷信號)以串行的方式從一 個設備依次傳到下一個設備,不斷循環直到數據到達目標設備的方式被稱為菊花鏈。
菊花鏈的最大缺點是因為是信號串行傳輸,所以一旦數據鏈路中的某設備發生故障的時候,它下面優先級較低的設備就不可能得到服務了;
另一方面,距離主機越遠的從機,獲得服務的優先級越低,所以需要安排好從機的優先級,並且設置總線檢測器,如果某個從機超時,則對該從機進行短路,防止單個從機損壞造成整個鏈路崩潰的情況;
具體的連接如下圖所示;

其中紅線加粗為數據的流向;
所以最終的數據流向圖可以表示為:

SCK為時鍾信號,8clks表示8個邊沿信號;
其中D為數據,X為無效數據;
所以不難發現,菊花鏈模式充分使用了SPI其移位寄存器的功能,整個鏈充當通信移位寄存器,每個從機在下一個時鍾周期將輸入數據復制到輸出。

SPI的優點
1.全雙工串行通信;
2.高速數據傳輸速率。
3.簡單的軟件配置;
4.極其靈活的數據傳輸,不限於8位,它可以是任意大小的字;
5.非常簡單的硬件結構。從站不需要唯一地址(與I2C不同)。從機使用主機時鍾,不需要精密時鍾振盪器/晶振(與UART不同)。不需要收發器(與CAN不同)。
SPI的缺點
1.沒有硬件從機應答信號(主機可能在不知情的情況下無處發送);
2.通常僅支持一個主設備;
3.需要更多的引腳(與I2C不同);
4.沒有定義硬件級別的錯誤檢查協議;
5.與RS-232和CAN總線相比,只能支持非常短的距離;

原文地址:https://zhuanlan.zhihu.com/p/290620901


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM