一個關於SD卡讀寫超時的話題

2021-03-05 茶話MCU


在基於STM32 MCU的應用開發中,經常會有人用到SD卡。有人發現在對SD卡進行讀寫時,偶爾會遇到SD卡讀寫失敗的情況。尤其是單獨對SD卡進行讀寫正常、或者非多任務環境下運行正常,而當SD讀寫跟其它程序代碼混在一起或在多任務環境下運行時就容易發生異常。比方如下情形:

1、使用STM32F4的SDIO,用CubeMX配置。用polling模式的時候,出現SD卡寫的時候卡死的情況。後來用DMA模式就好了。

2、STM32F746DISCO開發板和官方1.3.0例程基礎上使用了FreeRTOS系統,改為DMA傳輸後還是不穩定。後來把SDIO相關的中斷優先級別調高,SDIO中斷設為3,DMA發送和接收的調為4,比FreeRTOS的系統用戶級別高,解決問題。

 3、在FreeRTOS+FatFs+STM32F429的基礎上。

A.單個任務操作,SD卡讀寫沒有問題

B.多個任務,SD卡和U盤兩個任務,優先級別一樣,SD卡無法讀寫,U盤可以讀寫,調中斷級別,調整堆棧大小都沒有用。

C.還是多任務,SD卡和U盤兩個任務,甚至更多任務,只要把SD卡任務的優先級別調為最高,則SD卡,U盤讀寫都正常。

 4、使用STM32官方SDIO的SD CARD驅動的時候,單任務的時候沒有出現錯誤,使用多任務的時候經常出現問題,表現為讀取文件的時候沒有問題,經常點擊屏幕的時候就會出問題,最後通過仿真找到出錯點就是讀取數據向SD卡發送CD17命令時出現SD_RX_OVERRUN這個錯誤,產生原因為讀取FIFO溢出. 通過仿真與測試發現問題主要出現在讀取過程中不能打斷。

在兩個讀取函數裡面SD_ErrorSD_ReadMultiBlocks(u32 addr, u32 *readbuff, u16 BlockSize, u32NumberOfBlocks);SD_Error SD_ReadBlock(u32 addr, u32 *readbuff, u16BlockSize); 加上臨界保護可以消除問題。同樣寫操作的時候也一樣需要加臨界保護。

 

以上羅列的情形,根本上講因為SD卡讀寫過程中發生了超時錯誤導致讀寫異常。應對措施視具體應用要求可能有所差異,最終目的都是為了避免SD卡讀寫過程中的超時錯誤。比如將查詢模式改為DMA模式、調整相關SD卡讀寫過程中所涉及中斷的優先級、提升SD卡讀寫任務的優先級、將SD卡讀寫程序放在臨界保護區運行或者在讀寫SD卡操作時關閉中斷等。

我們可以從SD卡相關協議得知,在對SD卡進行讀寫操作時是有超時保護及約束機制的。對於標準卡和高容量卡的讀寫超時定義還有所差異。細節請參考SD卡相關規格書。SD Specifications ----Physical Layer Simplified Specification。





================================

往期話題連結:

1、STM32開發生態系統簡介

2、關於STM32Cube的幾個常見問題

3、聊聊STM32晶片的DFU編程及相關話題


掃描或長按二維碼可關注公眾號

