C8051F020 SPI读写SD卡FAT全攻略

我从一个月前刚放暑假开始弄单片机读写SD卡,八月初完成FAT16,已经可以写入TXT文件,并可在windows上读出。由于网上资料比较散, 所以一开始走了不少弯路,现在写一篇总结,将我遇到的问题详细地列出来,希望能帮助和我一样的菜鸟们少走弯路。文中说到的一些问题对高手而言只是常识性 的,还请包涵。

      第一步:搭电路


      我买了一小块蜂窝板和一个SD插槽,按照标准电路焊接上,由于用的是SPI模式,所以选电路图的时候要看好,SD卡上的引脚顺序不要看 错,912345678,最后两根挨得很紧,焊接时不要连上了,相关引脚一定要按照要求接上47K的上拉电阻。电路虽然简单,但一定要确保无误。还有一 点,SD卡座种类不一样,有位学长买的是弹簧式的,焊完以后刚开始初始化都能成功,放了几天突然不行了,检查各引脚都没问题,最后发现是卡座的问题,这样 的硬件问题很难发现,还浪费时间,所以卡座还是直接买简单的好。


      第二步:设置硬件SPI


       我用的是sililab的C8051F020,自带硬件SPI,如果不带可以用软件模拟,关于软件模拟SPI这块网上有很多现成的程序。这一歩首先按照 020手册写了一段程序,当然是将其设为主模式,这时候CONFIG(这个软件可以视窗化操作C8051F的大多数寄存器并自动生成代码)会分配4个引 脚,CLK时钟位,MISO和MOSI两个数据传输位,还有一个NSS位,这个脚用不上,不要将其当作CS片选位,CS位选一个普通IO既可。所有从单片 机上输出的引脚都设为推挽输出。设置完成后最好弄个示波器看一下输出波形是否和你想象中的一样,这样就能确保你的SPI工作没问题了,这一步也是关 键,SPI是底层通信的基础。


       第三步:SD卡初始化


        这一步正式进入单片机调试SD部分,了解SD卡的时序后(后面我会上传这部分资料),网上众说纷纭,还有说要看完178页英文PDF,我都晕了,这个看完估计我都是专家了。关于初始化命令有很多说法,我发的是CMD0和CMD1就可以成功初始化。


         解释一下这个命令格式的含义:这是个一个字节的命令格式为01xx xxxx 后六位是CMD后面的数字的二进制值,如CMD1=0100 0001=0x41 程序中写为CMD | 0x40   CMD代表后面的数字。


         需要注意初始化时SPI速率不能超过400K,我设的是100K,初始化没问题,还有发CMD0之前要向SD卡发送至少74个时钟周期,只有CMD0需要这样特殊。


下面是发送CMD0的程序段:


 retry=0;
  CSH;


 do{
  for(i=0;i<10;i++) SPI_WriteByte(0xFF); // 发送 至少 74个时钟周期 注意片选线此时为高
  r1=mmcSendCommand(MMC_GO_IDLE_STATE, 0); // 发送CMD0,注意此时片选线才为低
  retry++;
  if(retry>0xfe) return -1;      //尝试的发送次数可以适当多一些
 } while(r1 != MMC_R1_IDLE_STATE); //正确应答为1


      尝试发送的次数至少为200,有人建议2000的,随便,如果不稳定,比如有时候收的到有时候收不到,就可以适当增大发送次数


      这是紧随其后发送的CMD1程序段:


 retry=0;
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值