0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32的SPI通信

CHANBAEK ? 來(lái)源:物聯(lián)網(wǎng)知識(shí) ? 作者:跋扈洋 ? 2023-06-21 15:08 ? 次閱讀

引言

SPI是串行外設(shè)接口的縮寫(xiě),是一種高速的,全雙工,同步的通信總線。由于SPI高速和同步的特性,使其成為嵌入式系統(tǒng)和小型設(shè)備中使用最廣泛的幾種通信接口之一。本文將詳細(xì)講解一下SPI,并且最后基于STM32編寫(xiě)一個(gè)例程。

介紹

SPI簡(jiǎn)介

SPI(Serial Peripheral Interface)是一種串行外設(shè)接口,用于在微控制器MCU)或數(shù)字信號(hào)處理器DSP)等主設(shè)備與外部設(shè)備之間進(jìn)行通信。SPI的設(shè)計(jì)旨在實(shí)現(xiàn)高速數(shù)據(jù)傳輸和簡(jiǎn)單的硬件實(shí)現(xiàn)。

SPI接口通常由一個(gè)主設(shè)備(Master)和一個(gè)或多個(gè)從設(shè)備(Slave)組成。主設(shè)備控制通信的時(shí)序和數(shù)據(jù)傳輸,而從設(shè)備根據(jù)主設(shè)備的指令進(jìn)行響應(yīng)。SPI通信基于全雙工傳輸方式,主設(shè)備和從設(shè)備可以同時(shí)發(fā)送和接收數(shù)據(jù)。

物理層

SPI通信中的數(shù)據(jù)傳輸通過(guò)四根線實(shí)現(xiàn):

  • SCLK(Serial Clock):時(shí)鐘線,由主設(shè)備產(chǎn)生,并控制數(shù)據(jù)的傳輸速度。不同的設(shè)備支持的最

    高時(shí)鐘頻率不同,兩個(gè)設(shè)備之間通訊時(shí),通訊速率受限于低速設(shè)備。

  • MOSI(Master Output Slave Input):主設(shè)備輸出線,負(fù)責(zé)將數(shù)據(jù)從主設(shè)備發(fā)送到從設(shè)備。主機(jī)的數(shù)據(jù)從這條信號(hào)線輸出,從機(jī)由這條信號(hào)線讀入主機(jī)發(fā)送的數(shù)據(jù),即這條線上數(shù)據(jù)的方向?yàn)橹鳈C(jī)到從機(jī)。

  • MISO(Master Input Slave Output):主設(shè)備輸入線,負(fù)責(zé)將數(shù)據(jù)從從設(shè)備發(fā)送到主設(shè)備。

  • SS(Slave Select):從設(shè)備選擇線,用于選擇特定的從設(shè)備與主設(shè)備進(jìn)行通信。當(dāng)有多個(gè)從設(shè)備時(shí),上面的三條線是共同使用的,而 NSS 則是用來(lái)區(qū)分多個(gè)不同的設(shè)備,當(dāng)主機(jī)需要選擇某個(gè)從設(shè)備時(shí),使用 NSS 信號(hào)線來(lái)尋址,把該從設(shè)備的 NSS 信號(hào)線設(shè)置為低電平,則該從設(shè)備被選擇,片選有效,然后主機(jī)與被選擇的從設(shè)備開(kāi)始通訊。

  • 圖片

SPI通信中的數(shù)據(jù)傳輸是基于幀(Frame)的概念,每個(gè)幀由一個(gè)傳輸字節(jié)(Byte)組成。主設(shè)備通過(guò)時(shí)鐘線控制數(shù)據(jù)傳輸?shù)臅r(shí)序,并通過(guò)主輸出線(MOSI)發(fā)送數(shù)據(jù),從設(shè)備則通過(guò)主輸入線(MISO)將數(shù)據(jù)發(fā)送回主設(shè)備。

協(xié)議層

通訊的起始和停止信號(hào)

