SD卡初始化步骤详解

硬件平台:飞思卡尔s12xep100

开发环境:codewarrior 5.2

结果:批量存储稳定


最近在做文件系统的升级,先前用的是21ic论坛上面down的znfat,相信做单片机软件的兄弟们应该都知道。

后来用的过程中发现此文件系统超时机制做的不是很好,而且不精简,会占用比较大的ram和flash,产品用了几个月后,决定升级一下文件系统,后来就发现了fatfs。


这里先从sd卡的初始化说起吧,只说初始化流程以及一些细节问题(spi模式)。

1、第一步,在将spi模块初始化好之后,将spi速度设为低速模式,我这里用的是250k

2、保持select脚为高电平,并向SD卡发送不低于74个时钟脉冲,此时sd卡将进入它的native operation mode(翻译为本地操作模式了),并做好接收本地指令的准备。

3、此时将select脚拉低并向SD卡发送cmd0指令,SD卡在检测到select脚为低并收到cmd0指令后将进入spi模式,并返回0x01空闲状态。

4、成功进入空闲状态后,继续发送cmd8指令,携带的参数为0x000001AA,如果SD卡不能识别并返回错误码5,说明此卡非2.0卡(进入步骤6)。如果指令能被识别,则SD卡将返回R1+32位共40位数据,其中R1位0x01,32位数据为0x000001AA。此时可判断卡为2.0卡。

5、判断为2.0卡后,紧接着发送cmd55+acmd41指令(应该是在cmd55返回1的情况下再接着发送acmd41),如果返回0,则初始化成功。此时如果你想继续判断是标准2.0卡SCSD还是大容量HCSD,则需要继续发送cmd58指令,并在cmd58指令被成功响应后连续从SD卡读取4个字节的ocr数据,若其第31位为1,表示初始化成功,其第30位为1表示是HCSD,为0表示SCSD。 此时2.0卡初始化结束。

6、步骤4对cmd8无响应,则继续判断卡为1.0或mmc卡。此时同步骤5一样向卡发送cmd55+acmd41指令,如果返回0,则表示1.0卡初始化成功,如果返回错误,则确定卡为mmc卡。 在确定卡为mmc卡后,继续向卡发送cmd1指令,如果返回0,则mmc卡初始化成功,否则失败,判断为错卡!!

7、初始化成功后,将spi切换为高速模式,我这里用的是4m。


至此,SD卡初始化过程就结束了,记得几点:在发送cmd函数后,记得补偿时钟;在读寄存器位时,需要select拉低;初始化时,一定要是低速模式并且有超过74个时钟脉冲!


注:在测试的过程中,也是遇到了些比较蛋疼的问题,我手里有3张卡,2张8ghc,1张2gsc。这两张8g卡在读ocr时,其最高字节一直返回0x80,也就是说从ocr上面判断不出是HC大容量卡,那张2g卡返回也是0x80是正常的。  于是找啊找查啊查,究竟是哪里出问题了。最后实在是差不出来,重新买了个新的HC,还好,果然成功了,ocr最高字节终于为0xc0。 所以说就是提醒大家在测试过程中,多找些,多对比现象。



  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值