• 7
  • 3月

做SD/MMC卡驱动的项目也有大半年了,总觉得该总结些什么了。在这里,主要就是记录一些比较常见的问题及解决方法,以免再一次遇到。

首先就是SD/MMC卡的初始化错误问题。在找错误之前,先确认:1.用读卡器确认这张SD卡是否损坏;2.用另一套环境(一样的程序)读取同一张卡,是否正常;3.用相同的环境读取另外一张SD卡是否正常。如果是1,那么就直接退出本文章了;如果是2,那么就是该环境上出现虚焊短路或芯片损坏,问题也比较好办;如果是3,那么就说明程序和环境问题不大,可能是一些细节上的问题,可以参考以下内容的其中一部分;如果都不是,那么就要开始排查了。

寻找这类错误的原因,首先要检查的就是硬件。我想,第一步,我会确认原理图,看IO的连接是否正确,用万用表确认IO没有虚焊、短路。接下来,用示波器(如果没有,只能用万用表了),测量SD卡座的电源脚。一般来说,电压值应该在3.3V左右,如果相差过大,可能就是电路错误,或者LDO的供电能力不足了。

如果确认完以上两步,那么,硬件方面问题就不大了。接下来要确认的是固件上驱动程序的问题了。一般来说,如果这时候有个逻辑分析仪,那么问题就简化了。如果没有,只能按经验来一步一步排查了。首先要检查的是上电顺序,还记得在血的教训一文中提到这个问题。简单地说,就是先开电,再上拉。上电OK了?那么就看看初始化程序了。确认刚上电时的时序控制在100KHz到400KHz之间(一般采用240KHz左右,这里最好能用示波器确认),在发送第一条命令之前,确认主机已经发送足够的时钟(好像是74个时钟以上)。

然后,正式进入初始化程序。这里需要说一下SD/MMC卡的区分,浅谈SD卡和MMC卡的异同一文中也稍微讲了下这些。一般来说刚上电时,SD卡不支持CMD1而支持CMD55,MMC卡不支持CMD55而支持CMD1,这样就可以区分这两种卡。然后SD1.1和SD2.0卡主要通过CMD8来区分,总之,就是按照SPEC上的要求了。还要注意的是:上电时CMD55的参数为全0,ACMD41在SD1.1和SD2.0上的参数会有所不同。发送CMD0的时候,注意IO口电平,以防误入SD卡的SPI模式。

到了这一步,如果能够激活成功,后面的问题也就不大了。具体问题还需要具体分析。

就先简单记到这了。

  • 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等高级的用法。

  • 24
  • 10月

SD/MMC卡的读写模式分两种。一种是利用SD总线来进行数据传输,这里称为SD模式;另外一种是利用SPI总线来进行数据传输,这里称之为SPI模式。

最初接触SD/MMC卡时,Hanny一直觉得很奇怪,为什么SD/MMC卡要提供两种模式进行访问呢?比较完这两种模式的区别,分析其运用场合,就会明白答案了。

SD卡主要工作于4BIT SD模式下(MMC可能工作在8BIT SD模式下)。其读写最高时钟可达50MHz,因此,市面上的卡的读取速度能到达20MB/s以上,已经算极限了。SD模式也是SD卡的主要工作模式。

而SPI模式只有1BIT的带宽,而且时钟最高只能到25MHz,因此读取速度通常低于3MB/s。但是SPI模式对硬件要求较低,一般广泛用于MP3等对读卡速度要求不高的低端场合。

Hanny当时还有一个疑问:SD模式不是也同样支持1BIT模式吗?为什么不直接用SD的1BIT模式呢?

后来才明白:1、SPI总线是一个通用总线,大部份芯片都用硬件模块;2、SPI模式支持不带CRC校验的传输方式,可以降低硬件要求;3、SD的CMD线与DATA线之间有可能同时产生数据,对没有SD硬件模块的主机支持起来难度较高。