新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32下SD卡驅動詳解

        STM32下SD卡驅動詳解

        作者: 時間:2016-11-11 來源:網絡 收藏
        自己在這幾個月中為了畢業設計放下了對S3C2440的學習,從而著手在STM32上的模塊開發。我用STM32做的是一個有界面的MP3所以不得不用到SD卡,(當然nandflash也可以不過pcb難畫不說,最主要容易壞掉)。SD卡方便快捷。

        說道SD卡就會想到他的具體驅動,網上也有很多例子,但是都沒這么詳細說一個過程對于新手很難吃懂,當然這篇對于做過的同學來說沒有什么作用,現在來具體分析一下吧。

        本文引用地址:http://www.104case.com/article/201611/316586.htm

        我們所說的SD卡只是閃存的一種其全稱是Secure Digital,意為“安全數碼”,是由日本兩大電器集團松下電器和東芝聯手SanDisk共同推出的,于1999年8月首次發布。常見的閃存有:SD卡、CF卡、XD卡、MMC卡、SM卡、Mini SD卡、T-Flash卡。而SD卡又分類為:

        SD、MiniSD、MicroSD、SDHC、MiniSD、MicroSD、SDXC、smart SD、SDI/O。它們在外形、速度、容量和命令都有區別。說道這就得說說最近的反日了,其實我們真沒必要給國家添麻煩了,我們身邊很多東西都是別人的,只是都不知道。所以壯大自己的知識為國家多做點事才是真正的愛國。

        SD卡支持兩種總線方式:SD方式與SPI方式。其中SD方式采用6線制,使用CLK、CMD、DAT0~DAT3進行數據通信。而SPI方式采用4線制,使用CS、CLK、DataIn、DataOut進行數據通信。SD方式時的數據傳輸速度與SPI方式要快,采用單片機對SD卡進行讀寫時一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。

        這就說明SD卡里面是有一個控制器的,有相應寄存器,我們用SD卡其實是對相應的寄存器的設置,設置好后就可以用命令來對它進行操作了,(所以說SD卡用起來簡單,因為很多事SD卡廠商已經做了)。

        一,SPI方式驅動SD卡的方法

        SD卡的SPI通信接口使其可以通過SPI通道進行數據讀寫。從應用的角度來看,采用SPI接口的好處在于,很多單片機內部自帶SPI控制器,不光給開發上帶來方便,同時也見降低了開發成本。然而,它也有不好的地方,失去了SD卡的快速的性能優勢。(SPI模式下用USB下載測試只有100K~300K的速度,而用SD模式就可以高達3M~10M),這就是SPI嚴重的缺點,但是對于我們學生用SPI是最簡單,SD模式有很復雜的模式轉換,轉來轉去的有一定的難度,不過也可以做SD模式,很多控制器都有SDIO了。

        二,SD卡的命令

        SD卡最重要的就是初始化,初始化重要的是命令的使用。SD卡初始化成功后幾乎都能用了,所以我們要重點看一下初始化,不同的卡又不同的初始化過程(初始化時要注意SPI的速度不要高于400K)

        SD卡的典型初始化過程如下:

        1、初始化與SD卡連接的硬件條件(MCU的 SPI配置,IO口配置);

        2、上電延時(>74 個 CLK)(必須的);

        3、復位卡(CMD0);

        4、激活卡,內部初始化并獲取卡類型(CMD1(用于 MMC卡)、CMD55、CMD41)(不同的地方就在這里)

        5.、查詢 OCR,獲取供電狀況(CMD58)(就是電壓,一般不判斷不然很多卡不能用);

        6、是否使用CRC(CMD59)(CRC校驗);

        7、設置讀寫塊數據長度(CMD16);

        8、讀取 CSD,獲取存儲卡的其他信息(CMD9);

        9、發送 8CLK 后,禁止片選;

        下面用圖表示一下:(網上都有)

        SD卡的每一個BLOCK的大小就是在這決定的一般為512.

        可以看出操作SD卡都是命令,只要把這些命令作用搞清楚就可以自己驅動SD卡了,我把命令都貼出來:

        SPI方式下的要SD模式下的話STM官方有很詳細的庫文件;

        Class0 :(卡的識別、初始化等基本命令集)

        CMD0:復位SD 卡.

        CMD1:讀OCR寄存器.

        CMD9:讀CSD寄存器.

        CMD10:讀CID寄存器.

        CMD12:停止讀多塊時的數據傳輸

        CMD13:讀 Card_Status 寄存器

        Class2 (讀卡命令集):

        CMD16:設置塊的長度

        CMD17:讀單塊.

        CMD18:讀多塊,直至主機發送CMD12為止 .

        Class4(寫卡命令集) :

        CMD24:寫單塊.

        CMD25:寫多塊.

        CMD27:寫CSD寄存器 .

        Class5 (擦除卡命令集):

        CMD32:設置擦除塊的起始地址.

        CMD33:設置擦除塊的終止地址.

        CMD38: 擦除所選擇的塊.

        Class6(寫保護命令集):

        CMD28:設置寫保護塊的地址.

        CMD29:擦除寫保護塊的地址.

        CMD30: Ask the card for the status of the write protection bits

        class7:卡的鎖定,解鎖功能命令集

        class8:申請特定命令集。

        class10 -11 :保留

        其中 class1, class3,class9:SPI模式不支持

        命令知道了我們來看一下命令的格式:

        SD卡的指令由6字節(Byte)組成,如下:

        Byte1:0 1 x x x x x x(命令號,由指令標志定義,如CMD39為100111即16進制0x27,那么完整的CMD39第一字節為01100111,即0x27+0x40)
        Byte2-5:Command Arguments,命令參數,有些命令沒有參數
        Byte6:前7位為CRC(Cyclic Redundacy Check,循環冗余校驗)校驗位,最后一位為停止位1

        byte1 byte2-5 byte6

        01命令號參數 CRC校驗+1

        參數是命令需要的沒有參數的用0,比如CMD16在這寫的就是512。



        關鍵詞: STM32SD卡驅

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 陇西县| 商城县| 绍兴县| 左云县| 丹阳市| 延安市| 明溪县| 藁城市| 阳山县| 华阴市| 太谷县| 安庆市| 临沂市| 织金县| 文山县| 惠水县| 叙永县| 卫辉市| 汾西县| 土默特左旗| 南雄市| 海伦市| 西安市| 兴山县| 新巴尔虎左旗| 金华市| 乐亭县| 呼图壁县| 响水县| 伊吾县| 京山县| 大厂| 涟水县| 高要市| 台东市| 沙河市| 嫩江县| 余江县| 鄂州市| 鄱阳县| 武夷山市|