當(dāng)前位置:首頁 > 公眾號精選 > 小麥大叔
[導(dǎo)讀]之前寫過一篇UART,通用串行異步通訊協(xié)議,感興趣可以參考一下《我打賭!你還不會UART》;因為UART沒有時鐘信號,無法控制何時發(fā)送數(shù)據(jù),也無法保證雙發(fā)按照完全相同的速度接收數(shù)據(jù)。因此,雙方以不同的速度進(jìn)行數(shù)據(jù)接收和發(fā)送,就會出現(xiàn)問題。如果要解決這個問題,UART為每個字節(jié)添加額外的起始位和停止位,以幫助接收器在數(shù)據(jù)到達(dá)時進(jìn)行同步。

前面的話

前天一位讀者私信說我分享的文章誤導(dǎo)了他,然后就取消關(guān)注了,以至于我想回復(fù)他是哪里寫的不對或是哪些寫的不好時,也無法回復(fù)了,雖然有些許收到打擊,但還是會堅持學(xué)習(xí),總結(jié)和分享的,道阻且長,也難免會有錯誤和紕漏;


目錄

  • 前面的話

  • 目錄

  • 先說串口

  • SPI通訊協(xié)議

  • SPI特性

  • 模式編號

  • 多從機(jī)模式

  • 優(yōu)缺點

  • 編程實現(xiàn)


先說串口

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

如果要解決這個問題,UART為每個字節(jié)添加額外的起始位停止位,以幫助接收器在數(shù)據(jù)到達(dá)時進(jìn)行同步;

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

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

串口傳輸?shù)倪^程

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

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

不難發(fā)現(xiàn),如果接收端和發(fā)送端設(shè)置的速度都不一致,那么接收到的數(shù)據(jù)將是垃圾(亂碼)。

下面開始講一下SPI協(xié)議,會有哪些優(yōu)點。

SPI通訊協(xié)議

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

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

時鐘是一個振蕩信號,它告訴接收端在確切的時機(jī)對數(shù)據(jù)線上的信號進(jìn)行采樣。

產(chǎn)生時鐘的一側(cè)稱為主機(jī),另一側(cè)稱為從機(jī)。總是只有一個主機(jī)(一般來說可以是微控制器/MCU),但是可以有多個從機(jī)(后面詳細(xì)介紹);

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

具體要看對SPI的配置;

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

  • 主機(jī)先將NSS信號拉低,這樣保證開始接收數(shù)據(jù);

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

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

  • 主機(jī)發(fā)送到從機(jī)時:主機(jī)產(chǎn)生相應(yīng)的時鐘信號,然后數(shù)據(jù)一位一位地將從MOSI信號線上進(jìn)行發(fā)送到從機(jī);

  • 主機(jī)接收從機(jī)數(shù)據(jù):如果從機(jī)需要將數(shù)據(jù)發(fā)送回主機(jī),則主機(jī)將繼續(xù)生成預(yù)定數(shù)量的時鐘信號,并且從機(jī)會將數(shù)據(jù)通過MISO信號線發(fā)送;

具體如下圖所示;

SPI的時序

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

SPI特性

SPI總線包括4條邏輯線,定義如下:

  • MISOMaster input slave output 主機(jī)輸入,從機(jī)輸出(數(shù)據(jù)來自從機(jī));

  • MOSIMaster output slave input 主機(jī)輸出,從機(jī)輸入(數(shù)據(jù)來自主機(jī));

  • SCLKSerial Clock 串行時鐘信號,由主機(jī)產(chǎn)生發(fā)送給從機(jī);

  • SSSlave Select 片選信號,由主機(jī)發(fā)送,以控制與哪個從機(jī)通信,通常是低電平有效信號。

其他制造商可能會遵循其他命名規(guī)則,但是最終他們指的相同的含義。以下是一些常用術(shù)語;

  • MISO也可以是SIMO,DOUT,DOSDOSO(在主機(jī)端);

  • MOSI也可以是SOMI,DIN,DI,SDISI(在主機(jī)端);

  • NSS也可以是CE,CSSSEL;

  • SCLK也可以是SCK;

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

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

主從連接

時鐘頻率

SPI總線上的主機(jī)必須在通信開始時候配置并生成相應(yīng)的時鐘信號。在每個SPI時鐘周期內(nèi),都會發(fā)生全雙工數(shù)據(jù)傳輸。

主機(jī)在MOSI線上發(fā)送一位數(shù)據(jù),從機(jī)讀取它,而從機(jī)在MISO線上發(fā)送一位數(shù)據(jù),主機(jī)讀取它。

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

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

時鐘極性 CKP/Clock Polarity

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

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

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

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

時鐘相位 CKE /Clock Phase (Edge)

除配置串行時鐘速率和極性外,SPI主設(shè)備還應(yīng)配置時鐘相位(或邊沿)。根據(jù)硬件制造商的不同,時鐘相位通常寫為CKECPHA;

顧名思義,時鐘相位/邊沿,也就是采集數(shù)據(jù)時是在時鐘信號的具體相位或者邊沿;

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

時鐘配置總結(jié)

綜上幾種情況,下圖總結(jié)了所有時鐘配置組合,并突出顯示了實際采樣數(shù)據(jù)的時刻;

其中黑色線為采樣數(shù)據(jù)的時刻;

藍(lán)色線為SCK時鐘信號;

具體如下圖所示;

模式編號

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

SPI Mode CPOL CPHA
0 ?[00] 0 0
1 ?[01] 0 1
2 ?[10] 1 0
3 ?[11] 1 1

除此之外,我們還應(yīng)該仔細(xì)檢查微控制器數(shù)據(jù)手冊中包含的模式表,以確保一切正常。

多從機(jī)模式

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

第一種方法:多NSS

  1. 通常,每個從機(jī)都需要一條單獨的SS線。
  2. 如果要和特定的從機(jī)進(jìn)行通訊,可以將相應(yīng)的 NSS信號線拉低,并保持其他 NSS信號線的狀態(tài)為高電平;如果同時將兩個 NSS信號線拉低,則可能會出現(xiàn)亂碼,因為從機(jī)可能都試圖在同一條 MISO線上傳輸數(shù)據(jù),最終導(dǎo)致接收數(shù)據(jù)亂碼。

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

多NSS連接

第二種方法:菊花鏈

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

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

具體的連接如下圖所示;

菊花鏈連接

其中紅線加粗為數(shù)據(jù)的流向;

所以最終的數(shù)據(jù)流向圖可以表示為:

數(shù)據(jù)流圖

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

其中D為數(shù)據(jù),X為無效數(shù)據(jù);

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

優(yōu)缺點

SPI通訊的優(yōu)勢

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

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

SPI的缺點

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

編程實現(xiàn)

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

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


—— The End?—

推薦好文 ??點擊藍(lán)色字體即可跳轉(zhuǎn)
?感覺身體被掏空!只因為肝了這篇空間矢量控制算法
?當(dāng)心!別再被大小端的問題坑了
?對不起!我還是堅持把I2C肝完了
?我打賭!你還不會UART
?簡易PID算法的快速掃盲
?增量式PID到底是什么?
?三面大疆慘敗,因為不懂PID的積分抗飽和

原創(chuàng)不易,歡迎轉(zhuǎn)發(fā)、留言、點贊、分享給你的朋友,感謝您的支持!


長按識別二維碼關(guān)注獲取更多內(nèi)容



免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