(學習筆記)stm32f429固件庫之SPI讀寫FLASH

SPI——串行外設總線(Seriel Peripheral Interface),全雙工通信,4條線:1、SCK(Seriel Clock,時鐘信號線——用於同步通信),由主機產生,兩個設備通信時,速率受限於低速設備;2、SS(也稱NSS、CS,設備選擇信號線,也是片選信號線),每個設備通過一條獨有的CS線連接到主機,當CS拉低時,表示被選中;3、MISO(Master Input Slave Output,主機輸入從機輸出);4、MOSI(Master Input Slave Output,主機輸出從機輸入)。SCK、MISO、MOSI這三條線各個從機共用,CS線爲每個從機獨有連接主機。

SPI協議層: 通信的起始信號:CS由高變低;

通信的結束信號:CS由低變高;

數據的有效性:在SCK每個時鐘週期發送一位數據,數據輸入輸出同時進行,在什麼時候採樣以及時鐘信號在通信開始前的狀態由SPI控制寄存器1位0CPHA(Clock Phase)位1CPOL(Clock Polarity)決定,CPOL和CPHA不同組合形成4種模式,00,01 ,10,11,在FLASH芯片W25Q128中支持模式0和模式3。

之後感覺重要的就是FLASH芯片的Instructions了,在文檔中有命令表。


然後複習一下思路: 1、初始化——初始化GPIO引腳,初始化SPI結構體,打開引腳和外設時鐘,使能SPI。這塊FLASH芯片是先接收MSB的,所以初始化裏設置爲MSB先行。

2、在讀取芯片ID——先寫一個讀寫函數uint8_t Read_Write_Byte(uint8_t data)。在發送數據之前,先通過SPI_GetFlagStatus(...)判斷SPI狀態寄存器位1-TXE,等待發送緩衝區爲空,再調用SPI_I2S_SendData(...)發送一個8位數據,在通過SPI_GetFlagStatus(...)判斷SPI狀態寄存器位0-RXNE,等待接收緩衝區不爲空,開始接收一個8位數據,返回讀到的值。在初始化中設置發送接收數據長度。關於這邊爲什麼在一個函數中同時發送接收,說是不發送數據時鐘線不開,接收也無效。“SPI設備間的數據傳輸又被稱爲數據交換,SPI協議規定SPI設備在通訊中不能僅充當一個“發送者”或“接受者”,在每個CLOCK週期內,SPI設備都會發送並接收一個bit大小的數據,相當於數據交換”(百度文庫)。

3、讀取芯片ID——拉高CS,用讀寫函數發送讀取ID指令9FH,之後,用讀寫函數發送一個DUMMY(任意數據)並用一個8位變量接收返回值即(MF7-MF0),再用兩個變量接收(ID15-ID8)和(ID7-ID0),將三個變量整合到一個32位數據作爲返回值返回。

4.1、寫使能——拉高CS,發送Write Enable指令06H,拉低CS

4.2、擦除存儲區域——在我們下載程序,寫入之前,得先擦除,擦除之前,先發送寫使能。FLASH有個特性,只能將0寫成1,不能將1寫成0,所以擦除後的FLASH全爲1。這塊16MByte的FLASH芯片,由256個Block(塊,64k)組成,每個塊由16個Sector(扇區,4k)組成,所以有整片擦除、扇區擦除、塊擦除。擦除扇區相當於向存儲器寫1,所以在擦除扇區之前要先發送寫使能命令。

5、讀取數據——讀取數據之前得先等待芯片處理完內部時序,即總線空閒,等待芯片狀態寄存器位0-BUSY爲0。拉高CS,發送Read Data 指令03H,分3次發送讀的起始地址,開始讀,傳入一個數組指針,將讀到的值存入一個數組,通過串口顯示出來,地址自加1。通過判斷讀出的數據是否全爲1檢驗程序對錯。

6、寫數據——等待芯片處理時序,即等待總線空閒,發送寫使能,發送Page Program指令02H,分三次發送要寫入的地址,之後發送要寫入的數據,可以通過數組指針寫入多個數據,但是不得多於256個,芯片規定。可以通過循環寫入超過256個數據

7、通過讀取數據將之顯示出來與寫入數據比較,檢驗程序是否正確。

8、掉電模式——可用可不用,進入掉電模式之後只有Release Power_down或者是重新上電才能與芯片通信。,拉高CS,通過簡單的發送Power down指令B9H,拉低CS,就能使芯片進入掉電模式,在程序最結束循環前加入掉電函數,實驗現象就是在第二次下載時讀不到ID,當然在沒有重新上電的情況下。如果我們之前用指令ABH讀取ID,那麼就沒有進入掉電模式的實驗現象了。

來自學習野火教程,純個人理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章