智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3229|回复: 17
打印 上一主题 下一主题

SPI驱动SD卡

[复制链接]

2

主题

26

帖子

0

精华

高级会员

Rank: 4

积分
806
威望
337
贡献
217
兑换币
207
注册时间
2014-2-21
在线时间
126 小时
毕业学校
平遥中学
跳转到指定楼层
1#
发表于 2015-2-5 19:54:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近研究SPI驱动SD卡,遇到了发送CMD0指令时,SD卡的返回值为0XFF而不是0X01,谁遇到这种问题过,有那位前辈可以给我解释一下
回复

使用道具 举报

3

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
661
威望
325
贡献
204
兑换币
207
注册时间
2015-1-21
在线时间
66 小时
毕业学校
陕西科技大学
2#
发表于 2015-2-6 17:33:16 | 只看该作者
看看你的时序是不是正确,可以参考一下这个。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

3

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
661
威望
325
贡献
204
兑换币
207
注册时间
2015-1-21
在线时间
66 小时
毕业学校
陕西科技大学
3#
发表于 2015-2-6 17:33:56 | 只看该作者
注意:SD卡上电后进入SD模式,及等待至少74 个时钟周期。。
回复 支持 反对

使用道具 举报

2

主题

26

帖子

0

精华

高级会员

Rank: 4

积分
806
威望
337
贡献
217
兑换币
207
注册时间
2014-2-21
在线时间
126 小时
毕业学校
平遥中学
4#
 楼主| 发表于 2015-2-6 17:53:03 | 只看该作者
西安小姑娘 发表于 2015-2-6 17:33
注意:SD卡上电后进入SD模式,及等待至少74 个时钟周期。。

我延时了80个时钟,我用示波器(双通)去读。对上时钟和输出读出的数据是对的,但读出返回的数据是0xff,您发便给个联系方式吗?
回复 支持 反对

使用道具 举报

3

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
661
威望
325
贡献
204
兑换币
207
注册时间
2015-1-21
在线时间
66 小时
毕业学校
陕西科技大学
5#
发表于 2015-2-6 18:00:52 | 只看该作者
函数名称:   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;                                        //正常返回
}


回复 支持 反对

使用道具 举报

3

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
661
威望
325
贡献
204
兑换币
207
注册时间
2015-1-21
在线时间
66 小时
毕业学校
陕西科技大学
6#
发表于 2015-2-6 18:01:43 | 只看该作者
我把俩个子函数都发给你了,你看看。都是初学者,大家一起交流嘛~~
回复 支持 反对

使用道具 举报

2

主题

26

帖子

0

精华

高级会员

Rank: 4

积分
806
威望
337
贡献
217
兑换币
207
注册时间
2014-2-21
在线时间
126 小时
毕业学校
平遥中学
7#
 楼主| 发表于 2015-2-6 18:06:12 | 只看该作者
西安小姑娘 发表于 2015-2-6 18:01
我把俩个子函数都发给你了,你看看。都是初学者,大家一起交流嘛~~

我的子函数 和你的一样 但是我的返回值不对
回复 支持 反对

使用道具 举报

2

主题

26

帖子

0

精华

高级会员

Rank: 4

积分
806
威望
337
贡献
217
兑换币
207
注册时间
2014-2-21
在线时间
126 小时
毕业学校
平遥中学
8#
 楼主| 发表于 2015-2-6 18:08:21 | 只看该作者
西安小姑娘 发表于 2015-2-6 18:01
我把俩个子函数都发给你了,你看看。都是初学者,大家一起交流嘛~~

我QQ  474470506  您加我 咱细细聊
回复 支持 反对

使用道具 举报

3

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
661
威望
325
贡献
204
兑换币
207
注册时间
2015-1-21
在线时间
66 小时
毕业学校
陕西科技大学
9#
发表于 2015-2-6 18:13:56 | 只看该作者
超越人生巅峰! 发表于 2015-2-6 18:08
我QQ  474470506  您加我 咱细细聊

额,so shy girl~~~

回复 支持 反对

使用道具 举报

3

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
661
威望
325
贡献
204
兑换币
207
注册时间
2015-1-21
在线时间
66 小时
毕业学校
陕西科技大学
10#
发表于 2015-2-6 18:14:50 | 只看该作者
超越人生巅峰! 发表于 2015-2-6 18:06
我的子函数 和你的一样 但是我的返回值不对

这个函数写正确了吗?亲

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-20 17:45 , Processed in 0.065861 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表