相關焦點

  • sd卡防寫怎麼去掉
    sd卡防寫怎麼去掉?相信很多人碰到這種情況都不知道如何去處理,那麼碰到這種情況,正確方法應該是怎麼樣的呢?下面讓我們一起去了解吧。02SD卡:可以發現在SD卡的側邊有一個look開關。如果它是在防寫的方向,就說明SD卡防寫處於開啟的狀態,只需要將它滑到另一端,將它的防寫關閉就可以了。
  • Linux SD/MMC/SDIO驅動分析
    理論上要求發送 CMD58 獲得 SD 卡電壓參數,但實際過程中由於事先都知道了 SD 卡的工作電壓,因此可省略這一步簡化程序。協議書上也建議儘量不要用這個命令。  4. SD 卡讀寫超時時間要按照協議說明書書上的給定值 ( 讀超時: 100ms ;寫超時: 250ms) ,這個值要在程序中準確計算出來,否則將會出現不能正常讀寫數據的問題。
  • 乾坤合一~Linux SD/MMC/SDIO驅動分析
    SD 卡讀寫超時時間要按照協議說明書書上的給定值 ( 讀超時:100ms ;寫超時:250ms) ,這個值要在程序中準確計算出來,否則將會出現不能正常讀寫數據的問題。我自己定義了一個計算公式:超時時間 =( 8/clk )*arg5. 2GB 以內的 SD 卡 ( 標準卡 ) 和 2GB 以上的 SD 卡 ( 大容量卡 ) 在地址訪問形式上不同,這一點尤其要注意,否則將會出現無法讀寫數據的問題。
  • SD卡初始化以及命令詳解
    TF卡引腳功能表由此可見,TF卡比SD卡少了一個VSS引腳,也就是少了一個供電引腳另外電路設計時若SD卡使用SPI模式,那麼不用的幾根數據線應加上上拉電阻,否者會因為這幾根數據線的電流震蕩引起電流損耗 "spisd.h"    //預定義SD卡類型  u8  SD_Type=0;//SD卡的類型     //這部分應根據具體的連線來修改!
  • SD卡防寫問題
    SD卡防寫問題本文寫的問題是工作中遇到的一個問題,很小的問題,只是一個開關的問題。
  • SD卡的管腳排列和總線讀寫方式
    ASPENCORE 旗下媒體SD卡的引腳定義:
  • SD卡受損怎麼修復?SD卡在電腦讀不出來解決方法!
    SD卡受損怎麼修復?SD卡在電腦讀不出來怎麼解決?我最近就遇到有個案例,客戶急匆匆的找到我,原始他是需要恢復行車記錄儀的視頻,因為SD卡格式化了,裡面的資料視頻以及照片全沒了;另外一個客戶的SD卡裡的婚禮的錄像視頻文件,因為裡面有個文件出錯了,一直卡住了,等好了之後,SD卡裡的錄像就都丟失了,需要恢復。既然有那麼多情況會丟失數據,我們改怎麼辦呢?下面看看SD卡格式化的問題。
  • 比擴容卡還垃圾的存在,7.9元32G夏科SD卡,還沒用呢就翻車了
    前段時間,我很用心體驗了一下擴容micro sd卡。用來評測的那張19.9大洋入手的128G micro sd卡,原來是由32G卡擴容而來的。雖然是擴容卡,但是能用,而且我當時為了測試這種卡的質量到底如何,還特意高強度使用了一個多星期,竟然沒有壞掉。
  • stm32cubeIDE移植fatfs系統讀寫sd卡項目時malloc.c報錯的解決
    今天在做項目時用到了正點的fatfs文件系統讀寫sd卡的項目,當時這個項目是keil5環境開發的。我用stm32cuebIDE進行移植時發現報錯了。如下圖。看著有些糊塗,因為上邊明明已經定義了5個變量,但我發現一個小細節下邊這是keil5下的代碼://內存池(64位元組對齊)__align(64) u8 mem1base[MEM1_MAX_SIZE]; //內部SRAM內存池__align
  • sdcardfs 淺析
    如果你也是第一次接觸sdcardfs,一定會奇怪,sdcardfs是sd卡的文件系統嗎?\sdcard分區又和他們是什麼關係呢?我們先來說說sd卡和\sdcard分區,早期的安卓手機因為內部存儲空間太小,所以會使用sd卡這種外部存儲來增大可用空間。與此同時\sdcard分區也出現了,主要存儲一些音樂電影等文件。然而這並不代表\sdcard分區就歸sd卡所用。
  • SD卡損壞怎麼修復?只要幾招就搞定
    SD卡也是一種儲存設備,但是也會出現各種問題,比如sd卡數據丟失,或者出現sd卡無法讀取的情況,那麼有什麼方法可以快速修復呢?下面讓我們一起看看SD卡快速修複方法吧!1、將SD卡插入讀卡器,接到電腦的USB接口; 2、連接好之後,打開此電腦,出現可移動磁碟說明連接成功; 3、按下Wndows+X 鍵盤上的2個按鍵,在彈出的菜單中選擇命令提示符(管理員);4、chkdsk H:/F,(H:就是你的sd卡盤符,/F是修復參數。)
  • sd卡數據損壞怎麼恢復?半小時幫你搞定的技巧!
    sd卡數據損壞怎麼恢復?SD卡也是一種儲存設備,裡面存儲著一些重要的資料和數據,但是有時候也避免不了會出現sd卡數據丟失,或者出現sd卡無法讀取的情況,那麼有什麼方法可以快速恢復損壞的sd卡數據呢?對了技巧其實並不難!下面我們來看看怎么半小時幫搞定吧!
  • sd卡受損怎麼修復?選對方法,恢復只需一小時!
    sd卡受損怎麼修復?SD卡也是一種儲存設備,當出現sd卡數據丟失,或者出現sd卡無法讀取的情況,那麼有什麼方法可以快速修復呢?下面讓我們一起看看SD卡快速修複方法吧!修復SD卡也好,恢復SD中的數據也好,其實並不難!
  • sd卡 原理 - CSDN
    BL0是s5pv210內部IROM固化的代碼,這段代碼根據OM引腳配置狀態來選擇從哪個外部存儲設備加載BL1段代碼(實際上BL1代碼就是我們編寫的UBOOT的前8K代碼,這段代碼要包含完整的將後半部UBOOT代碼複製和清bss段的功能,當然我們要從SD卡啟動燒寫在上面的UBOOT,OM引腳就必須配置為從SD卡啟動配置)。
  • 目前世界上最快讀寫速度的SD存儲卡CFexpress 1TB卡問世
    目前世界上最快讀寫速度的SD存儲卡CFexpress 1TB卡問世,而ProGrade Digital,也成為第一家公開展示具有1TB容量的CFexpress 1.0技術的公司。CFexpress 1TB卡在本屆NAB展會上,存儲設備製造商ProGrade Digital公開展示了其最新研發的一款擁有目前世界上最快讀寫速度的SD存儲卡CFexpress 1TB卡。
  • 7.9元 32G夏科SD卡質量堪憂,剛到手就壞掉了
    前段時間,用心體驗了一下擴容micro sd卡,19.9大洋入手的128G micro sd卡,原來是由32G卡擴容而來的。雖然是擴容卡,但是能用,而且我當時為了測試這種卡的質量到底如何,還使用了一個多星期,雖然最終確定是擴容卡,但質量還將就。
  • 一文帶你認清SD卡、TF卡、SIM卡!
    1.定義 SD卡是Secure Digital Card的英文縮寫,直譯就是「安全數字卡」。一般用於數位相機等,做外存儲器用。 TF卡即是T-Flash卡,又叫micro SD卡,即微型SD卡。
  • 為何安卓版微信、支付寶強制需要SD卡權限?這五個原因道出真相
    小編我嘗試從開發者的角度來分析一下這個問題的原因: 1.一個大型App可能涉及幾條甚至幾十條業務線,如果針對Android 4.4以上的系統作特殊處理的話,就需要推動所有的業務線都修改自己的讀寫邏輯,這種有時甚至涉及跨部門的問題,我不覺得一個小小的開發者或者產品經理能夠推動。
  • 三星PRO Plus 256GB SD卡評測:旗艦型號加入SD卡會怎樣
    而在未來幾年內,SD卡作為相機的主要存儲介質這一現象幾乎是不會改變的。三星也瞄準了時機,重新填補了SD卡產品線,推出了兩款SD卡系列:PRO Plus與EVO Plus,今天測試的是256GB容量版本PRO Plus存儲卡。
  • Mifare系列射頻卡讀寫器的研製
    現在常見的是接觸式IC卡,這類卡的讀寫操作速度較慢,操作也不方便,每次讀寫時必須把卡正確地插入到讀寫器的口槽才能完成數據交換。這樣,在公交、考勤等需要頻繁讀寫卡的場合就很不方便,而且IC卡的觸點暴露在外,容易損壞和搞髒而造成接觸不良。非接觸式IC卡是根據電磁感應原理產生的。