卡的官方资料 (我承认这个资料很垃圾,比起民间的技术总结它
的内容可谓又臭又长,但是作为基础也要了解一下,SD 协议不用看)
2.清晰明了的 MMC 卡时序图清晰明了的
卡时序图 (虽然这个是 MMC 卡的,但是
在初始化的时候 CMD0 的时序是一样的)
电路:我用的 SD 卡的电路其实很简单,参考 SD 卡的官方资料中的电路链接就可以的。
供电问题:由于 SD 卡的电压是 3.3V,所以你的 CPU 必须支持 3.3V 的 IO 端口输出。
再来说一说鸡毛蒜皮的细节:
1. 为 了 使 SD 卡 初 始 化 进 入 SPI 模 式 , 我 们 需 要 使 用 的 命 令 有 3 个 :
CMD0,ACMD41,CMD55(使用 ACMD 类的指令前应先发 CMD55,CMD55 起到一个切换
到 ACMD 类命令的作用)。
2.为什么在使用 CMD0 以后不使用 CMD1?CMD1 是 MMC 卡使用的指令,虽然本文并不
想讨论 MMC 卡的问题,但是我还是要说:为了实现兼容性,上电或者发送 CMD0 后,应
该首先发送 CMD55+ACMD41 确认是否有回应,如果有回应则为 SD 卡,如果等回应超时,
则可能是 MMC 卡,再发 CMD1 确认。
3.正确的回应内容应该是:
CMD0——0x01(SD 卡处于 in-idle-state)
CMD55——0x01(SD 卡处于 in-idle-state)
ACMD41——0x00(SD 卡跳出 in-idle-state,完成初始化准备接受下一条指令)
这里要说的是如果最后的回应内容还是 0x01 的话,可以循环发送 CMD55+ACMD41,
直到回应的内容 0x00。
4.在所有的指令中,唯独 CMD0 特殊,在向 SD 卡发送以前需要向 SD 卡发送 74+个时钟。
那么为什么要 74 个 CLK 呢?因为在上电初期,电压的上升过程据 SD 卡组织的计算约合
64 个 CLK 周期才能到达 SD 卡的正常工作电压他们管这个叫做 Supply ramp up time,其
后的 10 个 CLK 是为了与 SD 卡同步,之后开始 CMD0 的操作,严格按照此项操作,一定
没有问题。
5.关于 SD 卡的 SPI 总线,在读入数据时 SD 卡的 SPI 是 CLK 的上升沿输入锁存,输出数
据也是在上升沿。
6.向 SD 卡写入一个 CMD 或者 ACMD 指令的过程是这样的:
首先使 CS 为低电平,SD 卡使能;其次在 SD 卡的 Din 写入指令;写入指令后还要附加 8
个填充时钟,是 SD 卡完成内部操作;之后在 SD 卡的 Dout 上接受回应;回应接受完毕使
CS 为低电平,再附加 8 个填充时钟。
7.在 SD 卡的 Din 没有数据写入时,应使 Din 保持高电平。