- 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模式。
到了这一步,如果能够激活成功,后面的问题也就不大了。具体问题还需要具体分析。
就先简单记到这了。
这个有意思O(∩_∩)O:roll: :o I Like!
我需要sd模式的sd卡单片机程序,电话18607551271
很好,最近在做SD卡的驱动,看了您的文章,很有收获,谢谢了!
您好!我最近在做基于270的sd卡的驱动,遇到一些问题,想向您请教。发完命令,我看到的命令返回值和网上不一样,也不知道我查看的寄存器对不对,最近很困惑,希望您能指导一下。谢谢!
@road
那么,能描述下你遇到了什么问题吗?
好的,谢谢!网上都说发完CMD0命令,回应值为0x01,CMD55命令回应值为0x01,ACMD命令回应值为0x00,就表明卡进入ready状态,可是我不知道去哪里读这些回应值,在MMC_RES寄存器读到很多数?我的卡不能初始化。
谢谢
@road
SD的回应值可不是一个值这么简单的,大体有短应答和长应答两种。具体的回复什么意思,还得参照SPEC说明。
呃。。建议你先阅读一下SD卡的Spec吧。Spec上有一个比较详细的鉴定流程图。然后有什么不明白的地方可以再讨论下。
建议最好有个示波器或逻辑分析仪,这样更容易理解通信过程。
好的,谢谢,我们这有示波器。我先按照您说的顺序试一下。我看过SD
的Spec,可能没您看的仔细。先谢过了,在请教。
请问,您的SD卡的驱动是做在Linux下吗?
@road
不是,无操作系统下。
学习,我在U-BOOT里加MMC驱动,有什么建议啊,请指教!!
@Henry
也提不出什么很好的建议呢。只能按SPEC流程来调了。
谢谢您的分享,我最近也在移植SDcard驱动
对了,我觉得您的主页非常好,即能对最近的过往进行总结,又可以把这些经验分享给新人。建这个主页的大概流程是什么?如果不麻烦 我也想弄一个。呵呵,先谢谢了
@beldon
其实可以在一些博客网站注册一个帐号来写的。这就是一个博客程序了。
详细!期待明天下一篇
我正调试64G的iNand,发送cmd1(40ff8080)总是返回00ff8080,总是进入不了ready,1000次访问也不行。是什么原因啊?
我用emmc5.0协议,上电延时1ms后接80个CLOCK,然后循环发送CMD1给芯片,第一次回复0xffffffffffff 第二次回复0x3f00ff8080ff 之后就一直回复0xffffffffffff 为什么会这样,非常不理解。
正常的回复应该是 一直回复 0x3f80ff8080ff或0x3fc0ff8080ff才对,为什么偏偏只有第二次回复一个 表示上电未完成的错误代码0x3f00ff8080ff,而且偏偏只有第二次而不是每次?