當(dāng) NSS 信號(hào)線由高變低,是 SPI 通訊的起始信號(hào)。NSS 是每個(gè)從機(jī)各自獨(dú)占的信號(hào)線,當(dāng)從機(jī)從自己的 NSS 線檢測(cè)到起始信號(hào)后,就知道自己被主機(jī)選中了 ,準(zhǔn)備與主機(jī)通訊。NSS 由低變高,是 SPI 通訊的停止信號(hào),表示本次通訊結(jié)束,從機(jī)的選中狀態(tài)被取消。

圖片

SPI 模式

SPI通信中存在四種常見(jiàn)的模式,用于描述主設(shè)備和從設(shè)備之間數(shù)據(jù)傳輸?shù)臅r(shí)序和極性。他們的主要區(qū)別是總線空閑時(shí) SCK 的時(shí)鐘狀態(tài)以及數(shù)據(jù)采樣時(shí)刻。這是通過(guò) SPI_CR 寄存器的 CPOL 和 CPHA 位來(lái)控制。這些模式由兩個(gè)參數(shù)定義:時(shí)鐘極性(CPOL)和時(shí)鐘相位(CPHA)。

時(shí)鐘極性 CPOL 是指 SPI 通訊設(shè)備處于空閑狀態(tài)時(shí),SCK 信號(hào)線的電平信號(hào)(即 SPI 通訊開(kāi)始前、NSS 線為高電平時(shí) SCK 的狀態(tài))。CPOL=0 時(shí),SCK 在空閑狀態(tài)時(shí)為低電平,CPOL=1 時(shí),則相反。

時(shí)鐘相位 CPHA 是指數(shù)據(jù)的采樣的時(shí)刻,當(dāng) CPHA=0 時(shí),MOSI 或 MISO 數(shù)據(jù)線上的信號(hào)將會(huì)在 SCK 時(shí)鐘線的“奇數(shù)邊沿(串行同步時(shí)鐘的第一個(gè)跳變沿)”被采樣。當(dāng) CPHA=1 時(shí),數(shù)據(jù)線在 SCK 的“偶數(shù)邊沿(串行時(shí)鐘的第二個(gè)跳變沿)”。

圖片

圖片

  • 模式0(CPOL = 0,CPHA = 0):

    時(shí)鐘極性(CPOL)為低電平。

    時(shí)鐘相位(CPHA)為下降沿采樣。

    數(shù)據(jù)在時(shí)鐘的下降沿進(jìn)行采樣,數(shù)據(jù)的變化在時(shí)鐘的上升沿進(jìn)行傳輸。

    數(shù)據(jù)在時(shí)鐘的空閑狀態(tài)為低電平。

  • 模式1(CPOL = 0,CPHA = 1):

    時(shí)鐘極性(CPOL)為低電平。

    時(shí)鐘相位(CPHA)為上升沿采樣。

    數(shù)據(jù)在時(shí)鐘的上升沿進(jìn)行采樣,數(shù)據(jù)的變化在時(shí)鐘的下降沿進(jìn)行傳輸。

    數(shù)據(jù)在時(shí)鐘的空閑狀態(tài)為低電平。

  • 模式2(CPOL = 1,CPHA = 0):

    時(shí)鐘極性(CPOL)為高電平。

    時(shí)鐘相位(CPHA)為下降沿采樣。

    數(shù)據(jù)在時(shí)鐘的下降沿進(jìn)行采樣,數(shù)據(jù)的變化在時(shí)鐘的上升沿進(jìn)行傳輸。

    數(shù)據(jù)在時(shí)鐘的空閑狀態(tài)為高電平。

  • 模式3(CPOL = 1,CPHA = 1):

    時(shí)鐘極性(CPOL)為高電平。

    時(shí)鐘相位(CPHA)為上升沿采樣。

    數(shù)據(jù)在時(shí)鐘的上升沿進(jìn)行采樣,數(shù)據(jù)的變化在時(shí)鐘的下降沿進(jìn)行傳輸。

    數(shù)據(jù)在時(shí)鐘的空閑狀態(tài)為高電平。

這四種模式的選擇取決于主設(shè)備和從設(shè)備之間的時(shí)鐘和數(shù)據(jù)采樣方式。具體選擇哪種模式取決于所使用的設(shè)備和應(yīng)用的要求,以確保正確的數(shù)據(jù)傳輸和通信。

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

