~ SPI和串口都是一種全雙工的通信方式:支持同時收-同時發
~ SPI有MOSI(Master Output,Slave Input)和MISO(Master Input,Slave Output);
~ 串口有TX和RX;
~ IIC只有一根數據線;
~ IIC是一種半雙工的通信方式:在某一時刻可以接受或發送 不能在同一時刻收發。
SPI的常見通信系統:
SPI的通信時序:
~ 這是一個主機的通訊時序。NSS、SCK、MOSI信號都由主機控制產生,而 MISO 的信號由從機產生,主機通過該信號線讀取從機的數據。MOSI與 MISO 的信號只在 NSS為低電平的時候才有效,在 SCK 的每個時鍾周期 MOSI和 MISO 傳輸一位數據。
~ 標號1處,NSS信號線由高變低,是 SPI通訊的起始信號。NSS是每個從機各自獨占的信號線,當從機檢在自己的 NSS線檢測到起始信號后,就知道自己被主機選中了,開始准備與主機通訊。在圖中的標號6處,NSS信號由低變高,是 SPI通訊的停止信號,表示本次通訊結束,從機的選中狀態被取消。
~ SPI使用 MOSI及 MISO 信號線來傳輸數據,使用 SCK 信號線進行數據同步。MOSI及 MISO 數據線在 SCK的每個時鍾周期傳輸一位數據,且數據輸入輸出是同時進行的。(故假設通信的SCK頻率為20MHz,故數據每秒傳輸20MBit。)數據傳輸時,MSB先行或 LSB先行並沒有作硬性規定,但要保證兩個 SPI通訊設備之間使用同樣的協定,一般都會采用圖中的 MSB先行模式。
~ 觀察圖中的2,3,4,5標號處,MOSI及 MISO 的數據在 SCK 的上升沿期間變化輸出,在 SCK 的下降沿時被采樣。即在 SCK的下降沿時刻,MOSI及 MISO 的數據有效,高電平時表示數據“1”,為低電平時表示數據“0”。在其它時刻,數據無效,MOSI及 MISO為下一次表示數據做准備。SPI每次數據傳輸可以 8位或 16 位為單位,每次傳輸的單位數不受限制。
上圖中的時序只是 SPI中的其中一種通訊模式,SPI一共有四種通訊模式,它們的主要區別是總線空閑時 SCK 的時鍾狀態以及數據采樣時刻。他們由“時鍾極性 CPOL”和“時鍾相位 CPHA”決定。
時鍾極性 CPOL是指 SPI通訊設備處於空閑狀態時,SCK 信號線的電平信號(即 SPI通訊開始前、 NSS線為高電平時 SCK 的狀態)。CPOL=0 時, SCK 在空閑狀態時為低電平,CPOL=1 時,則相反。
時鍾相位 CPHA是指數據的采樣的時刻,當 CPHA=0時,MOSI或 MISO 數據線上的信號將會在 SCK時鍾線的“奇數邊沿”被采樣。當 CPHA=1 時,數據線在 SCK 的“偶數邊沿”采樣。
我們來分析這個 CPHA=0 的時序圖。首先,根據 SCK 在空閑狀態時的電平,分為兩種情況。SCK 信號線在空閑狀態為低電平時,CPOL=0;空閑狀態為高電平時,CPOL=1。無論 CPOL=0 還是=1,因為我們配置的時鍾相位 CPHA=0,在圖中可以看到,采樣時刻都是在 SCK 的奇數邊沿。注意當 CPOL=0 的時候,時鍾的奇數邊沿是上升沿,而CPOL=1 的時候,時鍾的奇數邊沿是下降沿。所以 SPI的采樣時刻不是由上升/下降沿決定的。MOSI和 MISO 數據線的有效信號在 SCK 的奇數邊沿保持不變,數據信號將在 SCK 奇數邊沿時被采樣,在非采樣時刻,MOSI和 MISO 的有效信號才發生切換。類似地,當 CPHA=1時,不受 CPOL的影響,數據信號在 SCK 的偶數邊沿被采樣。
由 CPOL及 CPHA的不同狀態,SPI分成了四種模式,見表 24-1,主機與從機需要工作在相同的模式下才可以正常通訊,實際中采用較多的是“模式 0”與“模式 3”。
~ 與 I2C外設一樣,STM32 芯片也集成了專門用於 SPI協議通訊的外設。
STM32 的 SPI外設可用作通訊的主機及從機,支持最高的 SCK 時鍾頻率為 f pclk /2(STM32F429 型號的芯片默認 f pclk1 為 90MHz,f pclk2 為 45MHz),STM32F429主頻為180M,f pclk1 = 90MHz(APB2的時鍾),f pclk2 = 45MHz(APB1的時鍾)。完全支持 SPI協議的 4種模式,數據幀長度可設置為 8 位或 16 位,可設置數據 MSB先行(高位先行)或 LSB先行(低位先行)。它還支持雙線全雙工(前面說明的都是這種模式)、雙線單向以及單線模式。其中雙線單向模式可以同時使用 MOSI及 MISO 數據線向一個方向傳輸數據,可以加快一倍的傳輸速度。而單線模式則可以減少硬件接線,當然這樣速率會受到影響。我們只講解雙線全雙工模式。
STM32 的 SPI外設還支持 I2S功能,I2S功能是一種音頻串行通訊協議,在我們以后講解 MP3 播放器的章節中會進行介紹。
STM32 的 SPI 架構剖析。
SPI的所有硬件架構都從圖中左側 MOSI、MISO、SCK 及 NSS線展開的STM32 芯片有多個 SPI外設,它們的 SPI通訊信號引出到不同的 GPIO 引腳上,使用時必須配置到這些指定的引腳,關於 GPIO 引腳的復用功能,可查閱《STM32F4xx規格書》,以它為准。
其中 SPI1、SPI4、SPI5、SPI6 是 APB2 上的設備,最高通信速率達 45Mbtis/s,SPI2、SPI3 是 APB1 上的設備,最高通信速率為 22.5Mbits/s。其它功能上沒有差異。
時鍾控制邏輯
SCK 線的時鍾信號,由波特率發生器根據“控制寄存器 CR1”中的 BR[0:2]位控制,該位是對 f pclk 時鍾的分頻因子,對 f pclk 的分頻結果就是 SCK 引腳的輸出時鍾頻率,計算方法見表 24-3。
數據控制邏輯
SPI的 MOSI及 MISO 都連接到數據移位寄存器上,數據移位寄存器的內容來源於接收緩沖區及發送緩沖區以及 MISO、MOSI線。當向外發送數據的時候,數據移位寄存器以“發送緩沖區”為數據源,把數據一位一位地通過數據線發送出去;當從外部接收數據的時候,數據移位寄存器把數據線采樣到的數據一位一位地存儲到“接收緩沖區”中。通過寫 SPI的“數據寄存器 DR”把數據填充到發送緩沖區中,通過 “數據寄存器 DR”,可以獲取接收緩沖區中的內容。其中數據幀長度可以通過“控制寄存器 CR1”的“DFF位”配置成 8 位及 16 位模式;配置“LSBFIRST位”可選擇 MSB先行還是 LSB先行。
特殊的SSM位,當 SSM 位置 1 時,NSS 引腳輸入替換為 SSI 位的值。(軟件控制其數據位傳輸。)
通訊過程
STM32 使用 SPI外設通訊時,在通訊的不同階段它會對“狀態寄存器 SR”的不同數據位寫入參數,我們通過讀取這些寄存器標志來了解通訊狀態。下圖是“主模式”流程,即 STM32 作為 SPI 通訊的主機端時的數
據收發過程。
假如我們使能了 TXE 或 RXNE 中斷,TXE 或 RXNE置 1 時會產生 SPI中斷信號,進入同一個中斷服務函數,到 SPI中斷服務程序后,可通過檢查寄存器位來了解是哪一個事件,再分別進行處理。也可以使用 DMA方式來收發“數據寄存器 DR”中的數據。
初始化結構體: