TASK1: STM32F051通过SPI与常见FLASH(W25X16/64)通信
TASK1: STM32F051通過SPI與常見FLASH(W25X16/64)通信
本人在實習期間的第一項學習任務就是在STM32F051的開發板STM32F0DISCOVERY上學習基本操作,并掌握SPI通信協議,實現與常見FLASH的通信以及讀寫其他外設的寄存器等。
在此前不久我曾利用STM32F103開發過一些小的課程設計,如波形發生器、電子鐘等等。而STM32F051是我第一次接觸,盡管都是STM32體系,但具有不同的內核,103為Cotex-M3而051為Cotex-M0。因此在寄存器、時鐘、引腳管理等細節處理上會有一些不同,而正是這些不同給我后續的學習與調試帶來了較大的問題。
具體學習過程不細說,在此我記錄總結我在學習過程遇到的幾個問題:
1. STM32的開發,無論是用直接讀寫寄存器的手段還是利用庫函數開發的方式,都必須仔細跟蹤閱讀中文手冊中相關的章節,如用庫函數開發,還得對照閱讀庫函數文件,學習了解其中各個函數的用途。這樣能夠快速的了解該套MCU與其他的MCU的差別,比如RCC_AHBPeriphClockCmd這類外圍時鐘使能命令函數是非常重要的,但在不同型號的STM32MCU中卻有著很不同的分配;
2. STM32F051中,SPI的發送和接收都有一個FIFO BUFFER,這是它與其他型號的較大區別。因為這個FIFO的存在,使得它可以緩存下一些數據,提高傳輸的速率,但由此也帶來一些問題需要注意。該BUFFER是32位,即4字節大小,默認的配置下,每當buffer里的數據達到16位,spi控制器即會自動將buffer里的數據讀到內存中,或自動將其發出。但這是最適合于傳輸的數據為16位的情況,當我們要傳輸的數據幀大小為小于等于8位時,為了數據不紊亂,需要修改buffer的閾值為8位,利用下述語句SPI_RxFIFOThresholdConfig(SPI2, SPI_RxFIFOThreshold_QF);
3. STM32F051中,盡管GPIO口的復用功能與其他型號的STM32幾乎一致,但在配置時也有值得注意的不同點。比如在051中,并不能像STM32F103等系列中一樣,直接用一條函數配置GPIO口為復用推挽,而必須分開配置。相關語句如下:左側為STM32F103,右側為051
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; ------>> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;?
此外,STM32F051中,GPIO口的復用功能也許在配置時指定啟用,否則將不能正常使用其復用的功能,相關語句如下:該語句將PB13配置為復用類0(包含SPI)
GPIO_PinAFConfig(GPIOB, ?GPIO_PinSource13 , GPIO_AF_0);
4. 在配置完畢后,我花費了較久時間來調試解決一個BUG。當時我發現PB12,即SPI的NSS位選口無法正常拉低,這樣導致主從設備間不能正常通信。后來經過檢查,我發現由于我PB13/14/15口與PB12口是分開配置的,先配置了PB12口,再調用相關函數配置了其余GPIO口,而在配置PB12口時,我對GPIOB的時鐘尚未使能,如此導致了PB12的配置無效化,從而產生了上述的問題。當我將GPIOB使能的語句提前后,bug如期消除;
5. 對于不同的外設,其支持的SPI MODE各不相同,如W25X16/64等FLASH普遍支持MODE0和MODE3,而有些設備卻只支持MODE0等。不僅如此,各外設所要求的數據格式也不同,這就需要我們在配置主機跟外設的通信時,除了閱讀主機開發手冊之外,還需自習查閱外設的手冊,尤其是SPI部分,只有將主機的SPI配置和外設的相匹配,兩者才能正常通信。上述的MODE是CPOL和CPHA的組合模式。
6. 一般通過SPI配置外設寄存器時,都是先發送命令,再發送地址,也可認為命令和地址組成了數個字節的長指令,接著外設會發送一些主機需求的數據回來。而主機為了外設能夠正常進入發送這個階段以及其自身能夠正常讀取這些數據,它必須先發送dummy數據,以驅動SCK和NSS信號的工作。這個dummy數據一般為0x00,或者0xFF,而不能任意取值,因為任意取值很可能會觸發一些命令或隱藏命令,導致意料之外的錯誤發生。
7. SPI通信在KEIL的單步調試中很容易出現問題,這是因為STM32F051的SPI寄存器部分位只能訪問一次,一旦由KEIL訪問了,則本身函數就會訪問出錯。其次在調試中接入示波器等設備也會產生較大的干擾,影響通信的正常進行。我在調試時正是因為示波器的干擾使得從機返回的數據永遠處于高電平狀態,原因至今不明,撤去示波器后,SPI可以全速通信。
總結
以上是生活随笔為你收集整理的TASK1: STM32F051通过SPI与常见FLASH(W25X16/64)通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片怎么做成透明背景?如何把图片改成透明
- 下一篇: 学校计算机技术管理员制度,学校计算机室管