来自:http://blog.chinaunix.net/u1/58780/showart_673609.html
最近粗略的看了SD的Specifications,结合网上前人的代码,把SD卡跑通了。处理器是AT91SAM7X256,用SPI接口挂SD卡。 SD卡的协议我看了两个版本,1.7和2.0。2.0版本比1.x多了支持HCSD(High Capacity SD),且多了些操作命令(CMD8),下图说明普卡和高容量卡的硬件使用区别:
图上说要想使用 HCSD , Host 必须支持才行,而普卡是被兼容的。在初始化的时候,也要用 CMD8 检查卡的类型是否为 HCSD ,其他的基本一样, Spec 上给的初始化流程如下图:
![](http://blogimg.chinaunix.net/blog/upfile2/080505133959.jpg)
对 SD 卡的驱动主要有初始化、读、写、擦除等。
1、 初始化 步骤:
(1) 延时至少 74clock
(2) 发送 CMD0 ,需要返回 0x01 ,进入 Idle 状态
(3) 循环发送 CMD55+ACMD41 ,直到返回 0x00 ,进入 Ready 状态。
如果是 MMC ,此步应发送 CMD1 。
2、 读 步骤:
(1) 发送 CMD17 (单块)或 CMD18 (多块)读命令,返回 0x00
(2) 接收数据开始令牌 0xfe (或 0xfc ) + 正式数据 512Bytes + CRC 校验 2Bytes
默认正式传输的数据长度是 512Bytes ,可用 CMD16 设置。
3、 写 步骤:
(1) 发送 CMD24 (单块)或 CMD25 (多块)写命令,返回 0x00
(2) 发送数据开始令牌 0xfe (或 0xfc ) + 正式数据 512Bytes + CRC 校验 2Bytes
4、 擦除 步骤:
(1) 发送 CMD32 ,跟一个参数来指定首个要擦出的扇区号( SD 手册上说是块号)
(2) 发送 CMD33, ,指定最后的扇区号
(3) 发送 CMD38 ,擦除指定区间的扇区
此 3 步顺序不能颠倒。
还要注意发送 CMD 命令时,后面要跟一个字节的 CRC 校验数据,总之要保证每次发送的数据包长度符合协议要求,命令、数据符合时序要求。
以上是我对 SD 卡驱动的一点总结,不当之处请指正,欢迎交流。