OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10652|回复: 8

SD卡初始化中进不了SPI模式,什么原因?

[复制链接]

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2012-5-19
在线时间
0 小时
发表于 2013-2-3 23:32:59 | 显示全部楼层 |阅读模式

这个是原子的程序
 //初始化SD卡
//返回:0-successful r1-错误类型 0xaa-其他错误
u8 SD_Initialize(void)
{
    u8 r1;      // 存放SD卡的返回值
    u16 retry;  // 用来进行超时计数
    u8 buf[4]; 
 u16 i;

 SD_SPI_Init();  //初始化IO
  SD_SPI_SpeedLow(); //设置到低速模式
  for(i=0;i<10;i++)SD_SPI_ReadWriteByte(0XFF);//发送最少74个脉冲
 retry=20;
 do
 {
  r1=SD_SendCmd(CMD0,0,0x95);//进入IDLE状态
 }while((r1!=0X01) && retry--);
 printf("r1=%d.\r\n",r1);
  SD_Type=0;//默认无卡
 if(r1==0X01)
 {
  if(SD_SendCmd(CMD8,0x1AA,0x87)==1)//SD V2.0
  { printf("sd_v2.0.\r\n");
   for(i=0;i<4;i++)buf=SD_SPI_ReadWriteByte(0XFF); //Get trailing return value of R7 resp
   if(buf[2]==0X01&&buf[3]==0XAA)//卡是否支持2.7~3.6V
   {
    retry=0XFFFE;
    do
    {
     SD_SendCmd(CMD55,0,0X01); //发送CMD55
     r1=SD_SendCmd(CMD41,0x40000000,0X01);//发送CMD41
    }while(r1&&retry--);
    if(retry&&SD_SendCmd(CMD58,0,0X01)==0)//鉴别SD2.0卡版本开始
    {
     for(i=0;i<4;i++)buf=SD_SPI_ReadWriteByte(0XFF);//得到OCR值
     if(buf[0]&0x40)SD_Type=SD_TYPE_V2HC;    //检查CCS
     else SD_Type=SD_TYPE_V2;  
    }
   }
  }else//SD V1.x/ MMC V3
  {
   printf("sd_v1.0.\r\n");
   SD_SendCmd(CMD55,0,0X01);  //发送CMD55
   r1=SD_SendCmd(CMD41,0,0X01); //发送CMD41
   printf("r1=%d.\r\n",r1);
   if(r1<=1)
   {  
    SD_Type=SD_TYPE_V1;
    retry=0XFFFE;
    do //等待退出IDLE模式
    {
     SD_SendCmd(CMD55,0,0X01); //发送CMD55
     r1=SD_SendCmd(CMD41,0,0X01);//发送CMD41
    }while(r1&&retry--);  //程序死在这个地方,发送CMD55,41,返回的参数一直为1,不是00,也就是进不了SPI模式
   }else
   {
    SD_Type=SD_TYPE_MMC;//MMC V3
    retry=0XFFFE;
    do //等待退出IDLE模式
    {              
     r1=SD_SendCmd(CMD1,0,0X01);//发送CMD1
    }while(r1&&retry--); 
   }
   if(retry==0||SD_SendCmd(CMD16,512,0X01)!=0)SD_Type=SD_TYPE_ERR;//错误的卡
  }
 }
 SD_DisSelect();//取消片选
 SD_SPI_SpeedHigh();//高速
 if(SD_Type)return 0;
 else if(r1)return r1;    
 return 0xaa;//其他错误
}


//程序死在这个地方,发送CMD55,41,返回的参数一直为1,不是00,也就是进不了SPI模式
通过串口跟踪,发现程序在执行CMD55和41的时候,总是返回1,不能得到正确的0,这个事什么原因?
我在论坛里面查了下,开始的问题是发送0xff不能得到正确的响应,所以按照论坛里朋友一样的处理问题方法,我处理了一下,现在前面部分能正确响应了,但又死在了这个地方,什么原因呢?





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-2-3 23:49:29 | 显示全部楼层
可能你的卡不支持了,换个卡试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2012-5-19
在线时间
0 小时
 楼主| 发表于 2013-2-4 14:30:50 | 显示全部楼层
