Stm32(CubeMx)通過SPI向flash寫入和輸出

這是一個卑微電子信息學員的開始

學習stm32

寒假開始了,卑微電子信息學員開始了stm32的學習過程。

stm32(CubeMx)通過SPI向flash寫入和輸出

一. SPI

  1. SPI只是是一種高速的,全雙工,同步的通信總線,在芯片的管腳上只佔用四根線,節約了芯片的管腳,以stm32爲例,當 、想通過SPI向flash寫入數據的時候,就需要用到SPI。SPI有4個引腳可以供我們使用,分別是:/CS;CLK;DIO;DO腳,其中,當使用CubeMx時,在SPI1中將Mode選爲Full-Duplex-Master,CLK;DIO;DO腳會自動初始化,而/CS腳需要自己定義,在Stm32107中選用的flash是W25X16,對應的管腳號是PB9,不同的開發板可能會有差異,引腳定義如下圖:

在這裏插入圖片描述

  1. 在Cube的stm32f1xx_hal_spi.c函數庫中,其實只有兩個操作——HAL_SPI_Transmit()和HAL_SPI_TransmitReceive(),在很多別的網站上都有很多人將另一個函數HAL_SPI_Receive()放了出來,但是,仔細分析HAL_SPI_Receive(),在讀寫flash的操作中,它可以說沒有任何單獨列出的價值,在庫函數的943行return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout);你會發現這個函數在基礎的應用階段沒有什麼價值,它最終調用了先前給出的函數,只需要前兩個就夠了;

  2. 在開始的時候,我一直很迷茫,HAL_SPI_Transmit()函數傳送了一個數組的指針和長度,至於這個數組應該是什麼內容完全沒有一點頭緒,在網上搜索了很久也沒有找到答案,後來終於明白,這個函數之負責將你給的uint8_t類型的指針以及長度給到SPI,至於SPI應該進行什麼操作,和這個函數就沒有任何關係了(我曾經錯誤的以爲HAL_SPI_Transmit()就將數據寫入flash,而HAL_SPI_Receive()可以將flash的數據直接讀出來);

  3. HAL_SPI_Transmit()函數只傳達你要求長度的數據,接下來,SPI根據你傳遞的內容控制flash進行你最終想進行的flash讀寫操作,而SPI要求的數據具有一定的格式,你必須按照SPI要求的格式傳遞相應的數據,不然SPI不會進行你要求的任務,附SPI的數據格式如下:
    在這裏插入圖片描述

  4. SPI在進行任何操作前必須在/CS(PB9)給一個低電壓,結束操作後給一個高電壓,這很關鍵,CubeMx的SPI庫中沒有進行這一操作,需要自己完成,傳輸數據可以分段完成,比如我自己喜歡先傳輸instruction name,再傳輸地址,最後是接收數據或者傳輸數據;

  5. 我個人是爲每一個操作寫了一個函數,(我不知道怎麼在這裏插入代碼,如果你有需要,可以留言告訴我)
    在這裏插入圖片描述
    這是我自己定義的,個人認爲這樣會比純寫數字要好區分和使用,同時代碼更加具有觀賞性。
    在這裏插入圖片描述
    這是定義的數組
    在這裏插入圖片描述
    我個人喜歡將函數定義的比較細分化,也不是很喜歡打註釋,但是我覺得總體可讀性比較強,函數名稱也就是的它的功能,就不再打註釋了
    在這裏插入圖片描述
    代碼比較長,需要電子版和我留言
    在這裏插入圖片描述
    這是最重要的兩個函數,比較重要,放在後面。第一個函數向flash寫入數據,先發送命令代號,緊接着發送要寫入的地址,最後將要寫的數據發送。第二個是讀數據函數,大體相似,最後是發送接收數據的指針(地址)。

  6. 我的STM32接了一塊LED屏作爲顯示,所以最後有一個LED顯示函數;

  7. 在進行擦除操作後,SPI會自動進行write disable,這個需要注意,還有就是進行擦除或者寫入操作後,它需要時間,如果直接進行後續操作會發生讀寫失敗;

  8. 在進行寫入操作前先檢查該區域是否已經被寫入過,如果被寫入過需要先進行擦除操作,不然會發生寫入失敗;

本文僅供學習使用,希望可以對你的stm32學習有幫助

發佈了5 篇原創文章 · 獲贊 1 · 訪問量 2856
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章