優(yōu)點(diǎn)

SPI接口具有以下幾個(gè)優(yōu)點(diǎn):

  • 高速數(shù)據(jù)傳輸:SPI接口通常能夠提供較高的數(shù)據(jù)傳輸速率,特別適用于對(duì)速度要求較高的應(yīng)用。由于SPI使用全雙工通信方式,數(shù)據(jù)可以同時(shí)在主設(shè)備和從設(shè)備之間傳輸,實(shí)現(xiàn)更快的數(shù)據(jù)交換速度。
  • 簡(jiǎn)單硬件實(shí)現(xiàn):SPI接口的硬件實(shí)現(xiàn)相對(duì)簡(jiǎn)單,通常只需要少量的引腳和簡(jiǎn)單的電路即可。SPI接口沒(méi)有復(fù)雜的協(xié)議和通信控制器,因此在嵌入式系統(tǒng)和小型設(shè)備中使用SPI接口可以減少成本和復(fù)雜性。
  • 靈活性:SPI接口支持點(diǎn)對(duì)點(diǎn)和多點(diǎn)通信。主設(shè)備可以連接多個(gè)從設(shè)備,每個(gè)從設(shè)備都有一個(gè)獨(dú)立的片選信號(hào)(Slave Select),可以根據(jù)需要選擇與主設(shè)備進(jìn)行通信的從設(shè)備。這種靈活性使得SPI接口適用于連接多個(gè)外部設(shè)備或模塊的應(yīng)用場(chǎng)景。
  • 可靠性:SPI接口通常在短距離內(nèi)進(jìn)行通信,信號(hào)傳輸?shù)木嚯x相對(duì)較短,因此具有較低的傳輸誤差和干擾風(fēng)險(xiǎn)。此外,SPI接口通常使用全雙工通信,主設(shè)備和從設(shè)備可以同時(shí)發(fā)送和接收數(shù)據(jù),從而提高了通信的可靠性。
  • 應(yīng)用廣泛:SPI接口在各種領(lǐng)域都得到廣泛應(yīng)用。它常用于連接各種外部設(shè)備,如傳感器、存儲(chǔ)器(如閃存和EEPROM)、顯示器、數(shù)字轉(zhuǎn)換器ADCDAC)等。由于其高速性和靈活性,SPI接口在通信和數(shù)據(jù)傳輸方面提供了一種有效的解決方案。

缺點(diǎn)

盡管SPI接口具有許多優(yōu)點(diǎn),但也存在一些缺點(diǎn)需要考慮:

  • 引腳占用:SPI通信通常需要使用多個(gè)引腳,包括時(shí)鐘線、數(shù)據(jù)輸入線、數(shù)據(jù)輸出線和片選信號(hào)線。這可能對(duì)系統(tǒng)設(shè)計(jì)帶來(lái)一定的復(fù)雜性,并且在引腳資源有限的情況下可能會(huì)造成問(wèn)題。
  • 距離限制:由于SPI通信通常是基于并行電平傳輸,其傳輸距離受到電信號(hào)衰減和干擾的限制。通信距離相對(duì)較短,一般在幾米以?xún)?nèi)。對(duì)于需要較長(zhǎng)距離傳輸?shù)膽?yīng)用,SPI可能不是最佳選擇。
  • 缺乏標(biāo)準(zhǔn)化:SPI接口本身沒(méi)有嚴(yán)格的標(biāo)準(zhǔn)化規(guī)范,導(dǎo)致不同設(shè)備和廠商可能會(huì)有不同的實(shí)現(xiàn)方式和特定的通信協(xié)議。這可能會(huì)導(dǎo)致兼容性問(wèn)題,需要針對(duì)不同設(shè)備進(jìn)行適配和定制。
  • 無(wú)差錯(cuò)校驗(yàn):SPI協(xié)議本身沒(méi)有提供內(nèi)置的差錯(cuò)檢測(cè)和校驗(yàn)機(jī)制。這意味著在數(shù)據(jù)傳輸過(guò)程中,如果發(fā)生傳輸錯(cuò)誤,接收方無(wú)法直接檢測(cè)到或糾正錯(cuò)誤。對(duì)于對(duì)數(shù)據(jù)完整性要求較高的應(yīng)用,需要額外的機(jī)制來(lái)確保數(shù)據(jù)的可靠性。
  • 僅適用于點(diǎn)對(duì)點(diǎn)或簡(jiǎn)單拓?fù)洌篠PI接口通常適用于點(diǎn)對(duì)點(diǎn)或簡(jiǎn)單的拓?fù)浣Y(jié)構(gòu),其中一個(gè)主設(shè)備控制一個(gè)或多個(gè)從設(shè)備。對(duì)于復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)或大規(guī)模系統(tǒng),SPI的連接和管理可能變得復(fù)雜,并且不容易擴(kuò)展和維護(hù)。

