SPI讀寫FLASH


SPI協議:

SPI1掛載在APB2總線上,SP12和SPI3掛載在APB1總線上。

相對於I2C來說,SPI的傳輸速率要高得多,所以低速傳感器可能用I2C,但是高速傳感器用SPI還是用得非常多的。

I2C為半雙工,因為只有一根線,而SPI有兩根總數據線,一根可以接收數據,一根發送數據,為全雙工通信,

SS:從設備選擇信號線,常稱為片選信號線,也稱為NSS、CS。

主機通過片選線來選擇設備,而不用設備地址

每個從設備都有獨立的這一條SS信號線,本信號線獨占主機的一個引腳,即有多少個從設備,就有多少條片選信號線。I2C協議中通過設備地址來尋址、選中總線上的某個設備並與其進行通訊;而SPI協議中沒有設備地址,它使用SS信號線來尋址,當主機要選擇從設備時,把該從設備的SS信號線設置為低電平,該從設備即被選中,即片選有效,接着主機開始與被選中的從設備進行SPI通訊。所以SPI通訊以SS線置低電平為開始信號,以SS線被拉高作為結束信號。

SCLK:由通訊主機產生,決定了通訊的速率,不同的設備支持的最高時鍾頻率不一樣,如STM32的SPI時鍾頻率最大為fpclk/2,兩個設備之間通訊時,通訊速率受限於低速設備。

MISO(Master Intput, SlaveOutput):主機從這條信號線讀入數據,從機的數據由這條信號線輸出到主機,即在這條線上數據的方向為從機到主機。

MOSI(Master Output, Slave Input):主機的數據從這條信號線輸出,從機由這條信號線讀入主機發送的數據,即這條線上數據的方向為主機到從機。

  • 通訊的起始和停止

 

 

NSS片選信號線由高變低,是SPI通訊的起始信號,NSS信號由低變高,是SPI通訊的停止信號,表示本次通訊結束。

SCK引腳的上升沿和下降沿進行觸發和采樣,觸發代表數據信號進行變化不穩定,這個時候是不會采樣的,在采樣過程中MOSI和MISO都是保持穩定法。

  •  時鍾極性和時鍾相位

 

時鍾極性CPOL是指SPI通訊設備處於空閑狀態時,SCK信號線的電平信號(即SPI通訊開始前、 NSS線為高電平時SCK的狀態)。CPOL=0時, SCK在空閑狀態時為低電平,CPOL=1時,則相反。
時鍾相位CPHA是指數據的采樣的時刻,當CPHA=0時,MOSI或MISO數據線上的信號將會在SCK時鍾線的“奇數邊沿”被采樣。當CPHA=1時,數據線在SCK的“偶數邊沿”采樣。

 

 

  •  SPI外設設置

STM32的SPI外設可用作通訊的主機及從機,支持最高的SCK時鍾頻率為fpclk/2 (STM32F10x型號的芯片默認fpclk1為72MHz,fpclk2為36MHz),完全支持SPI協議的4種模式,數據幀長度可設置為8位或16位,可設置數據MSB先行或LSB先行。它還支持雙線全雙工(前面小節說明的都是這種模式)、雙線單向以及單線模式。

 

 其中SPI1是APB2上的設備,最高通信速率達36Mbtis/s,SPI2、SPI3是APB1上的設備,最高通信速率為18Mbits/s。除了通訊速率,在其它功能上沒有差異。

  • 時鍾控制邏輯

SCK線的時鍾信號,由波特率發生器根據“控制寄存器CR1”中的BR[0:2]位控制,該位是對fpclk時鍾的分頻因子,對fpclk的分頻結果就是SCK引腳的輸出時鍾頻率

其中的fpclk頻率是指SPI所在的APB總線頻率,APB1為fpclk1,APB2為fpckl2。

 以上這些只有在STM32做主機時才生效

  •  數據控制邏輯

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初始化結構體詳解

 SPI_Direction本成員設置SPI的通訊方向,可設置為雙線全雙工(SPI_Direction_2Lines_FullDuplex),雙線只接收(SPI_Direction_2Lines_RxOnly),單線只接收(SPI_Direction_1Line_Rx)、單線只發送模式(SPI_Direction_1Line_Tx)。

 SPI_Mode本成員設置SPI工作在主機模式(SPI_Mode_Master)或從機模式(SPI_Mode_Slave  ),這兩個模式的最大區別為SPI的SCK信號線的時序,SCK的時序是由通訊中的主機產生的。若被配置為從機模式,STM32的SPI外設將接受外來的SCK信號。

SPI_DataSize本成員可以選擇SPI通訊的數據幀大小是為8位(SPI_DataSize_8b)還是16位(SPI_DataSize_16b)。

SPI_FirstBit 所有串行的通訊協議都會有MSB先行(高位數據在前)還是LSB先行(低位數據在前)的問題,而STM32的SPI模塊可以通過這個結構體成員,對該特性編程控制。

SPI_CRCPloynomial 這是SPI的CRC校驗中的多項式,若我們使用CRC校驗時,就使用這個成員的參數(多項式),來計算CRC的值。

 配置完這些結構體成員后,要調用SPI_Init函數把這些參數寫入到寄存器中,實現SPI的初始化,然后調用SPI_Cmd來使能SPI外設。

  •  SPI讀寫FLASH實驗

 FLASH的存儲特性:1、在寫入數據前必須先擦除(擦除就是把所有數據改為1),2、寫入數據時只能把為1 的數據改為0,3、擦除時必須按最小單位來擦除,比如說扇區。

norflash:可以一個字節寫入

nandflash:必須以塊或者扇區為單位進行讀寫

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 SPI與I2C的區別:

1、SPI相對於I2C來說,SPI的傳輸速率要高得多,所以低速傳感器可能用I2C,但是高速傳感器用SPI還是用得非常多的。

2、I2C為半雙工,因為只有一根線,而SPI有兩根總數據線,一根可以接收數據,一根發送數據,為全雙工通信,

3、SPI通過片選信號線來選擇設備,I2C通過設備地址來選擇設備

4、I2C數據為時鍾線高電平有效,SPI數據為上升沿或者下降沿有效


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM