博客專欄

        EEPW首頁 > 博客 > 一文搞懂SPI通信協議

        一文搞懂SPI通信協議

        發布人:美男子玩編程 時間:2022-06-22 來源:工程師 發布文章

        1


        簡介


        SPI是串行外設接口(Serial Peripheral Interface)的縮寫,是美國摩托羅拉公司(Motorola)最先推出的一種同步串行傳輸規范,也是一種單片機外設芯片串行擴展接口,是一種高速、全雙工、同步通信總線,所以可以在同一時間發送和接收數據,SPI沒有定義速度限制,通常能達到甚至超過10M/bps。


        SPI有主、從兩種模式,通常由一個主模塊和一個或多個從模塊組成(SPI不支持多主機),主模塊選擇一個從模塊進行同步通信,從而完成數據的交換。提供時鐘的為主設備(Master),接收時鐘的設備為從設備(Slave),SPI接口的讀寫操作,都是由主設備發起,當存在多個從設備時,通過各自的片選信號進行管理。


        SPI通信原理很簡單,需要至少4根線,單向傳輸時3根線,它們是MISO(主設備數據輸入)、MOSI(主設備數據輸出)、SCLK(時鐘)和CS/SS(片選):

        • MISO( Master Input Slave Output):主設備數據輸入,從設備數據輸出;

        • MOSI(Master Output Slave Input):主設備數據輸出,從設備數據輸入;

        • SCLK(Serial Clock):時鐘信號,由主設備產生;

        • CS/SS(Chip Select/Slave Select):從設備使能信號,由主設備控制,一主多從時,CS/SS是從芯片是否被主芯片選中的控制信號,只有片選信號為預先規定的使能信號時(高電位或低電位),主芯片對此從芯片的操作才有效。


        圖片

        一主設備一從設備模式

        圖片

        一主設備多從設備模式



        2


        通信原理


        SPI主設備和從設備都有一個串行移位寄存器,主設備通過向它的SPI串行寄存器寫入一個字節來發起一次傳輸。


        圖片

        SPI數據通信的流程可以分為以下幾步:

        1、主設備發起信號,將CS/SS拉低,啟動通信。

        2、主設備通過發送時鐘信號,來告訴從設備進行寫數據或者讀數據操作(采集時機可能是時鐘信號的上升沿(從低到高)或下降沿(從高到低),因為SPI有四種模式,后面會講到),它將立即讀取數據線上的信號,這樣就得到了一位數據(1bit)。

        3、主機(Master)將要發送的數據寫到發送數據緩存區(Menory),緩存區經過移位寄存器(緩存長度不一定,看單片機配置),串行移位寄存器通過MOSI信號線將字節一位一位的移出去傳送給從機,同時MISO接口接收到的數據經過移位寄存器一位一位的移到接收緩存區。

        4、從機(Slave)也將自己的串行移位寄存器(緩存長度不一定,看單片機配置)中的內容通過MISO信號線返回給主機。同時通過MOSI信號線接收主機發送的數據,這樣,兩個移位寄存器中的內容就被交換。


        例如,下圖示例中簡單模擬SPI通信流程,主機拉低NSS片選信號,啟動通信,并且產生時鐘信號,上升沿觸發邊沿信號,主機在MOSI線路一位一位發送數據0X53,在MISO線路一位一位接收數據0X46,如下圖所示:


        圖片

        這里有一點需要著重說明一下:SPI只有主模式和從模式之分,沒有讀和寫的說法,外設的寫操作和讀操作是同步完成的。若只進行寫操作,主機只需忽略接收到的字節(虛擬數據);反之,若主機要讀取從機的一個字節,就必須發送一個空字節來引發從機的傳輸。也就是說,你發一個數據必然會收到一個數據;你要收一個數據必須也要先發一個數據。




        3


        通信特性


        3.1、設備選擇


        SPI是單主設備(Single Master)通信協議,只有一支主設備能發起通信,當SPI主設備想讀/寫從設備時,它首先拉低從設備對應的SS線(SS是低電平有效)。接著開始發送工作脈沖到時鐘線上,在相應的脈沖時間上,主設備把信號發到MOSI實現“寫”,同時可對MISO采樣而實現“讀”。如下圖所示:


        圖片


        3.2、設備時鐘


        SPI時鐘特點主要包括:時鐘速率、時鐘極性和時鐘相位三方面。


        3.2.1、時鐘速率


        SPI總線上的主設備必須在通信開始時候配置并生成相應的時鐘信號。從理論上講,只要實際可行,時鐘速率就可以是你想要的任何速率,當然這個速率受限于每個系統能提供多大的系統時鐘頻率,以及最大的SPI傳輸速率。


        3.2.2、時鐘極性


        根據硬件制造商的命名規則不同,時鐘極性通常寫為CKP或CPOL。時鐘極性和相位共同決定讀取數據的方式,比如信號上升沿讀取數據還是信號下降沿讀取數據。

        CKP可以配置為1或0。


        這意味著你可以根據需要將時鐘的默認狀態(IDLE)設置為高或低。極性反轉可以通過簡單的邏輯逆變器實現。你必須參考設備的數據手冊才能正確設置CKP和CKE。

        • CKP = 0:時鐘空閑IDLE為低電平 0;

        • CKP = 1:時鐘空閑IDLE為高電平1。


        3.2.3、時鐘相位


        根據硬件制造商的不同,時鐘相位通常寫為CKE或CPHA。顧名思義,時鐘相位/邊沿,也就是采集數據時是在時鐘信號的具體相位或者邊沿。

        • CKE = 0:在時鐘信號SCK的第一個跳變沿采樣;

        • CKE = 1:在時鐘信號SCK的第二個跳變沿采樣。


        3.3、四種模式


        根據SPI的時鐘極性和時鐘相位特性可以設置4種不同的SPI通信操作模式,它們的區別是定義了在時鐘脈沖的哪條邊沿轉換(toggles)輸出信號,哪條邊沿采樣輸入信號,還有時鐘脈沖的穩定電平值(就是時鐘信號無效時是高還是低),詳情如下所示:

        • Mode0:CKP=0,CKE =0:當空閑態時,SCK處于低電平,數據采樣是在第1個邊沿,也就是SCK由低電平到高電平的跳變,所以數據采樣是在上升沿(準備數據),(發送數據)數據發送是在下降沿。

        • Mode1:CKP=0,CKE=1:當空閑態時,SCK處于低電平,數據發送是在第2個邊沿,也就是SCK由低電平到高電平的跳變,所以數據采樣是在下降沿,數據發送是在上升沿。

        • Mode2:CKP=1,CKE=0:當空閑態時,SCK處于高電平,數據采集是在第1個邊沿,也就是SCK由高電平到低電平的跳變,所以數據采集是在下降沿,數據發送是在上升沿。

        • Mode3:CKP=1,CKE=1:當空閑態時,SCK處于高電平,數據發送是在第2個邊沿,也就是SCK由高電平到低電平的跳變,所以數據采集是在上升沿,數據發送是在下降沿。


        圖片

        黑線為采樣數據的時刻,藍線為SCK時鐘信號


        舉個例子,下圖是SPI Mode0讀/寫時序,可以看出SCK空閑狀態為低電平,主機數據在第一個跳變沿被從機采樣,數據輸出同理。


        圖片


        下圖是SPI Mode3讀/寫時序,SCK空閑狀態為高電平,主機數據在第二個跳變沿被從機采樣,數據輸出同理。


        圖片



        4


        多從機模式


        有兩種方法可以將多個從設備連接到主設備:多片選和菊花鏈。


        通常,每個從機都需要一條單獨的SS線。如果要和特定的從機進行通訊,可以將相應的NSS信號線拉低,并保持其他SS信號線的狀態為高電平;如果同時將兩個SS信號線拉低,則可能會出現亂碼,因為從機可能都試圖在同一條MISO線上傳輸數據,最終導致接收數據亂碼。


        圖片


        菊花鏈的最大缺點是信號串行傳輸,一旦數據鏈路中的某設備發生故障的時候,它下面優先級較低的設備就不可能得到服務了。另一方面,距離主機越遠的從機,獲得服務的優先級越低,所以需要安排好從機的優先級,并且設置總線檢測器,如果某個從機超時,則對該從機進行短路,防止單個從機損壞造成整個鏈路崩潰的情況。


        圖片

        5


        SPI優缺點


        優點


        1. 無起始位和停止位,因此數據位可以連續傳輸而不會被中斷;

        2. 沒有像I2C這樣復雜的從設備尋址系統;

        3. 數據傳輸速率比I2C更高(幾乎快兩倍);

        4. 分離的MISO和MOSI信號線,因此可以同時發送和接收數據;

        5. 極其靈活的數據傳輸,不限于8位,它可以是任意大小的字;

        6. 非常簡單的硬件結構。從站不需要唯一地址(與I2C不同)。從機使用主機時鐘,不需要精密時鐘振蕩器/晶振(與UART不同)。不需要收發器(與CAN不同)。


        缺點

        1. 使用四根信號線(I2C和UART使用兩根信號線);

        2. 無法確認是否已成功接收數據(I2C擁有此功能);

        3. 沒有任何形式的錯誤檢查,如UART中的奇偶校驗位;

        4. 只允許一個主設備;

        5. 沒有硬件從機應答信號(主機可能在不知情的情況下無處發送);

        6. 沒有定義硬件級別的錯誤檢查協議;

        7. 與RS-232和CAN總線相比,只能支持非常短的距離;



        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: SPI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 大冶市| 苏尼特右旗| 丹巴县| 夹江县| 长宁县| 徐汇区| 沾化县| 东兰县| 富平县| 林芝县| 财经| 军事| 大连市| 南宫市| 万全县| 轮台县| 运城市| 高陵县| 广水市| 阳西县| 横峰县| 大港区| 金阳县| 邵武市| 三都| 曲靖市| 京山县| 正蓝旗| 县级市| 灵山县| 朔州市| 云霄县| 普定县| 墨玉县| 潜山县| 淮南市| 宜春市| 开平市| 永州市| 安顺市| 罗江县|