FAT32 f_write FR_DISK_ERR (Transmit FIFO underrun)

1戚炫、問題描述

使用FAT32?f_write 多次執(zhí)行寫操作時(shí)剑刑,會(huì)報(bào)FR_DISK_ERR錯(cuò)誤,而且是剛開始寫不報(bào)錯(cuò)双肤,寫幾次后會(huì)一直報(bào)錯(cuò)施掏。

設(shè)斷點(diǎn)跟蹤到HAL_SD_WriteBlocks中,在調(diào)用SDMMC_CmdWriteMultiBlock時(shí)茅糜,會(huì)報(bào)SDMMC_ERROR_TX_UNDERRUN,意思 是Transmit FIFO underrun

2七芭、原因分析

如下圖所示,SDMMC開始寫操作時(shí)蔑赘,首先要將數(shù)據(jù)寫入FIFO,然后再將FIFO中的數(shù)據(jù)取出狸驳,通過Data path寫入到SD卡预明。因?yàn)闀r(shí)鐘頻率比較快(最高可達(dá)20MHz),因此往FIFO里裝填數(shù)據(jù)必須非嘲夜浚快撰糠,否則后面從FIFO取數(shù)時(shí)就會(huì)取不到數(shù),報(bào)出Transmit FIFO underrun錯(cuò)誤辩昆。

可能原因1:

????可能是通過APB2總線往FIFO裝填數(shù)時(shí)阅酪,發(fā)生了中斷,導(dǎo)致總線被占用或其他資源被占用汁针,從而無法及時(shí)完成FIFO的裝填术辐,而后面從FIFO取數(shù)的頻率又非常快施无,導(dǎo)致無法取到數(shù)辉词。

可能原因2:

????SD卡寫的時(shí)候出現(xiàn)了壞塊,導(dǎo)致寫不成功猾骡,在寫失敗時(shí)需要重試一下瑞躺。

可能原因3:

? ? 寫速度太快,導(dǎo)致FIFO來不及裝填卓练,產(chǎn)生錯(cuò)誤隘蝎,需要降速。

3襟企、解決辦法之禁用中斷

在調(diào)用f_write之前調(diào)用? __disable_irq()? 接口關(guān)閉中斷,寫操作完成后調(diào)用? __enable_irq()接口啟用中斷:

__disable_irq()狮含;

if(FR_OK? ==f_write())

{ }

else

{}

__disable_irq() ;

優(yōu)點(diǎn):簡單

缺點(diǎn):在寫操作期間CPU無法響應(yīng)中斷

4顽悼、解決辦法之寫重試

重寫bsp_driver_sd.c文件中的BSP_SD_WriteBlocks函數(shù)是_weak 函數(shù),可以在自己的源文件myfile.c中重寫該函數(shù)几迄,當(dāng)寫發(fā)生錯(cuò)誤后蔚龙,清除錯(cuò)誤標(biāo)記,再重試幾次即可映胁,在我的單片機(jī)上木羹,一般第一次重試即可成功

uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout)

{

int i;

for (i = 1; i <= TY_SDIO_RETRY_MAX; i ++)

{

if (HAL_SD_WriteBlocks(&hsd, (uint8_t *)pData, WriteAddr, NumOfBlocks, Timeout) == HAL_OK)

{

if (i > 1)

printf("[INFO] SDIO writing succeeded: retry %d.\n", i);

return (MSD_OK); // Succeeded

}

else

{

printf("[ERROR] SDIO writing failure: retry %d, error code %#x, addr %#x, %u blocks.\n",

i, hsd.ErrorCode, WriteAddr, NumOfBlocks);

HAL_SD_Abort(&hsd); //clear error flag

}

}

return (MSD_ERROR);

}

優(yōu)點(diǎn):上層應(yīng)用軟件不需要更改,也不需要禁用中斷

缺點(diǎn):頻率較高時(shí)(我的是30MHZ)時(shí)解孙,經(jīng)常會(huì)發(fā)生寫重試

5坑填、解決辦法之降低寫頻率(降速)

更改sdio.c中的MX_SDIO_SD_Init函數(shù),將hsd.Init.ClockDiv = 0改為hsd.Init.ClockDiv = 2弛姜,寫頻率會(huì)變成原來的1/2脐瑰,在我的單片機(jī)上降頻1/2之后,寫錯(cuò)誤將不再發(fā)生廷臼。

優(yōu)點(diǎn):非常簡單苍在;無需禁用中斷绝页;無需對(duì)上層軟件進(jìn)行修改。

缺點(diǎn):降低了寫速度

6寂恬、參考資料

1续誉、https://blog.frankvh.com/2011/12/30/stm32f2xx-stm32f4xx-sdio-interface-part-2/

2、STM32F405/415 Reference manual

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末初肉,一起剝皮案震驚了整個(gè)濱河市酷鸦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朴译,老刑警劉巖井佑,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異眠寿,居然都是意外死亡躬翁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門盯拱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盒发,“玉大人,你說我怎么就攤上這事狡逢∧ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵奢浑,是天一觀的道長蛮艰。 經(jīng)常有香客問我,道長雀彼,這世上最難降的妖魔是什么壤蚜? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮徊哑,結(jié)果婚禮上袜刷,老公的妹妹穿的比我還像新娘。我一直安慰自己莺丑,他們只是感情好著蟹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梢莽,像睡著了一般萧豆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蟹漓,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天炕横,我揣著相機(jī)與錄音,去河邊找鬼葡粒。 笑死份殿,一個(gè)胖子當(dāng)著我的面吹牛膜钓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卿嘲,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼颂斜,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了拾枣?” 一聲冷哼從身側(cè)響起沃疮,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梅肤,沒想到半個(gè)月后司蔬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姨蝴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年俊啼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片左医。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡授帕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浮梢,到底是詐尸還是另有隱情跛十,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布秕硝,位于F島的核電站芥映,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏远豺。R本人自食惡果不足惜屏轰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憋飞。 院中可真熱鬧,春花似錦姆吭、人聲如沸榛做。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽检眯。三九已至,卻和暖如春昆淡,著一層夾襖步出監(jiān)牢的瞬間锰瘸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工昂灵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留避凝,地道東北人舞萄。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像管削,于是被迫代替她去往敵國和親倒脓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354