嗯,换了张卡,初始化时通过了,因为这张新卡是2.0的,开始那张是1.0的,但还有一个问题,这样那不是兼容性很差啊?别人如果不是用我们的卡,那就行不通?
还有一个问题,原子大哥,我现在res=f_open(file_mp3,"0:/lihp.TXT",FA_CREATE_NEW | FA_WRITE );//打开文件
res=9;也就是说
FRESULT f_open (
FIL *fp, /* ointer to the blank file object */
const TCHAR *path, /* ointer to the file name */
BYTE mode /* Access mode and file open mode flags */
)
{
FRESULT res;
DIR dj;
BYTE *dir;
DEF_NAMEBUF;


if (!fp) return FR_INVALID_OBJECT;       //在这个地方就返回了。。。
fp->fs = 0; /* Clear file object */



这个事咋回事?遇到过没有?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-2-4 15:34:56 | 显示全部楼层
回复【3楼】lihaiping1603:
---------------------------------
是存在兼容性问题.
这个没有一个完善的驱动,总有些卡不能识别.SDIO也不例外,亲测SPI兼容性比SDIO好.至少目前我有的代码,测试结果来说,是这样的.

你移植的是我们哪个代码?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2012-5-19
在线时间
0 小时
 楼主| 发表于 2013-2-4 16:16:25 | 显示全部楼层
嗯,用的你们的代码啊,我一般都比较支持原子大哥的啦。。。
回复 支持 反对

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2012-5-19
在线时间
0 小时
 楼主| 发表于 2013-2-4 23:13:54 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子大哥,现在初始化过了,但
f_mount(0,&fs1);
res=f_open(&fsrc,"0:/lhp.TXT",FA_CREATE_NEW | FA_WRITE );//打开文件
  printf("打开返回参数.\r\n");
  printf("res=%d.\r\n",res);
程序又出问题了,上面那个函数死在了调用
FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occurred */
const TCHAR **path, /* ointer to pointer to the path name (drive number) */
FATFS **rfs, /* ointer to pointer to the found file system object */
BYTE wmode /* !=0: Check write protection for write access */
)里面,返回显示 FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */
这个又是怎么回事?我查了下,好多人跟我一样,但都没写解决办法。。能解释分析下不?
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2013-2-5
在线时间
16 小时
发表于 2013-2-5 17:50:44 | 显示全部楼层
回复【楼主位】lihaiping1603:
---------------------------------
楼主
开始的问题是发送0xff不能得到正确的响应,所以按照论坛里朋友一样的处理问题方法,我处理了一下

这个问题你是怎么解决的啊?
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-5-10
在线时间
5 小时
发表于 2020-12-22 17:14:10 | 显示全部楼层
本帖最后由 qiqizfb2400 于 2020-12-22 17:15 编辑
正点原子 发表于 2013-2-4 15:34
回复【3楼】lihaiping1603:
---------------------------------
是存在兼容性问题.
这个没有一个完善的驱动 ...

u8 SD_WaitReady(void)
{
        u32 t=0;
        do
        {
                if(SD_SPI_ReadWriteByte(0XFF)==0XFF)return 0;//OK
                t++;                          
        }while(t<0XFFFFFF);//μè′y
        return 1;
}
请教个问题 我以前买的103 MINI开发板 ,SD卡 SPI模式 DEMO历程 卡插上后,一直在这里死循环,一直收不到0XFF 收到的是0,一直卡死在SD卡初始化准备这里  到底是什么问题额,是SD卡没检查到 还是SPI管脚的CS失效了 但是PA3这个CS我单独试过 开发板排针高低电平切换时可以控制的  这到底时板子出问题了 还是卡接口识别不到 这个卡SD模式在其他板子上能识别的 而且我试了两张卡 这个DEMO都读不到 但是卡是好的 一个是32G闪迪 一个是256MB TF卡转接了大卡槽  MINI板子SD卡槽没有弹起的感觉 总不知道到底接触好没有
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-3-14
在线时间
9 小时
发表于 2021-1-23 17:12:33 | 显示全部楼层
qiqizfb2400 发表于 2020-12-22 17:14
u8 SD_WaitReady(void)
{
        u32 t=0;

您好,我也遇到了这个问题,请问您现在解决了吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 04:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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