Fatfs文件系統,f_open函數返回值爲FR_DISK_ERR解決方法

最近在操作TF卡,芯片stm32f103c8t6,編譯環境KEIL,金士頓32G卡,用Fatfs文件系統向卡中寫入數據。

出現的問題:f_open函數返回值爲FR_DISK_ERR

FR_DISK_ERR,               /* (1) A hard error occurred in the low level disk I/O layer */

低級磁盤I/O層中發生硬錯誤

主要原因:重點檢查diskio.c文件中的disk_initialize()、disk_status()、disk_read()、disk_write()這幾個函數

解決方法總結:

1 改寫扇區函數

2 每次寫了之後都加一個小延時,等待一段時在查看f_open的返回值

3 單次的傳輸是不是太大?  傳輸字節幾百的話是沒有問題的,現在傳輸的每次是4000多字節 就會出現這種錯誤的情況

4 看看頻率最多支持多少,從底往上都要看。SDIO有頻率,CPU有主頻,速度過快也不行啊,你最好折中速度,比如試試2000,再試試1000,或者3000等等。

5 重點檢查diskio.c文件中的disk_initialize()、disk_status()、disk_read()、disk_write()這幾個函數

6  將 FIL fil; 從函數外拿出,定義爲全局變量,即可解決。

7 確保f_mount已經掛載上了,返回值是正確的。確保硬件初始化完成了。

8 每次插入usb都會進行枚舉,我們要等到可執行用戶程序的時候才進行f_open

9 一開始時候低速,查詢卡信息發現是"SD V2HC",然後將主頻從400k提高10MBit時候經常出現FR_DISK_ERR,慢慢降低到1.7MBit時候就FR_OK了

10 f_write 一直失敗  FR_DISK_ERR,回來發現在 在diskio 的 disk_write 操作裏要加上卡的狀態等待。對的,根據你這個方法能解決FR_DISK_ERR錯誤,必須要等到SD卡處於TRANSFER的狀態纔行

11 FF.C文件,移植時,TF卡程序一些列要配套,我這次解決問題的方法是重新更新了下ff.c   ff.h   diskio.c  diskio.h  文件,問題解決了。

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