原來SPI並沒有我想的那麼簡單

2021-01-20 單片機與嵌入式
目錄

前面的話

目錄

先說串口

SPI通訊協議

SPI特性

模式編號

多從機模式

優缺點

編程實現


先說串口

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

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

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

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

串口傳輸的過程

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

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

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

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

SPI通訊協議

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

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

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

產生時鐘的一側稱為主機,另一側稱為從機。總是只有一個主機(一般來說可以是微控制器/MCU),但是可以有多個從機(後面詳細介紹);

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

具體要看對SPI的配置;

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

接收端檢測到時鐘的邊沿信號時,它將立即讀取數據線上的信號,這樣就得到了一位數據(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,SDO或SO(在主機端);

MOSI也可以是SOMI,DIN,DI,SDI或SI(在主機端);

本文將按照以下命名進行講解[MISO, MOSI, SCK,NSS]

下圖顯示了單個主機和單個從機之間的典型SPI連接。

主從連接時鐘頻率

SPI總線上的主機必須在通信開始時候配置並生成相應的時鐘信號。在每個SPI時鐘周期內,都會發生全雙工數據傳輸

主機在MOSI線上發送一位數據,從機讀取它,而從機在MISO線上發送一位數據,主機讀取它。

就算只進行單向的數據傳輸,也要保持這樣的順序。這就意味著無論接收任何數據,必須實際發送一些東西!在這種情況下,我們稱其為虛擬數據;

從理論上講,只要實際可行,時鐘速率就可以是您想要的任何速率,當然這個速率受限於每個系統能提供多大的系統時鐘頻率,以及最大的SPI傳輸速率。

時鐘極性 CKP/Clock Polarity

除了配置串行時鐘速率(頻率)外,SPI主設備還需要配置時鐘極性

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

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

時鐘相位 CKE /Clock Phase (Edge)

除配置串行時鐘速率和極性外,SPI主設備還應配置時鐘相位(或邊沿)。根據硬體製造商的不同,時鐘相位通常寫為CKECPHA

顧名思義,時鐘相位/邊沿,也就是採集數據時是在時鐘信號的具體相位或者邊沿;

CKE = 0:在時鐘信號SCK的第一個跳變沿採樣;CKE = 1:在時鐘信號SCK的第二個跳變沿採樣;時鐘配置總結

綜上幾種情況,下圖總結了所有時鐘配置組合,並突出顯示了實際採樣數據的時刻;

其中黑色線為採樣數據的時刻;

藍色線為SCK時鐘信號;

具體如下圖所示;

模式編號

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

SPI ModeCPOLCPHA0  [00]001  [01]012  [10]103  [11]11

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

多從機模式

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

第一種方法:多NSS

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

具體連接方式如下圖所示;

多NSS連接

第二種方法:菊花鏈

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

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

具體的連接如下圖所示;

菊花鏈連接

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

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

數據流圖

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

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

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

優缺點SPI通訊的優勢

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

極其靈活的數據傳輸,不限於8位,它可以是任意大小的字;非常簡單的硬體結構。從站不需要唯一地址(與I2C不同)。從機使用主機時鐘,不需要精密時鐘振蕩器/晶振(與UART不同)。不需要收發器(與CAN不同)。SPI的缺點沒有硬體從機應答信號(主機可能在不知情的情況下無處發送);與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);

