SPI协议
SPI協議
SPI通訊協議(Serial Peripheral Interface),即串行外圍設備接口,是一種高速全雙工的通信總線(比I2C協議快)。它被廣泛地使用在ADC、LCD等設備與MCU間,要求通訊速率較高的場合。
一、物理層
SS:從設備選擇信號線,常稱為片選信號線,也稱為NSS、CS。
每個從設備都有獨立的這一條SS信號線,本信號線獨占主機的一個引腳,即有多少個從設備,就有多少條片選信號線。l2C協議中通過設備地址來尋址、選中總線上的某個設備并與其進行通訊;而SPI協議中沒有設備地址,它使用SS信號線來尋址,當主機要選擇從設備時,把該從設備的SS信號線設置為低電平,該從設備即被選中,即片選有效,接著主機開始與被選中的從設備進行SPI通訊。所以SPI通訊以SS線置低電平為開始信號,以SS線被拉高作為結束信號。
SCK:時鐘信號線。
它由通訊主機產生,決定了通訊的速率,不同的設備支持的最高時鐘頻率不一樣,如STM32的SPI時鐘頻率最大為f(pclk)/2,兩個設備之間通訊時,通訊速率受限于低速設備。
MOSI:(Master Output ,Slave Input)
主設備輸出/從設備輸入引腳。
主機的數據從這條信號線輸出,從機由這條信號線讀入主機發送的數據,即這條線上數據的方向為主機到從機。
MISO:(Master Input,Slave Output):
主設備輸入/從設備輸出引腳。
主機從這條信號線讀入數據,從機的數據由這條信號線輸出到主機,即在這條線上數據的方向為從機到主機。
注:MISO和MOSI相當于SDA,而SDA又有TX和RX引腳進行數據發送與接收。都是全雙工。MOSI相當于TX,MISO相當于RX。區別在于,STM32與電腦連接時,TX應與RX相連接,RX與TX相連接;而使用SPI協議時,一條數據通道連的兩端就是MISO與MOSI,例如,STM32的MISO引腳的另一端就是MOSI,不需要交叉連接,且這條連接的信號線是共用的。
二、協議層
SPI的協議層定義了通訊的起始和終止信號、數據有效性、時鐘同步等環節。
SPI協議層時序圖
(1)通信環節:
NSS輸出端:片選引腳 。片選信號是低電平有效,因此片選引腳傳輸過程中一直到是低電平
SCK輸出端:SCK引腳。上升沿觸發,下降沿采樣。圖中上升沿時的數據無效,下降沿即下一個上升沿之間的數據有效。但SPI協議中上升沿和下降沿含義不像I2C協議定死,可以另定義。
數據信號線:MOSI輸出端和MISO輸入端
字節序
1、LSB:全稱為Least Significant Bit,在二進制數中意為最低有效位,一般來說,MSB位于二進制數的最左側,LSB位于二進制數的最右側。圖中MSBOUT即輸出時字節序為從左到右。 并且對于上文物理層的圖例來說,MOSI輸出一個數據,MISO就輸入一個數據,且兩者是同時進行的。
2、MSB:全稱為Most Significant Bit,在二進制數中屬于最高有效位,MSB是最高加權位,與十進制數字中最左邊的一位類似。
(2)通訊的起始與停止信號
標號①處,NSS信號線由高變低,是SPI通訊的起始信號。NSS是每個從機各自獨占的信號線,當從機檢在自己的NSS線檢測到起始信號后,就知道自己被主機選中了,開始準備與主機通訊。
在圖中的標號⑥處,NSS信號由低變高,是SPI通訊的停止信號,表示本次通訊結束,從機的選中狀態被取消。
(3)數據有效性
SPI使用MOSI及MISO信號線來傳輸數據,使用SCK信號線進行數據同步。MOSI及MISO數據線在SCK的每個時鐘周期傳輸一位數據,且數據輸入輸出是同時進行的。
(4)CPOL/CPHA及通訊模式
CPHA=0時
CPOL:時鐘極性,指SPI通訊設備在空閑時間時,SCK時鐘信號線的電平信號(即SPI通訊開始前、NSS線為高電平時SCK的狀態)。CPOL=0時,SCK在空閑狀態時為低電平,CPOL=1時,則SCK在空閑狀態時為高電平。代表了通訊時的兩種極性。
CPHA:時鐘相位,指數據的采樣的時刻。當CPHA=0時,MOSI或MISO數據線上的信號將會在SCK時鐘線的“奇數邊沿”被采樣;當CPHA=1時,數據線在SCK的“偶數邊沿”采樣。
CPHA=1時
CPOL及CPHA的不同狀態,SPI分成了四種模式,主機與從機需要工作在相同的模式下才可以正常通訊,實際中采用的常是模式0和模式3:
四種模式
三、SPI的外設
STM32的SPI外設可用作通訊的主機及從機,支持最高的SCK時鐘頻率為f(pclk)/2 (STM32F407型號的芯片默認f(pclk2)為84MHzf(pclk1)為42MHz),完全支持SPI協議的4種模式,數據幀長度可設置為8位或16位,可設置數據MSB先行或LSB先行。它還支持雙線(指MISO和MOSI)全雙工(前面說明的都是這種模式)、雙線單向以及單線模式。
STM32SPI外設演示圖
四個部分:
(1)通訊引腳
(2)時鐘控制邏輯:SCK連接到波特率發生器用于產生時鐘
(3)數據控制邏輯:數據寫到發送緩沖區,通過移位寄存器將數據一位一位地發送出去(即并行轉串行);輸入時,數據一位一位的輸入移位寄存器組合成八位數據,并發到接收緩沖區(串行轉并行);地址和數據總線讀寫緩沖區的數據,達到數據的接受和發送的效果。
(4)整體控制邏輯:BR[2:0]波特率寄存器
通訊引腳(F407,以手冊為準)
時鐘控制邏輯(補充):SCK線的時鐘信號,由波特率發生器根據“控制寄存器CR1”中的BR[0:2]位控制,該位是對f(pclk)時鐘的分頻因子,對f(pclk)的分頻結果就是SCK引腳的輸出時鐘頻率。
BR配置對應分頻
其他幾個常用SPI可配置寄存器及其位應用:
(注:SPI_CR1寄存器不可以用于I2S模式)
SPI_CR1:
(1)位2,MSTR位——0:從配置 (作為從機)
1:主配置 (作為主機)
(2)位7,LSBFIRST——0:先發送MSB
1:先發送LSB
(3)RXONLY:只接收(Receive only)位10——0:全雙工(發送和接收) 1:關閉輸出(只接收模式)
(4)DFF位,DFF為數據幀格式(Data frame format)——0:接收8位數據幀格式 1:接收16位數據幀格式
SPI_DR:數據寄存器DR[15:0],分為兩個緩沖區,一個用來寫入(發送緩沖區)一個用來讀取(接收緩沖區)。
發達或接收的數據為8位或16位,具體取決于數據幀格式選擇位(SPI_CR1寄存器中的DFF)。必須在使能SPI前進行此項選擇,以確保操作正確。
對于8位數據幀,緩沖區為8位,只有寄存器的LSB(SPI_DR[7:0])用于發送/接收。在接收模式下,寄存器的MSB(SPI_DR[15:8])強制為0。
對于16位數據幀,緩沖區為16位,整個寄存器 SPI_DR[15:0]均用于發送/接收。
即SPI的MOSI及MISO都連接到數據移位寄存器上,數據移位寄存器的數
據來源來源于接收緩沖區及發送緩沖區。
通過寫SPI的“數據寄存器DR”把數據填充到發送緩沖區中。
通過讀“數據寄存器DR”,可以獲取接收緩沖區中的內容。
其中數據幀長度可以通過“控制寄存器CR1”的“DFF位”配置成8位及16位
模式;配置“LSBFIRST位”可選擇MSB先行還是LSB先行。
整體控制邏輯(補充):
整體控制邏輯負責協調整個SPI外設,控制邏輯的工作模式根據“控制寄存器(CR1/CR2)”的參數而改變,基本的控制參數包括前面提到的SPI模式、波特率、LSB先行、主從模式、單雙向模式等等。
在外設工作時,控制邏輯會根據外設的工作狀態修改“狀態寄存器(SR)”,只要讀取狀態寄存器相關的寄存器位,就可以了解SPI的工作狀態了。除此之外,控制邏輯還根據要求,負責控制產生SPI中斷信號、DMA請求及控制NSS信號線。
實際應用中,一般不使用STM32 SPI外設的標準NSS信號線,而是更簡單地使用普通的GPIO,軟件控制它的電平輸出,從而產生通訊起始和停止信號。
通訊過程
注:讀操作時,因為需要主機時鐘,所以會往發送緩沖區輸入一個數據來使主機產生時鐘,在輸入時產生時鐘時剛好接收到需要接收的數據。而因為定義了接收模式,主機會忽略發送寄存器中儲存的數據是啥(數據是啥不重要)。
過程:
控制NSS信號線,產生起始信號(圖中沒有畫出);
把要發送的數據寫入到“數據寄存器DR”中,該數據會被存儲到發送緩沖區;
通訊開始,SCK時鐘開始運行。MOSI把發送緩沖區中的數據一位一位地傳輸出去;MISO則把數據一位一位地存儲進接收緩沖區中;
當發送完一幀數據的時候,“狀態寄存器SR”中的“TXE標志位”會被置1,表示傳輸完一幀,發送緩沖區已空;類似地,當接收完一幀數據的時候,“RXNE標志位”會被置1,表示傳輸完一幀,接收緩沖區非空;
等待到“TXE標志位”為1時,若還要繼續發送數據,則再次往“數據寄存器DR”寫入數據即可;等待到“RXNE標志位”為1時,通過讀取“數據寄存器DR”可以獲取接收緩沖區中的內容。
假如使能了TXE或RXNE中斷,TXE或RXNE置1時會產生SPI中斷信號,進入同一個中斷服務函數,到SPI中斷服務程序后,可通過檢查寄存器
位來了解是哪一個事件,再分別進行處理。也可以使用DMA方式來收發“數據寄存器DR”中的數據。
四、SPI的固件庫
1.初始化結構體:
(1)SPI_Direction:
本成員設置SPI的通訊方向,可設置為雙線全雙工
(SPl_Direction_2Lines_FullDuplex);
雙線只接收(SPl_Direction_2Lines_RxOnly);
單線只接收(SPl_Direction_1Line_Rx);
單線只發送模式(SPIl_Direction_1Line_Tx)。
(2)SPl_Mode:
本成員設置SPI工作在主機模式(SPl_Mode_Master)或從機模式
(SPl_Mode_Slave ),這兩個模式的最大區別為SPI的SCK信號線的時序,SCK的時序是由通訊中的主機產生的。若被配置為從機模式,STM32的SPI外設將接受外來的SCK信號。
(3)SPI_DataSize:
本成員可以選擇SPI通訊的數據幀大小是為8位(SPl_DataSize_8b)還是16位(SPl_DataSize_16b)。
(4) SPl_CPOL和SPI_CPHA:
這兩個成員配置SPI的時鐘極性CPOL和時鐘相位CPHA,這兩個配置影響到SPI的通訊模式,時鐘極性CPOL成員,可設置為高電平(SPl_CPOL_High)或低電平(SPI_CPOL_Low )。
時鐘相位CPHA則可以設置為SPI_CPHA_1Edge(在SCK的奇數邊沿采集數據)或SPl_CPHA_2Edge (在SCK的偶數邊沿采集數據)。
(5)SPI_NSS:
本成員配置NSS引腳的使用模式,可以選擇為硬件模式(SPI_NSS_Hard )與軟件模式(SPI_NSS_Soft ),在硬件模式中的SPI片選信號由SPI硬件自動產生,而軟件模式則需要親自把相應的GPIO端口拉高或置低產生非片選和片選信號。(一般用軟件控制)
(6)SPI BaudRatePrescaler:
本成員設置波特率分頻因子,分頻后的時鐘即為SPI的SCK信號線的時鐘頻率。這個成員參數可設置為fpclk的2、4、6、8、16、32、64、128、256分
頻。
具體配置:
(7)SPI_FirstBit:
所有串行的通訊協議都會有MSB先行(高位數據在前)還是LSB先行(低位數據在前)的問題。
(8)SPI_CRCPolynomial:
這是SPI的CRC校驗中的多項式,若我們使用CRC校驗時,就使用這個
成員的參數(多項式),來計算CRC的值。
2.使能函數
關于讀和寫,讀時會調用SPI_I2S_SendData(SPI_TypeDef* SPIx,unit16_t Data)
寫時會調用SPI_I2S_RecieveData(SPI_TypeDef* SPIx,unit16_t Data)
五、Flash芯片(以W25Q128為例)
(一般可用SPI1控制該芯片)
PB3/PB4是JTAG引腳,因此如果用SPI1PB3接口時,PB3、4將不能用于JTAG(下載引腳,20個信號線,速度快,但是占用引腳資源過多)使用。若要下載應該在配置中將下載接口改成SWD接口(3個信號線)代替(或者按住復位按鍵先使程序不能順利初始化PB3等JTAG接口,下載時就可進行)。
該Flash支持XIP功能,既可以存儲程序也可以運行(合適主機條件下)。
①Flash 寫入數據時和 EEPROM 類似,不能跨頁寫入,一次最多寫入一頁,W25Q128的一頁是 256 字節。
寫入數據一旦跨頁,必須在寫滿上一頁的時候,等待 Flash 將數據從緩存搬移到非易失區,重新再次往里寫。
②Flash 有一個特點,就是可以將 1 寫成 0,但是不能將 0 寫成 1,要想將 0 寫成 1,必須進行擦除操作。因此通常要改寫某部分空間的數據,必須首先進行一定物理存儲空間擦除,最小的擦除空間為扇區(4096個字節/32KB/64KB一起擦除,一般按4KB/4096字節為單位擦除),扇區擦除就是將這整個扇區每個字節全部變成 0xFF,再將需要輸入的數據輸入相應位置。
每款 Flash 的扇區大小不一定相同,W25Q128 的一個扇區是 4096 字節。為了提高擦除效率,使用不同的擦除指令還可以一次性進行 32K(8 個區)、64K(16 個扇區)以及整片擦除。
SPI時鐘頻率為104MHz使用時將STM32設置為42MHz即可
HOLD or功能:主機和某一從機通訊時,若另一個從機有緊急任務需要處理,就可用該功能,先完成緊急任務再進行原從機通訊。
SPI的Flash存儲器結構:
(1)塊(Block),64KB
(2)Sector(扇區),4096Byte(4KB),一個塊由16個扇區組成,每個扇區又有16個頁(Page,256Byte),每次寫入可以頁為單位,每次擦除以扇區為最小單位。
BUSY實現功能:(取自W25Q128手冊)
BUSY is a read only bit in the status register (S0) that is set to a 1 state when the device is executing a Page Program,Quad Page Program, Sector Erase, Block Erase, Chip Erase, Write Status Register or Erase/Program Security Register instruction.During this time the device will ignore further instructions except for the Read Status Register and Erase/Program Suspend instruction (see tw, tPP, tSE, tBE, andtcE in AC Characteristics). When the program, erase or write status/security register instruction has completed,the BUSY bit will be cleared to a 0 state indicating the device is ready for furtherinstructions.
總結
- 上一篇: Flask唯一URL规则--@app.r
- 下一篇: 【机器学习】opencv-摄像头中的人脸