日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TASK1: STM32F051通过SPI与常见FLASH(W25X16/64)通信

發(fā)布時間:2023/12/31 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TASK1: STM32F051通过SPI与常见FLASH(W25X16/64)通信 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

TASK1: STM32F051通過SPI與常見FLASH(W25X16/64)通信

本人在實習期間的第一項學習任務就是在STM32F051的開發(fā)板STM32F0DISCOVERY上學習基本操作,并掌握SPI通信協(xié)議,實現(xiàn)與常見FLASH的通信以及讀寫其他外設的寄存器等。

在此前不久我曾利用STM32F103開發(fā)過一些小的課程設計,如波形發(fā)生器、電子鐘等等。而STM32F051是我第一次接觸,盡管都是STM32體系,但具有不同的內核,103為Cotex-M3而051為Cotex-M0。因此在寄存器、時鐘、引腳管理等細節(jié)處理上會有一些不同,而正是這些不同給我后續(xù)的學習與調試帶來了較大的問題。

具體學習過程不細說,在此我記錄總結我在學習過程遇到的幾個問題:

1. STM32的開發(fā),無論是用直接讀寫寄存器的手段還是利用庫函數(shù)開發(fā)的方式,都必須仔細跟蹤閱讀中文手冊中相關的章節(jié),如用庫函數(shù)開發(fā),還得對照閱讀庫函數(shù)文件,學習了解其中各個函數(shù)的用途。這樣能夠快速的了解該套MCU與其他的MCU的差別,比如RCC_AHBPeriphClockCmd這類外圍時鐘使能命令函數(shù)是非常重要的,但在不同型號的STM32MCU中卻有著很不同的分配;

2. STM32F051中,SPI的發(fā)送和接收都有一個FIFO BUFFER,這是它與其他型號的較大區(qū)別。因為這個FIFO的存在,使得它可以緩存下一些數(shù)據(jù),提高傳輸?shù)乃俾?#xff0c;但由此也帶來一些問題需要注意。該BUFFER是32位,即4字節(jié)大小,默認的配置下,每當buffer里的數(shù)據(jù)達到16位,spi控制器即會自動將buffer里的數(shù)據(jù)讀到內存中,或自動將其發(fā)出。但這是最適合于傳輸?shù)臄?shù)據(jù)為16位的情況,當我們要傳輸?shù)臄?shù)據(jù)幀大小為小于等于8位時,為了數(shù)據(jù)不紊亂,需要修改buffer的閾值為8位,利用下述語句SPI_RxFIFOThresholdConfig(SPI2, SPI_RxFIFOThreshold_QF);

3. STM32F051中,盡管GPIO口的復用功能與其他型號的STM32幾乎一致,但在配置時也有值得注意的不同點。比如在051中,并不能像STM32F103等系列中一樣,直接用一條函數(shù)配置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。當時我發(fā)現(xiàn)PB12,即SPI的NSS位選口無法正常拉低,這樣導致主從設備間不能正常通信。后來經(jīng)過檢查,我發(fā)現(xiàn)由于我PB13/14/15口與PB12口是分開配置的,先配置了PB12口,再調用相關函數(shù)配置了其余GPIO口,而在配置PB12口時,我對GPIOB的時鐘尚未使能,如此導致了PB12的配置無效化,從而產(chǎn)生了上述的問題。當我將GPIOB使能的語句提前后,bug如期消除;

5. 對于不同的外設,其支持的SPI MODE各不相同,如W25X16/64等FLASH普遍支持MODE0和MODE3,而有些設備卻只支持MODE0等。不僅如此,各外設所要求的數(shù)據(jù)格式也不同,這就需要我們在配置主機跟外設的通信時,除了閱讀主機開發(fā)手冊之外,還需自習查閱外設的手冊,尤其是SPI部分,只有將主機的SPI配置和外設的相匹配,兩者才能正常通信。上述的MODE是CPOL和CPHA的組合模式。

6. 一般通過SPI配置外設寄存器時,都是先發(fā)送命令,再發(fā)送地址,也可認為命令和地址組成了數(shù)個字節(jié)的長指令,接著外設會發(fā)送一些主機需求的數(shù)據(jù)回來。而主機為了外設能夠正常進入發(fā)送這個階段以及其自身能夠正常讀取這些數(shù)據(jù),它必須先發(fā)送dummy數(shù)據(jù),以驅動SCK和NSS信號的工作。這個dummy數(shù)據(jù)一般為0x00,或者0xFF,而不能任意取值,因為任意取值很可能會觸發(fā)一些命令或隱藏命令,導致意料之外的錯誤發(fā)生。

7. SPI通信在KEIL的單步調試中很容易出現(xiàn)問題,這是因為STM32F051的SPI寄存器部分位只能訪問一次,一旦由KEIL訪問了,則本身函數(shù)就會訪問出錯。其次在調試中接入示波器等設備也會產(chǎn)生較大的干擾,影響通信的正常進行。我在調試時正是因為示波器的干擾使得從機返回的數(shù)據(jù)永遠處于高電平狀態(tài),原因至今不明,撤去示波器后,SPI可以全速通信。

總結

以上是生活随笔為你收集整理的TASK1: STM32F051通过SPI与常见FLASH(W25X16/64)通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。