相關焦點

  • 《泰拉瑞亞》大師模式的親身感受,原來沒有我想的那麼簡單
    本人玩泰拉瑞亞的1.3版本也有一年時間了,技術不怎麼行,後來聽說泰拉瑞亞1.4版本要出大師模式的時候,我就心想,我能過大師模式嗎?我這技術?其他的boss倒沒什麼怕的,也就怕那個新boss光明女皇和月總這兩個。
  • 泰拉瑞亞大師模式的親身感受,原來沒有我想的那麼簡單
    本人玩泰拉瑞亞的1.3版本也有一年時間了,技術不怎麼行,後來聽說泰拉瑞亞1.4版本要出大師模式的時候,我就心想,我能過大師模式嗎?我這技術?其他的boss倒沒什麼怕的,也就怕那個新boss光明女皇和月總這兩個。
  • 原來並沒有想的那麼簡單
    你是否想過這樣一個問題,在雷雨天氣中,參天大樹很容易被雷擊倒,而一些高層建築卻能夠安然無恙,這一切要歸功於一個叫做避雷針的神器。那麼避雷針究竟是如何避雷的呢?在觸電的瞬間,再通過接地引下線和接地裝置,把雷電流洩入大地,從而使建築物免遭雷擊,從原理來看,地雷陣並不是說避開雷電,而是主動引電,所以應當被稱作接閃杆更貼合,那麼這個巧妙的避雷方法又是誰想出來的呢?
  • 小時候愛吃的乾脆麵,原來做法那麼簡單,比買的好吃又健康
    但是又想吃到乾脆麵怎麼辦呢?乾脆在家自己做吧,今天,我們就用家裡非常普通的掛麵來製作小時候超級愛吃的乾脆麵,做法並不像大家想像的那麼複雜,而且還不用油炸,做出來好吃又健康,而且做法超級簡單,用普通的掛麵,做成小時候愛吃的乾脆麵,原來做法那麼簡單。
  • 狐妖小紅娘:立耳狐存在有些特殊,塗山或許沒有我們想的那麼簡單
    通過雅雅的記憶先後告訴了我們東方月初當初想做些什麼,以及東方月初當初選擇的修煉道路,不過最讓人好奇的還是最近出現的疑似前任塗山之主。原來當初和雅雅說話的狐妖真像一些朋友說的那樣,可能是曾經的塗山之主。雖然很多朋友都這樣認為,但有一點實在解釋不通。當初和雅雅說狐妖之力來自至情至性的那隻狐妖出現的時機,時間線其實是紅紅被人抓走誤殺了小道士之後的時間線。如果那隻狐妖真的是曾經的塗山之主,紅紅又怎麼被幾個垃圾道士抓走的呢?
  • 原來我不伸手就真的沒有擁抱
    原來我不伸手就真的沒有擁抱。1:後來才發現,並不是所有的喜歡都會有結果,終究要明白,遇見就已經很難得2:這山長水遠的人世,終究是要自己走下去。 以後的以後,拼命守護現在擁有的。6:愛上你以後,我沒以前那麼開心了,眼睛裡也沒有光也沒有夢想了,也沒有真正笑過,我也覺得我不像我了7:不要害怕全心全意去做看起來微不足道的事情。每當你完成這樣的一件事,你就會變得更強大。如果你把小事情都做好了,那麼大事情往往會水到渠成。世界就這麼簡單,做你可以做的。
  • 喜歡一個女孩真沒有那麼簡單!
    喜歡一個女孩真沒有那麼簡單! 每件事都不再那麼簡單。 實際上,我以前真的不太重視這些,如果說戀愛要看對方的學歷,工作,收入,我一定會說:你怎麼這麼現實!就像在一起一樣,為什麼要想那麼多呢? 但到了我這個年齡,如果遇到還不錯的人,一定要考慮一下這些情況。 這正是事實。
  • 原來個性那麼簡單!PS4手柄換殼教程
    原來個性那麼簡單!    首先是工具/材料部分, 其中核心工具就是一把合適的十字螺絲刀,DS4手柄上的螺絲還是比較特殊的,如果想換殼的玩家還是建議購買一把專用的十字螺絲刀;材料方面,DS4手柄改造最多的地方就是面蓋部分,這部分外殼相對較為便宜
  • 原來並沒有我們想的那麼貴
    由於自古以來就有「黃金有價玉無價」的說法,加上在小說、電視劇等內容中的誇張說法,大多數跟翡翠沒有什麼接觸的人都覺得,翡翠是一種天價奢侈品。但真的是這樣嗎?今天我們就來聊一聊翡翠的價值。糯冰種翡翠豆種翡翠相對來說不是那麼受歡迎,因為翡翠是一種多晶體,而構成豆種翡翠的晶體相對來說比構成其他種類翡翠的晶體更大更粗
  • 《我的少女時代》原來你是我最想留住的幸運!
    「原來你是我最想留住的幸運,原來我們和愛情曾經靠的那麼近……」一首《小幸運》唱出了多少人的青春,一部《我的少女時代》讓多少人回憶起了自己的青春…….影片的題材雖然簡單,卻也深深地打動了許多人!特別是最後的那個場景,時隔多年,男女主角再次重逢的那句「好久不見」相信讓很多人都眼泛淚光!學生時代的愛慕都是那麼的純真和簡單!
  • 並沒有你想的那麼簡單
    其實營養土並非你所想的簡單發酵一下就成了。什麼是營養土?營養土必須首先包含足夠的養分,包括微量元素以及各種肥力因子,但是一些朋友認為,在附近或公園的樹下挖土,並在家裡增加落葉將是一種有營養的土壤,如果您仔細觀察了社區或公園的綠化情況就會知道,當他們種植綠化帶時,他們都會在不同的開發地點安裝生泥,什麼是生泥?
  • 幸福原來如此簡單,原來我的幸福就是父母的健健康康!
    然而今晚牛牛簡單的話語卻引起了我的深思。在此之前我總覺得自己過得不夠幸福:掙的錢不夠花;住的房子不夠大;開的車子不夠好;每天都有許多的繁瑣事情……面對牛牛簡單坦然的幸福觀,我為自己的一些欲望感到羞愧。認真回想自己的生活,卻發現原來自己每天也都很幸福。
  • 沃興華:大字書法創作,不是你們想的那麼簡單
    舉個簡單的例子,王羲之的《蘭亭序》雖好,可最適合的就是放在案頭細品,如果把它裝裱起來放在巨大寬敞的高牆之上,多少也會有點不搭調。書法這門藝術,在傳承前人經典的基礎上,當然也要寫出屬於當下這個時代的新風貌。很多優秀書家也在這方面做了很多嘗試和努力。近些年來咱們比較常見的大字書法,就屬於這方面的嘗試之一。
  • 吃了一次還想吃的地瓜起司麵疙瘩,原來做法這麼簡單,乾淨又衛生
    導讀:吃了一次還想吃的地瓜起司麵疙瘩,原來做法這麼簡單,乾淨又衛生這道是吃了一次還想吃的地瓜起司麵疙瘩,原來做法竟然這麼簡單,在家自己做乾淨營養又衛生!我在中國並沒有特別愛吃地瓜,但是(人就是賤)思鄉情卻,在市場看到一大袋的地瓜,還是忍不住買了一袋回來。外國人吃地瓜唯一的方式就是炸成薯條(至少我在這沒吃過別種方式),基於健康和體重,我儘量不在家裡油炸東西;如果要做成地瓜圓,那我又得開始煮豆漿做豆花,為什麼要為了一袋地瓜整死自己呢?想來想去,想到上次的馬鈴薯麵疙瘩很好吃,那就再玩一次吧!
  • 重溫《龍貓》,原來它並沒有那麼無聊,還有更深的一層含義
    但是小編卻覺得這部電影雖然平淡,簡單,但是卻很有力量。在寒冷的冬天看這部關於夏天的故事,從中你會發現,原來生活是那麼的美好簡單,就像電影中姐妹倆一樣,總是快樂的。小女孩小月和妹妹小梅跟著爸爸一起搬到了鄉下生活,在幽靜而安逸的田野中,出現了一個若隱若現的小傢伙,蹦蹦跳跳地在草叢中遊走,小米好奇的跟著它,這是她第一次看見龍貓,也是龍貓這種生物首次出現在大熒幕上。
  • 《我的刺蝟女孩》:吳景昊回到十年前救女友,過程沒有那麼簡單
    《我的刺蝟女孩》正在熱播當中,這是一部青春偶像劇,也相當於一部穿越劇。吳景昊是一位非常優秀的醫生,然而年近三十歲的他依然形單影隻,如此優秀的人為什麼身邊沒有異性朋友呢?如果不是他對女生不感興趣,那就是心裏面有放不下的人。
  • 我沒你想的那麼脆弱,也沒我想的那麼堅強!
    但現在你走了,真正打破了未知,我無法接受恐懼,我需要你,你在哪裡,你在哪裡?你還是沒有回頭。你離開後的那些日子裡,每天的莫名的悲傷,莫名的流淚,一個人去面對這一切,不是你的鼓勵,聽到我們一起聽過的歌曲總是會莫名的哭,在我們一起走過那些地方會停留很長一段時間,哪怕周圍有很多人我還是會放聲大哭。世界對我太不公平,明明知道你對我那麼重要卻還是要把你從我身邊帶走。
  • 《大魚海棠》深度解析,湫和椿的關係,原來沒有那麼簡單
    很多人對《大魚海棠》的評價都很高,覺得它是一部能夠體現國漫地位的動漫電影,還說這部電影預示著國漫已經超越了日漫,但真正的看過這部電影之後,發現國漫的進步真的異常的快,但是是否真正的超越了日漫還不能夠下結論,畫面是美的配音是好聽的就連音樂也是很好聽,但故事實在是太老套了並沒有什麼太多的創新
  • 人經歷多了後,才知道原來幸福很簡單
    一直都在尋找幸福,想看看幸福到底是什麼樣子,可我一直在不停地尋找,卻一直沒找到。一直都覺得自己很不幸,什麼煩惱的事和挫折都發生在自己身上,有時候被弄得快要崩潰了。也許在每個人的心裡都有不同的答案,有時候心態放平和了,要求沒那麼高了,也許幸福就離自己近一些。曾經,我以為別人為我所做的一切都是理所當然的一件事,所以我從來不懂得去感恩所有曾對我好過,或是在我遇到困難的時候幫助過我的人。當經歷過歲月的摧殘,加上年紀漸長後,我才知道在這世界上沒有誰為誰所做的每一件事都是應該的。
  • 《我想吃掉你的胰臟》原來是這兩個含義
    導語:《我想吃掉你的胰臟》原來是這兩個含義如果與你在一起是我一次次選擇的結果,那麼我願意相信,我人生中之前的所有選擇都是正確的。山內有櫻名為良,樹本無名只待春。櫻花易逝,春樹常青。這只是一個沒有名字少年,和一個沒有未來的少女的——普普通通的青春故事。整部電影溫暖又治癒,沒有什麼跌宕起伏的情節,但就是讓人忍不住的往下看。整部電影都沒有你愛我,我愛你的那種膩味。而是那種似有若無的愛情。他們之間的感情已經不能簡單地用愛情來概括了。