新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 學習STM32之SD卡總結

        學習STM32之SD卡總結

        作者: 時間:2016-11-18 來源:網絡 收藏
        由于自己也在使用SD卡,使用的過程中也遇到了一些問題,下面是在EDN論壇上zxb1717高手的經驗,希望可以幫助大家
        調試關鍵點:
        1. 上電時要延時足夠長的時間給SD卡一個準備過程,在我的程序里是5秒,根據不同的卡設置不同的延時時間。SD卡初始化第一步在發送CMD命令之前,在片選有效的情況下首先要發送至少74個時鐘,否則將有可能出現SD卡不能初始化的問題。
        2. SD卡發送復位命令CMD0后,要發送版本查詢命令CMD8,返回狀態一般分兩種,若返回0x01表示此SD卡接受CMD8,也就是說此SD卡支持版本2;若返回0x05則表示此SD卡支持版本1。因為不同版本的SD卡操作要求有不一樣的地方,所以務必查詢SD卡的版本號,否則也會出現SD卡無法正常工作的問題。
        3. 理論上要求發送CMD58獲得SD卡電壓參數,但實際過程中由于事先都知道了SD卡的工作電壓,因此可省略這一步簡化程序。協議書上也建議盡量不要用這個命令。
        4. SD卡讀寫超時時間要按照協議說明書書上的給定值(讀超時:100ms;寫超時:250ms),這個值要在程序中準確計算出來,否則將會出現不能正常讀寫數據的問題。我自己定義了一個計算公式:超時時間=(8/clk)*arg。
        5. 2GB以內的SD卡(標準卡)和2GB以上的SD卡(大容量卡)在地址訪問形式上不同,這一點尤其要注意,否則將會出現無法讀寫數據的問題。如標準卡在讀寫操作時,對讀或寫命令令牌當中的地址域符初值0x10,表示對第16個字節以后的地址單元進行操作(前提是此SD卡支持偏移讀寫操作),而對大容量卡讀或寫命令令牌當中的地址域符初值0x10時,則表示對第16塊進行讀寫操作,而且大容量卡只支持塊讀寫操作,塊大小固定為512字節,對其進行字節操作將會出錯。
        6. 對某一塊要進行寫操作時最好先執行擦出命令,這樣寫入的速度就能大大提高。進行擦除操作時不管是標準卡還是大容量卡都按塊操作執行,也就是一次擦除至少512字節。
        7. 對標準卡進行字節操作時,起始和終止必須在一個物理扇區內,否則將不能進行讀寫操作。實際操作過程中建議用塊操作以提高效率。不管是標準卡還是大容量卡一個讀寫命令只能對一個塊進行操作,不允許跨物理層地址操作。
        8. 在寫數據塊前要先寫入若干個dummy data字節,寫完一個塊數據時,主機要監測MISO數據線,如果從機處于忙狀態這根數據線會保持低電平,這樣主機就可以根據這根數據線的狀態以決定是否發送下一個命令,在從機沒有釋放MISO數據線之前,主機絕對不能執行其他命令,否則將會導致寫入的數據出錯,而且從機也不會響應主機的命令。
        9. 在SPI模式下,CRC校驗是被忽略的,但依然要求主從機發送CRC碼,只是數值可以是任意值,一般主機的CRC碼通常設為0x00或0xFF。
        讀多塊操作和寫多塊操作的傳輸停止形式不一樣,讀多塊操作時用用命令CMD12終止傳輸,而寫多塊操作時用Stop Tran Token(停止傳輸令牌,值為0xFD)終止傳輸。


        關鍵詞: STM32SD

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 荥阳市| 黄梅县| 措勤县| 五原县| 新竹市| 新野县| 偃师市| 额敏县| 高州市| 岱山县| 汤阴县| 静宁县| 鞍山市| 扬中市| 随州市| 武穴市| 芦山县| 万宁市| 舞阳县| 漳州市| 康平县| 丹东市| 循化| 姜堰市| 淮南市| 赤城县| 长白| 郁南县| 临泉县| 伊宁县| 罗甸县| 灵璧县| 麻江县| 东台市| 增城市| 宜川县| 城步| 扎兰屯市| 枣阳市| 石首市| 嘉义市|