STM32F429 USB能識別,SD卡識別不了----被F429坑慘了

最近在搞一個PC端通過USB識別STM32F429的SD的功能,並能進行讀寫的案例,真是被坑慘了....

1、一開始用的野火挑戰者F429和正點原子F407官方的例程,野火挑戰者F429的例程(USB-SD-FLASH模擬U盤)對SPI FLASH的識別都沒問題,但是移植了SD的讀寫後就出現了問題,就只能識別Flash,不能識別SD,我還一直以爲是SD卡驅動的問題,但是單獨的SD卡讀寫又是正常的,沒有問題;試了了野火的驅動和正點原子的驅動,結果都是一樣的,很納悶了。也用正點原子的F407的開發板試了例程(實驗51 USB讀卡器(Slave)實驗),能正常的識別SPI FLASH ,也能正常的識別SD卡(4G卡),這樣換來換去的調試了很久,還對比了彼此的硬件,搞得差不多每個元件都搞成一樣了。悲催了。但結論是應該不是SD卡驅動的問題。

2、繼續用F429的板子調試,找問題。一開始用野火的F429的板子調試,就一直返回SD響應超時,但是SD卡驅動都是用的官方的,差點就放棄了。後來就慢慢調咯,也對它不報希望了,就用我們自己的板子調,一開始在結構體USBD_MICRO_SDIO_fops內,前幾個都能循環的跑過,就是到了STORAGE_Read,就跑不到這步,然後仿真,是一直在USB的庫函數SCSI_Read10()內返回錯誤-1,我都沒改過USB的任何參數啊,蒼天啊!調到這裏就可以鎖定在USB的問題了,驅動肯定沒問題,那就是USB的其它問題了。

3、繼續調試,找相關的文檔,對比F429 與F427的區別。帶着這兩個問題去查看了參考手冊與代碼,果然,STM32F429的USB的時鐘還真有點特殊(不知道其它芯片是不是也是這樣),其來自於PLL輸出,而不是我們熟知的APB1、APB2:

從時鐘樹中我們可以看出:(1)的輸出是系統時鐘,(2)的輸出是USB時鐘。相關公式:

當然(2)的輸出不僅僅是給USB提供時鐘,還給RNG與SDIO提供時鐘:

STM32F407的時鐘

STM32F429的時鐘

F429系統時鐘爲180MHz,USB OTG FS時鐘變爲51MHz,超過了正常的48MHz(F407的USB Clock是48M),導致USB不能正常工作。

問題終於找到了,黃天不負啊!

怎麼解決呢? 那就對F429降頻唄,將PLL_N = 360改爲336,即主頻168M,與F407的一致;程序裏的delay_init(180); 可以不用改,重新編譯後燒錄,識別SD卡OK了,太興奮了.....,先前是隻能看到識別USB,能看到U盤,但是沒用下面的數字,也點擊步進去。現在好了 ,呵呵呵.....

4、還有個問題,就是FS與HS的區別,將目前的USE_USB_OTG_FS,換成USE_USB_OTG_HS,USE_EMBEDDED_PHY,GPIO口還是PA11,PA12;但是就識別不了,USB和SD卡都識別不到了。後續再繼續調試看看

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