主题 : SD卡开发困惑之二 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 7361
精华: 0
发帖: 6
金钱: 55 两
威望: 51 点
综合积分: 12 分
注册时间: 2009-07-12
最后登录: 2017-09-13
楼主  发表于: 2009-07-20 10:17

 SD卡开发困惑之二

管理提醒: 本帖被 qq2440 从 micro2440技术交流专区 移动到本区(2013-11-18)
环境:Micro2440的板子+ADS1.2+Kingston 2G SD卡
目的:获取SD卡的CSD寄存器值
过程:向SD卡依次发送CMD0、CMD55+ACMD41、CMD2、CMD3,CMD7,CMD55+ACMD6,CMD9指令。
问题:在发送以上指令过程中,前面8条指令都正常执行和返回,当发送CMD9指令以获取CSD寄存器值时,指令响应超时,不知是何原因。以下是CMD9指令的代码,望得到各位指点。

U8 CMD9(){
 U32 RegTemp;
 //STEP1:发送指令
 Lcd_Print(RGB(0x00,0xF8,0x00),RGB( 0xFF,0xFF,0xFF),1,"开始执行CMD9指令…\n");
 rSDICARG=(RCA<<16);//设定指令参数
    rSDICCON=(1<<10)|(1<<9)|(1<<8)|(1<<6)|9;//发送CMD9指令
    //等待指令发送结束
    do{
     RegTemp=rSDICSTA;
    }while(!(((RegTemp&0x400)==0x400)|((RegTemp&0x200)==0x200)));
    rSDICSTA=RegTemp;//清除标志位
    Lcd_Print(RGB(0x00,0x00,0x00),RGB( 0xFF,0xFF,0xFF),1,"  指令状态寄存器值为:");
    Lcd_Print(RGB(0x00,0x00,0x1F),RGB( 0xFF,0xFF,0xFF),1,"0x%x\n",RegTemp);
   
    //STEP2:对指令的返回值做判断
    if((RegTemp&0x400)==0x400){//如果反馈超时
     Lcd_Print(RGB(0x00,0x00,0x00),RGB( 0xFF,0xFF,0xFF),1,"  获取存储卡CSD信息失败\n");
     return 0;
    }
    else{
     Lcd_Print(RGB(0x00,0x00,0x00),RGB( 0xFF,0xFF,0xFF),1,"  指令返回值为:\n");
     Lcd_Print(RGB(0x00,0x00,0x1F),RGB( 0xFF,0xFF,0xFF),1,"    0x%x;0x%x;\n    0x%x;0x%x\n",rSDIRSP0,rSDIRSP1,rSDIRSP2,rSDIRSP3);
     return 1;
    }
}
级别: 新手上路
UID: 7361
精华: 0
发帖: 6
金钱: 55 两
威望: 51 点
综合积分: 12 分
注册时间: 2009-07-12
最后登录: 2017-09-13
1楼  发表于: 2009-07-20 11:17
此问题已经解决,CMD9必须在卡处于stand-by状态下执行,而我的指令发送次序是CMD0、CMD55+ACMD41、CMD2、CMD3,CMD7,CMD55+ACMD6,CMD9。而CMD7之后卡已经从stand-by状态进入transfer状态,故而发送CMD9指令会遇到响应超时。

调整下指令发送次序即可,调整后次序为:CMD0、CMD55+ACMD41、CMD2、CMD3,CMD9,CMD7,CMD55+ACMD6
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2009-07-20 11:20
建议你动手之前先认真看看SD的spec
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."