- 30
- 10月
经常看到SD/MMC这样的写法。Hanny在这里稍微总结一下SD卡和MMC卡的异同点吧。
首先,两者在外型的规格上是几乎一致的。而且两都的接口是兼容的。也就是说,两者可以用同一个卡座来进行读取。而且,两者在时序上也是一致的,读写命令控制也完全一样,这就是为什么经常把两者混在一起写的原因。
不过,虽说外型几乎一致,但还是有点差异的。MMC比SD卡要薄一些,并且,长度只有SD卡的一半。
下面,Hanny从主机驱动方面谈谈两者的差异。
在数据位宽方面,MMC卡最大支持8BIT,而SD卡只能支持4BIT传输。
在卡的激活过程,MMC使用CMD1来进行激活,而SD卡使用ACMD41来进行激活的。于是,这两条命令也成了主机区分两种卡的类型的关键。
在获取卡的RCA地址时,MMC卡是由主机分配RCA给设备,而SD卡则是由设备返回RCA给主机。
在CMD6的使用方法上也有很大不同。MMC有EXT_CSD的概念,主要用CMD8进行读取,CMD6进行设置。而SD卡则只用CMD6进行UserFunction的设置。SD卡的CMD8主要用于区别SD1.0和SD2.0。
MMC还支持CMD14和CMD19进行主线测试,从而选择合适总线进行通信。SD则不支持。
另外,MMC卡还支持CMD11、CMD20这类数据流操作,因此较多用于媒体设备上。MMC还支持Boot等高级的用法。
[...]做SD/MMC卡驱动的项目也有大半年了,总觉得该总结些什么了。在这里,主要就是记录一些比较常见的问题及解决方法,以免再一次遇到。首先就是SD/MMC卡的初始化错误问题。在找错误之前,先确认:1.用读卡器确认这张SD卡是否损坏;2.用另一套环境(一样的程序)读取同一张卡,是否正常;3.用相同的环境读取另外一张SD卡是否正常。如果是1,那么就直接退出本文章了;如果是2,那么就是该环境上出现虚焊短路或芯[...]
好文章,鼓励下,正在学习,有事求教你啊!
大侠,你测试CMD14和CMD19进行主线测试功能没?成功没?向大侠请教。请留个联系方式好吗?
@yangzc
CMD14和CMD19是MMC卡用来测试数据线的命令。
主要用于检查是否支持8bit、4bit的数据位宽。
使用的方法,大概就是CMD14发送一个数据包,再用CMD19读回该数据包,进行校验。
详细可参见MMC卡的SPEC.
大侠,你有测试代码没?我的MMC卡plus可以成功,但是4.0协议的1位的卡不能成功,纠结啊!
@yangzcc
测试代码的话,需要根据不同的MCU的SD模块来编写的。
你说的MMC plus可以成功,那么命令应该就没问题了。
1位的卡,应该是 3.x协议的吧,可能需要再详细看看SPEC,看是否支持本命令。
你好 看了你的文章很有收获 非常感谢
我现在有几个问题想请教你一下 还望能够指点一二
我现在在做eMMC卡的驱动 和MMC卡差不多一样 我想获得EXT_CSD的内容发送CMD8之后 数据会立即从数据线传出来吗 还需要其他读指令吗? 但是其他读指令需要给定一个地址,这个地址是多少呢?
另外一个问题是 我需要设置总线宽度为4BIT 回写EXT_CSD时候是需要把512Bytes字节全部传出去吗?
呵呵 文字有点多 希望帮忙解答一下 万分感谢
@uurun
发送CMD8后,即可从数据总线读回EXT_CSD的数据,不需要其它读指令。
回写EXT_CSD只需要用CMD6写回相应的值就行了,不需要全部的值。
呵呵 谢谢啊 现在已经搞出来了 用STM32的SDIO问题还真多唉
你好,请问“MMC卡是由主机分配RCA给设备,而SD卡则是由设备返回RCA给主机”中设备是如何产生RCA地址的呀?是每次源地址加一吗?谢谢
@yushi
协议对设备产生RCA地址的方式并没有做要求。设备可以根据自己的情况进行地址分配,一般为了简单,可采用加1的方式。
留个足迹,支持一下博主。
平安夜到来了,祝大家过得开心哈
谢谢博主的分享,确实学习到不少。