SD卡学习(SDIO和SPI模式)
SD卡學(xué)習(xí)(SDIO和SPI模式)
** SD卡的操作模式:SD卡模式(SDIO)、SPI模式(默認為SD模式)。
其中SD卡模式的信號線有:CLK、CMD、DAT0-DAT3,6根線。
SPI模式的信號線有:CS、CLK、MISO(DATAOUT)、MOSI(DATAIN),4根線。

SD卡只能使用3.3V的I/O電平。SPI模式下信號線要加10-100K的上拉電阻。
SD卡有五個寄存器:
| CID | 128 | 卡標識寄存器 |
| RCA | 16 | 相對地址寄存器(Relative Card Address):本地系統(tǒng)中卡的地址,動態(tài)變化,在主機初始化的時候確定,SPI模式中沒有。 |
| CSD | 128 | 卡描述數(shù)據(jù):卡操作條件相關(guān)的信息數(shù)據(jù) |
| SCR | 64 | SD配置寄存器:SD卡特定信息數(shù)據(jù) |
| OCR | 32 | 操作條件寄存器 |
SD卡的命令格式:
命令CMD0就是0,CMD16就是16,以此類推。
SPI命令格式為6字節(jié)構(gòu)成,高位在前(MSB)。
| 7 | 6 | 5-0 |
| 0 | 1 | command |
字節(jié)1的最高2位固定是01,低6位為命令號(CMD0就是0,CMD16就是16,以此類推),字節(jié)2-5為命令參數(shù),有些命令是沒有參數(shù)的;字節(jié)6的高7位為CRC,最低位恒為1。
SD卡的命令總共有12類,下表為幾個比較重要的命令:
SD卡的主要相關(guān)各種命令解析
CMD0: SD卡進入IDLE和復(fù)位SD卡
CMD1: 讀OCR,是否為SD卡
CMD2: 獲取卡CID信息
CMD3: 獲取SD卡所分配的相對地址
CMD9: 獲取SD卡的存儲信息(容量、塊大小等)
CMD12:停止傳輸操作
CMD13:獲取卡的狀態(tài)
CMD16:設(shè)置SD卡塊大小
CMD17:使SD卡進入傳輸狀態(tài)、讀取單個塊
CMD18: 使SD卡進入傳輸狀態(tài)、讀取多個塊,直到收到CMD12為止
CMD24:使SD卡進入傳輸狀態(tài)、寫入單個塊
CMD25: 使SD卡進入傳輸狀態(tài)、寫入多個塊
| CMD0(0X00) | NONE | R1 | 復(fù)位SD卡 |
| CMD8(0X08) | VHS+Check Pattern | R7 | 發(fā)送接口狀態(tài)命令 |
| CMD9(0X09) | NONE | R1 | 讀取卡特定數(shù)據(jù)寄存器 |
| CMD10(0X0A) | NONE | R1 | 讀取卡標志數(shù)據(jù)寄存器 |
| CMD16(0X10) | 塊大小 | R1 | 設(shè)置塊大小(字節(jié)數(shù)) |
| CMD17(0X11) | 地址 | R1 | 讀取一個塊的數(shù)據(jù) |
| CMD24(0X18) | 地址 | R1 | 寫入一個塊的數(shù)據(jù) |
| CMD41(0X29) | NONE | R3 | 發(fā)送給主機容量支持信息和激活卡初始化過程 |
| CMD55(0X37) | NONE | R1 | 告訴SD卡,下一個是特定應(yīng)用命令 |
| CMD58(0X3A) | NONE | R3 | 讀取OCR寄存器 |
SD卡和單片機的通信采用發(fā)送應(yīng)答機制:

| 位 |
| 含義 |
初始化SD卡過程:
SPI操作模式下:在SD卡收到復(fù)位命令時,CS為有效電平(低電平),則SPI模式被啟用,在發(fā)送CMD之前要先發(fā)送74個時鐘,64個為內(nèi)部供電上升時間,10個用于SD卡同步;之后才能開始CMD操作,在初始化時CLK時鐘不能超過400KHz。
接著我們看看SD卡的初始化,** SD卡的典型初始化過程如下:**
1、初始化與SD卡連接的硬件條件(MCU的SPI配置,IO口配置);
2、上電延時(>74個CLK);
3、復(fù)位卡(CMD0),進入IDLE狀態(tài);
4、發(fā)送CMD8,檢查是否支持2.0協(xié)議;
5、根據(jù)不同協(xié)議檢查SD卡(命令包括:CMD55、CMD41、CMD58和CMD1等);
6、取消片選,發(fā)多8個CLK,結(jié)束初始化
這樣我們就完成了對SD卡的初始化,注意末尾發(fā)送的8個CLK是提供SD卡額外的時鐘,完成某些操作。通過SD卡初始化,我們可以知道SD卡的類型(V1、V2、V2HC或者MMC),在完成了初始化之后,就可以開始讀寫數(shù)據(jù)了。
SD卡讀取數(shù)據(jù),這里通過CMD17來實現(xiàn),具體過程如下:
1、發(fā)送CMD17;
2、接收卡響應(yīng)R1;
3、接收數(shù)據(jù)起始令牌0XFE;
4、接收數(shù)據(jù);
5、接收2個字節(jié)的CRC,如果不使用CRC,這兩個字節(jié)在讀取后可以丟掉。
6、禁止片選之后,發(fā)多8個CLK;
以上就是一個典型的讀取SD卡數(shù)據(jù)過程,SD卡的寫于讀數(shù)據(jù)差不多,寫數(shù)據(jù)通過CMD24來實現(xiàn),具體過程如下:
1、發(fā)送CMD24;
2、接收卡響應(yīng)R1;
3、發(fā)送寫數(shù)據(jù)起始令牌0XFE;
4、發(fā)送數(shù)據(jù);
5、發(fā)送2字節(jié)的偽CRC;
6、禁止片選之后,發(fā)多8個CLK;
以上就是一個典型的寫SD卡過程。關(guān)于SD卡的介紹,我們就介紹到這里,更詳細的介紹請參考光盤SD卡的參考資料(SD卡2.0協(xié)議)。
總結(jié)
以上是生活随笔為你收集整理的SD卡学习(SDIO和SPI模式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: file_operations结构体介绍
- 下一篇: 扫雷-空白展开算法(优化)-详解