使用例程

基于STM32的SPI通信

開(kāi)發(fā)環(huán)境

安裝包在后臺(tái)回復(fù)對(duì)應(yīng)名稱(chēng)即可免費(fèi)獲得

  1. STM32CubeMX
  2. Keil 5

硬件連接

圖片

軟件實(shí)現(xiàn)

  1. 首先是使能引腳,選擇 SPI1 的雙全工模式。選擇 PD3 作為片選腳,也就是 NSS 信號(hào)線,產(chǎn)生起始和停止信號(hào)。

    圖片

    圖片

  2. 將 PD3 初始化為推挽輸出??梢钥吹?3 個(gè) SPI 引腳都是使用 GPIO 的復(fù)用模式。

  3. SPI參數(shù)配置

    圖片

  4. 生成的程序里,主要的配置信息如下。

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ù)位為八位
  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_4;//4分頻,84MHz/4=21MHz
  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();
  }
}

總結(jié)

在現(xiàn)如今數(shù)據(jù)量劇增的時(shí)代,SPI這種通信速度快的通信接口以后一定會(huì)使用更加頻繁,所以還是要加以學(xué)習(xí)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    40

    文章

    3520

    瀏覽量

    128805
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8257

    瀏覽量

    149950
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    5880

    瀏覽量

    135312
  • STM32
    +關(guān)注

    關(guān)注

    2257

    文章

    10828

    瀏覽量

    352468
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1669

    瀏覽量

    90729
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32 SPI通信ST7789V顯示屏失真的原因?如何解決?

    大佬們好,我想請(qǐng)教一個(gè)問(wèn)題 在hal庫(kù),我用stm32spi連接了一個(gè)240×240的lcd顯示屏,spi工作在僅發(fā)送模式,顯示圖片的時(shí)候,圖像失真 失真如圖 但我使用畫(huà)點(diǎn)去繪制的時(shí)候正常 正常
    發(fā)表于 03-12 08:06

    AD5270驅(qū)動(dòng),一半電阻輸出不變,驅(qū)動(dòng)信號(hào)跟手冊(cè)描述一致,請(qǐng)問(wèn)是什么問(wèn)題?

    STM32 SPI通信用示波器觀察SPI通信波形沒(méi)問(wèn)題,但AD5270芯片無(wú)響應(yīng),驅(qū)動(dòng)信號(hào)按照數(shù)據(jù)手冊(cè)例程編寫(xiě)。
    發(fā)表于 05-07 17:46

    STM32 SPI通信

    我想用SMT32的SPI硬件接口 可是指定引腳為P7B8 9 我該怎么辦 電路不能動(dòng)了
    發(fā)表于 11-20 23:33

    STM32 SPI主模式配置好檢測(cè)不到時(shí)鐘信號(hào)

    使用STM32SPI通信(沒(méi)接從機(jī),只發(fā)信號(hào)到芯片引腳),按照正常的配置,發(fā)送數(shù)據(jù),用示波器能檢測(cè)到發(fā)送出去的數(shù)據(jù),但是檢測(cè)不到SCK引腳的信號(hào),請(qǐng)大神指點(diǎn),這是為什么?
    發(fā)表于 05-07 17:19

    關(guān)于兩個(gè)STM32SPI通信問(wèn)題,真心希望得到大家?guī)椭。。?/a>

    主機(jī)用SPI1,從機(jī)用SPI2。目的是主機(jī)發(fā)送一組數(shù)據(jù),從機(jī)接受,同時(shí)從機(jī)返回一組數(shù)據(jù),通過(guò)串口打印驗(yàn)證。下面是程序。主機(jī)SPI初始#include "stm32
    發(fā)表于 05-25 17:09

    請(qǐng)問(wèn)AD7705的SPI要不要做電平轉(zhuǎn)換?

    AD7705用5V電源供電,跟3.3V的STM32SPI通信,要做電平轉(zhuǎn)換嗎?還是直接連上去就可以了?
    發(fā)表于 08-10 07:46

    STM32 SPI通信高速全雙工的通信介紹

    STM32 SPI通信高速全雙工的通信總線SPI 通訊使用 3 條總線及片選線,3 條總線分別為 SCK、MOSI、MISO,片選線為NSS
    發(fā)表于 02-14 07:52

    NodeMCU CH340與STM32SPI通信不工作怎么解決?

    我正在嘗試使用 SPI 在 nodeMCU 板和 STM32 板之間進(jìn)行通信,nodeMCU 是從屬板。我正在使用 ESP_RTOS_SDK。 主機(jī)發(fā)送 4 個(gè)字節(jié)的消息: - 首先是寫(xiě)入從機(jī)
    發(fā)表于 05-25 07:39

    STM32SPI通信線傳輸需要做好阻抗匹配嗎?

    STM32SPI通信線傳輸需要做好阻抗匹配嗎
    發(fā)表于 10-10 06:35

    求一個(gè)ADS1278與stm32spi通信C語(yǔ)言例程

    請(qǐng)問(wèn)各位有沒(méi)有現(xiàn)成的ADS1278的spi通信的C語(yǔ)言例程,剛接觸該行業(yè),ADS1278的數(shù)據(jù)手冊(cè)中的時(shí)序問(wèn)題看了好幾遍都看不懂,有沒(méi)有大神可以幫忙!
    發(fā)表于 10-23 14:48

    請(qǐng)問(wèn)AD7705的SPI要不要做電平轉(zhuǎn)換?

    AD7705用5V電源供電,跟3.3V的STM32SPI通信,要做電平轉(zhuǎn)換嗎?還是直接連上去就可以了?
    發(fā)表于 12-12 06:48

    關(guān)于STM32SPI通信

    STM32SPI通信調(diào)試經(jīng)驗(yàn)
    發(fā)表于 02-07 15:53 ?21次下載

    STM32 SPI通信常見(jiàn)問(wèn)題分析資料下載

    電子發(fā)燒友網(wǎng)為你提供STM32 SPI通信常見(jiàn)問(wèn)題分析資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶(hù)指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 03-31 08:50 ?10次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>SPI</b><b class='flag-5'>通信</b>常見(jiàn)問(wèn)題分析資料下載

    通俗理解STM32 SPI通信(主從雙機(jī)SPI通信

    STM32 SPI通信高速全雙工的通信總線SPI 通訊使用 3 條總線及片選線,3 條總線分別為 SCK、MOSI、MISO,片選線為NSS
    發(fā)表于 12-13 15:41 ?35次下載
    通俗理解<b class='flag-5'>STM32</b> <b class='flag-5'>SPI</b><b class='flag-5'>通信</b>(主從雙機(jī)<b class='flag-5'>SPI</b><b class='flag-5'>通信</b>)

    STM32-SPI通信

    定義的。SPI主要用于MCU和一些外設(shè)進(jìn)行通信的場(chǎng)合,例如:EEPROM、Flash、AD轉(zhuǎn)換器等一些應(yīng)用中,還有數(shù)字信號(hào)處理器和數(shù)字信號(hào)解碼器之間。SPI是一種高速的,全雙工,同步的通信
    發(fā)表于 12-20 19:21 ?1次下載
    <b class='flag-5'>STM32-SPI</b><b class='flag-5'>通信</b>