智能车制作

标题: SPI驱动SD卡 [打印本页]

作者: 超越人生巅峰!    时间: 2015-2-5 19:54
标题: SPI驱动SD卡
最近研究SPI驱动SD卡,遇到了发送CMD0指令时,SD卡的返回值为0XFF而不是0X01,谁遇到这种问题过,有那位前辈可以给我解释一下
作者: 西安小姑娘    时间: 2015-2-6 17:33
看看你的时序是不是正确,可以参考一下这个。。[attach]74457[/attach]
作者: 西安小姑娘    时间: 2015-2-6 17:33
注意:SD卡上电后进入SD模式,及等待至少74 个时钟周期。。
作者: 超越人生巅峰!    时间: 2015-2-6 17:53
西安小姑娘 发表于 2015-2-6 17:33
注意:SD卡上电后进入SD模式,及等待至少74 个时钟周期。。

我延时了80个时钟,我用示波器(双通)去读。对上时钟和输出读出的数据是对的,但读出返回的数据是0xff,您发便给个联系方式吗?
作者: 西安小姑娘    时间: 2015-2-6 18:00
函数名称:   unsigned char Sd_send_cmd(unsigned char cmd, unsigned long sd_value)
  
功能介绍:   向SD卡写入相应的命令CMD0,即发送命令字:0x40,0x00,0x00,0x00,0x00,0x95;。
                 如果收到应答信号 01H ,则表示进入SPI模式。
                然后向 SD卡发送 CMD1 。
  
注意:其中扇区的长度为512字节
unsigned char Sd_send_cmd(unsigned char cmd, unsigned long sd_value)
{
       unsigned char spi_retu_value;
       unsigned char overtime_count=0;
      
       (void)Spi0_rdwr_byte(0xFF);                            //SD卡上电后进入SD模式,及等待至少74 个时钟周期
      
       Sd_sel();                                              //片选使能
      
       //发送CMD0信号
       (void)Spi0_rdwr_byte(cmd|0x40);                        //分别写入命令
       (void)Spi0_rdwr_byte((unsigned char)(sd_value>>24));   
       (void)Spi0_rdwr_byte((unsigned char)(sd_value>>16));
       (void)Spi0_rdwr_byte((unsigned char)(sd_value>>8));
       (void)Spi0_rdwr_byte((unsigned char)(sd_value));
       (void)Spi0_rdwr_byte(0x95);                            //0x95第一个命令不能少, 之后可以省
      
       spi_retu_value = Spi0_rdwr_byte(0xFF);
      
       while(spi_retu_value== 0xFF)                          
       {
               spi_retu_value = Spi0_rdwr_byte(0xFF);        
              if(++overtime_count > 100)
              {
                break;                                       //超时退出
              }
       }
       Sd_desel();                                            //片选不使能
       return spi_retu_value;                                 //返回状态值
}

函数名称:   unsigned char Sd_send_cmd(unsigned char cmd, unsigned long sd_value);
  
功能介绍:   sd卡复位
unsigned char Sd_reset(void)
{
         unsigned char i;
         unsigned char overtime_count;
         unsigned char return_value=0;
         
         overtime_count = 0;
         
         do
         {
                for(i=0;i<10;i++)
                {
                    (void)Spi0_rdwr_byte(0xFF);          //在接收数据时,
                                                                       //  可以发送并无实际意义的字节(如0xFF) 作为函数的参数
                }
               
                return_value = Sd_send_cmd(0, 0);        
               
                if(++overtime_count>100)               
                {
                 return 1;                              //超时退出
                }
                        
         }while(return_value != 0x01);      
         overtime_count = 0;
         
         do
         {
                return_value = Sd_send_cmd(1, 0);        //发cmd1(active激活)命令,发active命令
                  
                if(++overtime_count>100)
                {
                 return 1;                              //超时退出
                }
         
         } while(return_value);
         
         return_value = Sd_send_cmd(59, 0);               //关crc校验
         return_value = Sd_send_cmd(16, 512);             //设置读取一次的字节数512字节
         return 0;                                        //正常返回
}



作者: 西安小姑娘    时间: 2015-2-6 18:01
我把俩个子函数都发给你了,你看看。都是初学者,大家一起交流嘛~~
作者: 超越人生巅峰!    时间: 2015-2-6 18:06
西安小姑娘 发表于 2015-2-6 18:01
我把俩个子函数都发给你了,你看看。都是初学者,大家一起交流嘛~~

我的子函数 和你的一样 但是我的返回值不对
作者: 超越人生巅峰!    时间: 2015-2-6 18:08
西安小姑娘 发表于 2015-2-6 18:01
我把俩个子函数都发给你了,你看看。都是初学者,大家一起交流嘛~~

我QQ  474470506  您加我 咱细细聊
作者: 西安小姑娘    时间: 2015-2-6 18:13
超越人生巅峰! 发表于 2015-2-6 18:08
我QQ  474470506  您加我 咱细细聊

额,so shy girl~~~


作者: 西安小姑娘    时间: 2015-2-6 18:14
超越人生巅峰! 发表于 2015-2-6 18:06
我的子函数 和你的一样 但是我的返回值不对

这个函数写正确了吗?亲
[attach]74459[/attach]

作者: 超越人生巅峰!    时间: 2015-2-6 18:20
本帖最后由 超越人生巅峰! 于 2015-2-6 18:28 编辑
西安小姑娘 发表于 2015-2-6 18:13
额,so shy girl~~~


这里信息交互太慢了...   人呢?
作者: 超越人生巅峰!    时间: 2015-2-6 18:20
西安小姑娘 发表于 2015-2-6 18:14
这个函数写正确了吗?亲

你这是XS128的吧,目测没有问题
作者: wxh0001    时间: 2015-4-9 17:41
西安小姑娘 发表于 2015-2-6 18:14
这个函数写正确了吗?亲

我也在写sd卡,求交流,能加下qq吗
作者: 西安小姑娘    时间: 2015-4-9 19:22
wxh0001 发表于 2015-4-9 17:41
我也在写sd卡,求交流,能加下qq吗

我只是找了个例程,自己改了改就好了~
作者: 妖精小七    时间: 2015-4-30 20:48
请问楼主有SPI模块的示例程序吗?
作者: 妖精小七    时间: 2015-4-30 20:49
西安小姑娘 发表于 2015-4-9 19:22
我只是找了个例程,自己改了改就好了~

请问你有SPI模块的例程吗?我需要spi发送和接收都有的

作者: 飘柔似水    时间: 2015-5-5 12:38
妖精小七 发表于 2015-4-30 20:49
请问你有SPI模块的例程吗?我需要spi发送和接收都有的

您好,您现在有SPI的SD卡例程么?

作者: 妖精小七    时间: 2015-5-6 19:05
飘柔似水 发表于 2015-5-5 12:38
您好,您现在有SPI的SD卡例程么?

没有。。。





欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2