原子哥的代码是没问题的,但自己写的出现了问题
下面说下我出现的情况
就是按顺序启动SD卡
1、74个时钟周期
2、复位(CMD0)进入IDLE状态(返回0x01,正常)
3、卡类型识别CMD8命令(返回R7,检查了参数都正确)
4、出问题就在这点:CMD55+ACMD41组合中ACMD41返回值总是为0x01,死活都没返回0x00,但你的代码没问题
小弟愚钝,找不出是哪出的问题,原子哥,高抬贵手帮忙看下哪里有错吧
#define SD_CMD55 0x37
#define SD_CMD55_ARG 0x00
#define SD_CMD55_CRC 0x01
#define SD_CMD55_RESPONSE 0x01
#define SD_ACMD41 0x41
#define SD_ACMD41_ARG 0x40000000
#define SD_ACMD41_CRC 0x01
/*循环发送CMD55 + ACMD41,等待0x00*/
sdcardInfo sdcardInit(void)
{
uint16_t retryLoop;
uint8_t readByte;
retryLoop = 0xFFFF;
do{
/*CMD55*/
writeSdcardCMD( SD_CMD55, SD_CMD55_ARG, SD_CMD55_CRC);
/*ACMD41,回应R1*/
readByte = writeSdcardCMD( SD_ACMD41, SD_ACMD41_ARG, SD_ACMD41_CRC);
if( readByte == 0x00)
return SD_NORMAL;
}while(retryLoop--);
return SD_INIT_ERROR;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
估计问题出在这段代码之外的地方吧!
你这个代码看上去没错啊。
估计问题出在这段代码之外的地方吧!
---------------------------------
嗯,好的,我再检查一下吧,谢谢原子哥
#define SD_ACMD41 0x41应该是
#define SD_ACMD41 41
所以说写程序要仔细点,是小弟太大意了
---------------------------------
不会吧?原子的例程里都是这么写的:
#define CMD0 0 //?¨????
#define CMD1 1
#define CMD8 8 //?ü??8 ??SEND_IF_COND
#define CMD9 9 //?ü??9 ????CSD????
#define CMD10 10 //?ü??10????CID????
#define CMD12 12 //?ü??12??????????????
#define CMD16 16 //?ü??16???è??SectorSize ??·???0x00
#define CMD17 17 //?ü??17????sector
#define CMD18 18 //?ü??18????Multi sector
#define CMD23 23 //?ü??23???è???àsector?????°?¤??????N??block
#define CMD24 24 //?ü??24????sector
#define CMD25 25 //?ü??25????Multi sector
#define CMD41 41 //?ü??41????·???0x00
#define CMD55 55 //?ü??55????·???0x01
#define CMD58 58 //?ü??58????OCR????
#define CMD59 59 //?ü??59??????/????CRC????·???0x00
一周热门 更多>