最近在操作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 文件,問題解決了。