性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

小麥大叔
認(rèn)證:普通會(huì)員
所在專題目錄 查看專題
天哪!原來(lái)PWM這么簡(jiǎn)單
小小舵機(jī),大大玄機(jī)
UART協(xié)議快速掃盲(圖文并茂+超詳細(xì))
I2C協(xié)議快速掃盲
原來(lái)SPI并沒(méi)有我想的那么簡(jiǎn)單
芯片的大小端到底是怎么回事?
作者動(dòng)態(tài) 更多
一款輕量級(jí)的開(kāi)源GUI項(xiàng)目——SimpleGUI,可以完美適配單色屏
02-22 09:47
看到這100多個(gè)軟硬件開(kāi)源項(xiàng)目,真是爽爆了
2024-11-30 14:12
推薦一個(gè)高效,可靠,安全的串口通訊開(kāi)源方案
2024-11-27 11:17
推薦一款開(kāi)源hack硬件平臺(tái)工具
2024-11-26 13:58
新手學(xué)STM32的話,先學(xué)標(biāo)準(zhǔn)庫(kù)還是HAL庫(kù)?
2024-10-18 15:09

原來(lái)SPI并沒(méi)有我想的那么簡(jiǎn)單

本文將帶你了解SPI。我們將學(xué)習(xí)SPI通訊協(xié)議、SPI特性、模式編號(hào)、多從機(jī)模式、SPI通訊的優(yōu)缺點(diǎn),以及編程實(shí)現(xiàn)。如果覺(jué)得不錯(cuò),歡迎關(guān)注、分享、收藏、點(diǎn)贊。希望能幫助到大家,如有錯(cuò)誤敬請(qǐng)指出,謝謝!

目錄

  • 先說(shuō)串口
  • SPI通訊協(xié)議
  • SPI特性
  1. 時(shí)鐘頻率
  2. 時(shí)鐘極性 CKP/Clock Polarity
  3. 時(shí)鐘相位 CKE /Clock Phase (Edge)
  4. 時(shí)鐘配置總結(jié)
  • 模式編號(hào)
  • 多從機(jī)模式
  • 優(yōu)缺點(diǎn)
  1. SPI通訊的優(yōu)勢(shì)
  2. SPI的缺點(diǎn)
  • 編程實(shí)現(xiàn)

一、先說(shuō)串口

因?yàn)閁ART沒(méi)有時(shí)鐘信號(hào),無(wú)法控制何時(shí)發(fā)送數(shù)據(jù),也無(wú)法保證雙發(fā)按照完全相同的速度接收數(shù)據(jù)。因此,雙方以不同的速度進(jìn)行數(shù)據(jù)接收和發(fā)送,就會(huì)出現(xiàn)問(wèn)題。

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

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

傳輸速率如果有微小差異不是問(wèn)題,因?yàn)榻邮掌鲿?huì)在每個(gè)字節(jié)的開(kāi)頭重新同步。相應(yīng)的協(xié)議如下圖所示;

[串口傳輸?shù)倪^(guò)程]

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

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

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

下面開(kāi)始講一下SPI協(xié)議,會(huì)有哪些優(yōu)點(diǎn)。

二、SPI通訊協(xié)議

于是我們想有沒(méi)有更好一點(diǎn)的串行通訊方式;相比較于UART,SPI的工作方式略有不同。

SPI是一個(gè)同步的數(shù)據(jù)總線,也就是說(shuō)它是用單獨(dú)的數(shù)據(jù)線一個(gè)單獨(dú)的時(shí)鐘信號(hào)來(lái)保證發(fā)送端和接收端的完美同步。

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

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

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

具體要看對(duì)SPI的配置;

整體的傳輸大概可以分為以下幾個(gè)過(guò)程:

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

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

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

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

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

具體如下圖所示;

[SPI的時(shí)序]

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

三、SPI特性

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

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

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

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

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

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

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

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

  • NSS也可以是CE,CSSSEL;

  • SCLK也可以是SCK;

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

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

[主從連接]

1、時(shí)鐘頻率

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

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

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

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

2、時(shí)鐘極性 CKP/Clock Polarity

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

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

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

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

3、時(shí)鐘相位 CKE /Clock Phase (Edge)

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

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

  • CKE = 0:在時(shí)鐘信號(hào)SCK的第一個(gè)跳變沿采樣;
  • CKE = 1:在時(shí)鐘信號(hào)SCK的第二個(gè)跳變沿采樣;

4、時(shí)鐘配置總結(jié)

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

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

藍(lán)色線為SCK時(shí)鐘信號(hào);

具體如下圖所示;

四、模式編號(hào)

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

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

五、多從機(jī)模式

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

第一種方法:多NSS

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

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

[多NSS連接]

第二種方法:菊花鏈

[菊花鏈]

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

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

具體的連接如下圖所示;

[菊花鏈連接]

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

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

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

SCK為時(shí)鐘信號(hào),8clks表示8個(gè)邊沿信號(hào);

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

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

六、優(yōu)缺點(diǎn)

1、SPI通訊的優(yōu)勢(shì)

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

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

2、SPI的缺點(diǎn)

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

七、編程實(shí)現(xiàn)

下面是通過(guò)STM32的cubemx自動(dòng)生成的HAL庫(kù)代碼,比較簡(jiǎn)單,截取了其中一部分,具體如下;

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ù)線的第一個(gè)變化沿
    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)值,無(wú)效
    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);


聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺(jué)得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 3
收藏 6
關(guān)注 144
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