亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  SPI協議并沒有我想的那么簡單

SPI協議并沒有我想的那么簡單

時間:2024-07-13

大家好,我是記得誠。

今天分享SPI協議相關的內容。

目錄

  • 前面的話

  • 目錄

  • 先說串口

  • SPI通訊協議

  • SPI特性

  • 模式編號

  • 多從機模式

  • 優缺點

  • 編程實現


先說串口

之前寫過一篇UART,通用串行異步通訊協議,感興趣可以參考一下《》;因為UART沒有時鐘信號,無法控制何時發送數據,也無法保證雙發按照完全相同的速度接收數據。因此,雙方以不同的速度進行數據接收和發送,就會出現問題。

如果要解決這個問題,UART為每個字節添加額外的起始位和停止位,以幫助接收器在數據到達時進行同步;

雙方還必須事先就傳輸速度達成共識(設置相同的波特率,例如每秒9600位)。

傳輸速率如果有微小差異不是問題,因為接收器會在每個字節的開頭重新同步。相應的協議如下圖所示;

串口傳輸的過程

如果您注意到上圖中的11001010不等于0x53,這是一個細節。串口協議通常會首先發送最低有效位,因此最小位在最左邊LSB。低四位字節實際上是0011 = 0x3,高四位字節是0101 = 0x5。

異步串行工作得很好,但是在每個字節發送的時候都需要額外的起始位和停止位以及在發送和接收數據所需的復雜硬件方面都有很多開銷。

不難發現,如果接收端和發送端設置的速度都不一致,那么接收到的數據將是垃圾(亂碼)。

下面開始講一下SPI協議,會有哪些優點。

SPI通訊協議

于是我們想有沒有更好一點的串行通訊方式;相比較于UART,SPI的工作方式略有不同。

SPI是一個同步的數據總線,也就是說它是用單獨的數據線和一個單獨的時鐘信號來保證發送端和接收端的完美同步。

時鐘是一個振蕩信號,它告訴接收端在確切的時機對數據線上的信號進行采樣。

產生時鐘的一側稱為主機,另一側稱為從機??偸侵挥幸粋€主機(一般來說可以是微控制器/MCU),但是可以有多個從機(后面詳細介紹);

數據的采集時機可能是時鐘信號的上升沿(從低到高)或下降沿(從高到低)。

具體要看對SPI的配置;

整體的傳輸大概可以分為以下幾個過程:

  • 主機先將NSS信號拉低,這樣保證開始接收數據;

  • 當接收端檢測到時鐘的邊沿信號時,它將立即讀取數據線上的信號,這樣就得到了一位數據(1bit);

    由于時鐘是隨數據一起發送的,因此指定數據的傳輸速度并不重要,盡管設備將具有可以運行的最高速度(稍后我們將討論選擇合適的時鐘邊沿和速度)。

  • 主機發送到從機時:主機產生相應的時鐘信號,然后數據一位一位地將從MOSI信號線上進行發送到從機;

  • 主機接收從機數據:如果從機需要將數據發送回主機,則主機將繼續生成預定數量的時鐘信號,并且從機會將數據通過MISO信號線發送;

具體如下圖所示;

SPI的時序

注意,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,SDOSO(在主機端);

  • MOSI也可以是SOMI,DIN,DISDISI(在主機端);

  • NSS也可以是CECSSSEL;

  • 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 ModeCPOLCPHA
0  [00]00
1  [01]01
2  [10]10
3  [11]11

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

多從機模式

前面說到SPI總線必須有一個主機,可以有多個從機,那么具體連接到SPI總線的方法有以下兩種:

第一種方法:多NSS

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

    多NSS連接

    第二種方法:菊花鏈

    在數字通信世界中,在設備信號(總線信號或中斷信號)以串行的方式從一 個設備依次傳到下一個設備,不斷循環直到數據到達目標設備的方式被稱為菊花鏈

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

    菊花鏈連接

    其中紅線加粗為數據的流向;

    所以最終的數據流向圖可以表示為:

    數據流圖

    SCK為時鐘信號,8clks表示8個邊沿信號;

    其中D為數據,X為無效數據;

    所以不難發現,菊花鏈模式充分使用了SPI其移位寄存器的功能,整個鏈充當通信移位寄存器,每個從機在下一個時鐘周期將輸入數據復制到輸出。

    優缺點

    SPI通訊的優勢

    使SPI作為串行通信接口脫穎而出的原因很多;

    • 全雙工串行通信;
    • 高速數據傳輸速率。
    • 簡單的軟件配置;
    • 極其靈活的數據傳輸,不限于8位,它可以是任意大小的字;
    • 非常簡單的硬件結構。從站不需要唯一地址(與I2C不同)。從機使用主機時鐘,不需要精密時鐘振蕩器/晶振(與UART不同)。不需要收發器(與CAN不同)。

    SPI的缺點

    • 沒有硬件從機應答信號(主機可能在不知情的情況下無處發送);
    • 通常僅支持一個主設備;
    • 需要更多的引腳(與I2C不同);
    • 沒有定義硬件級別的錯誤檢查協議;
    • 與RS-232和CAN總線相比,只能支持非常短的距離;

    編程實現

    下面是通過STM32的cubemx自動生成的HAL庫代碼,比較簡單,截取了其中一部分,具體如下;

    static void MX_SPI1_Init(void)
    {
        hspi1.Instance = SPI1;
        hspi1.Init.Mode = SPI_MODE_MASTER;    //主機模式
        hspi1.Init.Direction = SPI_DIRECTION_2LINES; //全雙工
        hspi1.Init.DataSize = SPI_DATASIZE_8BIT;  //數據位為8位
        hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;  //CPOL=0
        hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;   //CPHA為數據線的第一個變化沿
        hspi1.Init.NSS = SPI_NSS_SOFT;     //軟件控制NSS
        hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//2分頻,32M/2=16MHz
        hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;   //最高位先發送
        hspi1.Init.TIMode = SPI_TIMODE_DISABLE;   //TIMODE模式關閉
        hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//CRC關閉
        hspi1.Init.CRCPolynomial = 10;     //默認值,無效
        if (HAL_SPI_Init(&hspi1) != HAL_OK)    //初始化
        {
            _Error_Handler(__FILE__, __LINE__);
        }
    }
        
    //發送數據
    HAL_StatusTypeDef  
    HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, 
                     uint8_t *pData, 
                     uint16_t Size, 
                     uint32_t Timeout)
    ;
    //接收數據
    HAL_StatusTypeDef  
    HAL_SPI_Receive(SPI_HandleTypeDef *hspi, 
                    uint8_t *pData, 
                    uint16_t Size, 
                    uint32_t Timeout)
    ;

    希望對你有幫助,我們下一期見。



    推薦閱讀:


    亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
    亚洲欧美视频一区| 亚洲夜间福利| 亚洲国产黄色| 欧美一级精品大片| 欧美伦理91i| 欧美三区在线视频| 亚洲精品看片| 美女免费视频一区| 136国产福利精品导航网址| 一本色道久久综合亚洲精品按摩| 亚洲永久字幕| 国产精品igao视频网网址不卡日韩| 999亚洲国产精| 欧美成人有码| 亚洲精品国久久99热| 欧美成人亚洲| 一区二区电影免费在线观看| 国产精品扒开腿做爽爽爽软件| 亚洲一区二区av电影| 国产日韩欧美视频| 另类人畜视频在线| 宅男精品视频| 国产一区二区三区观看 | 欧美精品xxxxbbbb| 在线一区日本视频| 国产精品永久| 久久成人一区| 亚洲激情成人网| 欧美激情一区二区三区| 日韩一级精品视频在线观看| 久久精品夜色噜噜亚洲a∨| 欧美日韩色婷婷| 一区二区国产日产| 国产日韩欧美二区| 亚洲一区二区在线免费观看视频| 国产日韩欧美精品一区| 亚洲午夜在线| 欧美日韩成人网| 亚洲欧美综合精品久久成人| 国产精品丝袜xxxxxxx| 亚洲天堂免费在线观看视频| 韩日成人在线| 美女91精品| 亚洲精品影视| 一区二区三区在线高清| 欧美.com| 在线亚洲精品福利网址导航| 黄页网站一区| 欧美久久成人| 亚洲欧美日韩精品久久| 亚洲精品国产精品乱码不99 | 亚洲精品一区二区三区蜜桃久 | 亚洲成人资源网| 欧美不卡在线视频| 亚洲乱码一区二区| 欧美精品18+| 午夜精品久久久久久久久久久| 久久久久久久久久久久久久一区| 一区二区三区在线看| 欧美国产在线视频| 亚洲专区在线| 噜噜噜躁狠狠躁狠狠精品视频| 国产主播在线一区| 久久这里只有| 亚洲视频精品| 在线成人欧美| 亚洲高清视频在线观看| 欧美午夜不卡在线观看免费| 久久精品91| 久久国产精品一区二区三区| 欲色影视综合吧| 欧美视频成人| 国产精品理论片在线观看| 久久久夜色精品亚洲| 亚洲视频精品在线| 香蕉久久夜色| 一区二区三区高清在线| 亚洲第一福利视频| 在线免费观看成人网| 国产精品免费小视频| 牛人盗摄一区二区三区视频| 欧美波霸影院| 久久久久久久综合| 亚洲一级二级在线| 亚洲人人精品| 亚洲高清视频在线观看| 国产色婷婷国产综合在线理论片a| 久久久久国产精品一区三寸| 中文日韩在线| 日韩视频精品在线| 亚洲自拍三区| 亚洲欧美综合v| 亚洲愉拍自拍另类高清精品| 久久成人免费网| 99在线精品观看| 亚洲国产精品成人综合色在线婷婷| 亚洲精品中文字| 亚洲国产成人精品女人久久久| 亚洲精品国产视频| 亚洲国产欧美久久| 亚洲国产成人久久| 欧美精品偷拍| 亚洲一区二区三区在线观看视频| 国内精品99| 一区二区视频欧美| 国产精品亚洲综合一区在线观看| 欧美成人免费视频| 欧美了一区在线观看| 久久久久久久999| 一区二区欧美激情| 欧美在线视屏| 亚洲欧美日韩国产另类专区| 91久久精品日日躁夜夜躁国产| 日韩亚洲精品电影| 91久久精品国产91久久性色tv | 一本色道久久综合亚洲精品按摩 | 亚洲欧美国产另类| 99精品国产热久久91蜜凸| 亚洲欧美在线高清| 91久久国产自产拍夜夜嗨| 亚洲乱码国产乱码精品精| 欧美一区二区女人| 欧美一区二区在线免费观看| 99av国产精品欲麻豆| 久久久久久色| 蜜桃av一区二区| 午夜视频在线观看一区| 美女主播一区| 欧美国产第一页| 亚洲欧洲一区二区天堂久久| 亚洲天堂av在线免费| 国产在线精品成人一区二区三区| 欧美性猛交xxxx乱大交退制版| 蜜乳av另类精品一区二区| 美女视频网站黄色亚洲| 狠狠网亚洲精品| 久久成人久久爱| 国产精品大片| 国产精品播放| 在线播放国产一区中文字幕剧情欧美| 亚洲经典在线| 亚洲深夜福利在线| 中文高清一区| 亚洲欧美一级二级三级| 亚洲国产成人在线| 亚洲影音一区| 国产精品久久久久久久免费软件| 亚洲国内自拍| 亚洲精品一区在线| 亚洲视屏在线播放| 亚洲自拍另类| 美日韩精品视频| 国产精品三区www17con| 亚洲国产欧美一区二区三区同亚洲| 亚洲久久成人| 亚洲女人小视频在线观看| 久久爱另类一区二区小说| 欧美福利一区二区| 国产精品久久国产精麻豆99网站| 久久理论片午夜琪琪电影网| 欧美成人r级一区二区三区| 午夜精品久久久久久久久久久| 久久综合图片| 国产精品久久久久久模特| 最新国产成人在线观看| 香蕉久久夜色精品国产使用方法| 免费成人小视频| 国产视频综合在线| 国产精品你懂得| 99re在线精品| 欧美大片免费观看在线观看网站推荐 | 久久精品一区四区| 欧美久久久久免费| 一区二区自拍| 欧美中文在线免费| 久久aⅴ国产紧身牛仔裤| 久久天天躁夜夜躁狠狠躁2022| 欧美激情视频一区二区三区免费 | 久久久亚洲午夜电影| 欧美国产日韩精品免费观看| 国产精品劲爆视频| 国产精品一区二区久久精品| 中日韩视频在线观看| 看片网站欧美日韩| 国产精自产拍久久久久久蜜 | 极品尤物久久久av免费看| 久久免费视频在线| 国产专区综合网| 日韩视频在线一区| 精品动漫av| 免费黄网站欧美| 榴莲视频成人在线观看| 国产亚洲人成a一在线v站| 一本色道久久综合亚洲91| 欧美日韩亚洲激情| 亚洲午夜女主播在线直播| 欧美午夜精品久久久| 激情欧美丁香| 久久免费精品日本久久中文字幕| 国产在线成人|