搜索
bottom↓
回复: 34

SD卡发送CMD0后应该发CMD55还是ACMD41啊!

[复制链接]

出0入0汤圆

发表于 2008-8-25 14:54:47 | 显示全部楼层 |阅读模式
请问,我现在能发送CMD0了,也能收到正确的回复0x01了,但是,在发送CMD0成功,并且收到了正确的回复0x01后再发CMD55和ACMD41,但是收到的都是0x05,我就让它在主循环里发,也都是0x05 我对照看了下,是00000101<0x05>说明SD卡进入了空闲状态,还说有一个无效的命令!请问,这个是什么原因呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2008-8-25 15:05:27 | 显示全部楼层
CMDO后资料上说要发一个CMD55后再发ACMD41,但是我看过资料,说CMD0后只有4个有效命令!CMD1,CMD58,CMD59和ACMD41啊!‘

出0入0汤圆

发表于 2008-8-25 15:45:00 | 显示全部楼层
仁兄  你用的是mci接口还是spi接口??

出0入0汤圆

 楼主| 发表于 2008-8-25 16:19:40 | 显示全部楼层
楼上的你好!

 我的是SPI方式!但是我现在调试发送CMD0后接收到的是0x01,但是接着发送CMD55和ACMD41都收到的是0x05!郁闷了!希望能帮我下!

出0入0汤圆

发表于 2008-8-25 16:27:55 | 显示全部楼层
连续发送CMD55和ACMD41,我没有遇到楼主所说的情况,换张卡试试

出0入0汤圆

发表于 2008-8-25 17:44:16 | 显示全部楼层
有可能是卡的指令精简掉了。

出0入0汤圆

发表于 2008-8-25 17:58:16 | 显示全部楼层
仁兄。 把你的程序都贴出来。这样方便!!!!

出0入0汤圆

 楼主| 发表于 2008-8-25 20:15:10 | 显示全部楼层
hn_ny_dxs 夏风:
   你好!指令精简?能说详细点吗>

出0入0汤圆

 楼主| 发表于 2008-8-26 11:14:54 | 显示全部楼层
对了,搞个SD卡的兄弟,SD卡的SPI方式,R1应答有0x05这个应答信息没>?我的发送CMD0后,应答是0x01后,后面发什么命令怎么都是回的0x05 啊!谢谢指教!

出0入0汤圆

发表于 2008-8-26 19:53:27 | 显示全部楼层
要反复发送CMD55+ACMD41,直到ACMD41接受到0x00为止...........

出0入0汤圆

 楼主| 发表于 2008-8-26 21:08:14 | 显示全部楼层
我都把它放在主循环里了!呵呵!还是收不到哈!还有是不是发送CMD0后要有74个CLK的延时才能发送其它的命令!

出0入0汤圆

 楼主| 发表于 2008-8-27 11:31:20 | 显示全部楼层
sd卡的spi模式中.,数据线在空闲的时候是不是要高点平啊

出0入0汤圆

发表于 2009-8-18 09:54:28 | 显示全部楼层
我的是SPI方式!但是我现在调试发送CMD0后接收到的是0x01,发送CMD8的时候返回的是0x01,但是接着发送CMD55和ACMD41都收到的是0x05!请问上面的兄弟解决了吗
retry = 0;
                do
                {
                        r1 = MMC_SD_SendCommand(CMD55, 0, 0x95);
                        if(r1!=0x01)
                        {
                                //printf_P(PSTR("\r\n CMD55 r1=%x "),r1);
                                return r1;
                        }

                        r1 = MMC_SD_SendCommand(ACMD41,0x40000000, 0);

                }while(r1!=0);提醒一下拉

出0入0汤圆

发表于 2009-8-19 10:43:17 | 显示全部楼层
顶起来啊,兄弟们!难道没有人明白吗,是不是卡的问题啊

出0入0汤圆

发表于 2009-9-10 18:55:47 | 显示全部楼层
CMD0后连续发Cmd55+ACmd41,直到接收到正确的状态为止

出0入0汤圆

发表于 2009-9-10 19:14:29 | 显示全部楼层
补充一下:不用关心cmd55的返回值,只要不是0xFF,就可以接着发Acmd41,Acmd41接收到0x00,就OK了,如果不是0x00,就继续发cmd55+Acmd41. 这个循环要好多次,你可以试试。呵呵,我就是这样做的,都能接收正确。

出0入0汤圆

发表于 2009-9-13 21:05:23 | 显示全部楼层
cmd55一般会回0x01,Acmd41第一次发也是回0x01,一般第二次就回0x00了

出0入0汤圆

发表于 2009-9-14 04:32:59 | 显示全部楼层
以下给楼主参考

CM0 -> CMD8 ---->{ SD V2} else { CMD55_ACMD41 --->{SD} else {CMD1 ->MicroSD}

我手头的是MicroSD卡,CMD55_ACMD41 发送后收不到有效信息,但是CMD1反复多次即可0~

出0入0汤圆

发表于 2009-9-26 11:58:29 | 显示全部楼层
请教各位

以下摘自SD spec1.1关于SPI模式reset sequence部分的描述

The SD Memory Card requires a defined reset sequence. After power on reset or CMD0 (software reset) the card enters an idle state. At this state the only valid host commands are ACMD41 (SD_SEND_OP_COND), CMD58 (READ_OCR) and CMD59 (CRC_ON_OFF). For the Thick (2.1mm) SD Memory Card - CMD1 (SEND_OP_COND) is also valid - that means that in SPI mode
CMD1 and ACMD41 have the same behavior, though the usage of CMD41 is preferable since it allows easy distinguishing between SD Memory Card and MultiMediaCard.(that supports CMD1 as well)

首先,红色显示的部分有点问题,因为根本没有CMD41,估计是把ACMD41少些了一个A

其次,这句话的意思没怎么看清楚:

ACMD41:适用于SD卡,无论薄与厚,不适用于MMC
CMD1:适用于厚的SD卡和MMC,不适用于薄的SD卡
可以这么理解么?

从楼上看,好像micro SD卡也用 CMD1来初始化了。但是SD spec2 好像不是这么说的


(原文件名:1.jpg)


怎么样才可以辨别SD和MMC?是不是先ACMD41,然后如果R1是illegal command 再接着CMD1如果是这样,那么周立功给的SD 相关函数就有问题。(下个帖子贴出来)

问一下,现在还有人用MMC卡么

问题比较多,感谢高手指点

出0入0汤圆

发表于 2009-9-26 12:19:26 | 显示全部楼层
以下是zlg的程序,主要是CMD0以后执行的初始化部分,

根据我个人的理解,该程序首先发送CMD1,然后进行判断,while (((resp[0] & MSK_IDLE) == MSK_IDLE) && (i <=SD_IDLE_WAIT_MAX));

想在指定时间内等到SD卡进入IDLE模式,感觉这么做有很大问题,如果是“薄的”SD卡,不可能识别CMD1命令,所以肯定进入不了IDLE模

式,(IDLE bit 不可能清零)则该程序就直接返回错误代码了,不能完成初始化。(其实就是因为使用了一个“薄的”SD卡)

函数的最后适用ACMD41来判断是否是SD还是MMC

    ret = SD_SendCmd(ACMD41, param, ACMD41_R, resp);               
/* 激活内部初始化命令 active card to initialize process internal */
    if (ret != SD_NO_ERR)       
            return SD_ERR_UNKNOWN_CARD;
   
    if ((resp[0] & 0xFE) == 0)
              sds.card_type = CARDTYPE_SD;                                                /* 是SD卡 the card is SD card */       
    else       
            sds.card_type = CARDTYPE_MMC;                                                /* 是MMC卡 the card is MMC card */

应该可以这么理解:

发送ACMD41,等到response R1 进行分析,只要除了bit0 也就是idle bit 位以外都是0,就说明可以识别ACMD41,也就说明这是一个SD卡,否则就是MMC,我觉得这么做没什么问题。

但是我觉得应该把它放在前面,先判断SD还是MMC,如果是MMC在用CMD1来进行初始化,如果直接把CMD1放在前面,可能会导致一定种类的SD卡不能用就是所谓的“薄的”SD。




下面是程序源码
INT8U SD_ActiveInit(void)
{
        INT8U param[4] = {0,0,0,0},resp[5],ret;
        INT32U i = 0;
       
        do
    {                                                                                                               
/* 发出CMD1, 查询卡的状态, send CMD1 to poll card status */
        ret = SD_SendCmd(CMD1, param, CMD1_R, resp);
        if (ret != SD_NO_ERR)
                       return ret;
        i ++;
    }while (((resp[0] & MSK_IDLE) == MSK_IDLE) && (i <= SD_IDLE_WAIT_MAX));
                                                                                                                   
/* 如果响应R1的最低位Idle位为1,则继续循环 */
                                                                                                                   
/* if response R1 Idle bit is 1,continue recycle */   
    if (i >= SD_IDLE_WAIT_MAX)
        return SD_ERR_TIMEOUT_WAITIDLE;                                               
/* 超时,返回错误 time out,return error */       
       
    ret = SD_SendCmd(CMD55, param, CMD55_R, resp);
    if (ret != SD_NO_ERR)
               return ret;
              
    ret = SD_SendCmd(ACMD41, param, ACMD41_R, resp);               
/* 激活内部初始化命令 active card to initialize process internal */
    if (ret != SD_NO_ERR)       
            return SD_ERR_UNKNOWN_CARD;
   
    if ((resp[0] & 0xFE) == 0)
              sds.card_type = CARDTYPE_SD;                                                /* 是SD卡 the card is SD card */       
    else       
            sds.card_type = CARDTYPE_MMC;                                                /* 是MMC卡 the card is MMC card */

        return SD_NO_ERR;
}

出0入0汤圆

发表于 2009-9-26 12:23:47 | 显示全部楼层
另外请教各位,“薄的”SD卡有人用过么,1.4mm,我怎么好像没见过

我们一般用得都是厚的吧2.1mm

出0入0汤圆

发表于 2009-9-26 12:30:19 | 显示全部楼层
是的,薄的小的卡一般转接为大卡接口再用吧?

出0入0汤圆

发表于 2010-4-28 14:44:16 | 显示全部楼层
我也碰到了这种情况,SPI速度为1.125M的时候,出来0x05,在562.5k的时候就正常

出0入0汤圆

发表于 2010-12-13 12:33:47 | 显示全部楼层
回复【14楼】caiyue3577
-----------------------------------------------------------------------
我发CMD55,返回的是0XFF。怎么解决?

出0入0汤圆

发表于 2010-12-13 14:04:05 | 显示全部楼层
我现在是发CMD0能正确返回01,
//判断该卡是否支持2.7V-3.6V的电压范围
if(buff[2]==0x01 && buff[3]==0xAA)
这个反馈也正常
但是发CMD55后,反馈回来是0XFF,0X7F,0X3F等,就是没有0X01
这个是什么原因

有知道的,加我QQ,49166262

出0入0汤圆

发表于 2010-12-13 15:22:57 | 显示全部楼层
现在是CMD55能返回01,可是ACMD41也返回41,我循环三遍后,CMD55开始返回0XFF了,
高手解答一下,这是什么缘故

出0入0汤圆

发表于 2011-4-15 10:41:34 | 显示全部楼层
回复【22楼】abyass
我也碰到了这种情况,spi速度为1.125m的时候,出来0x05,在562.5k的时候就正常
-----------------------------------------------------------------------

初始化要求小于400KHZ

出0入0汤圆

发表于 2011-9-20 17:44:25 | 显示全部楼层
我也遇到问题了,正学着解决……

出0入0汤圆

发表于 2011-12-16 23:10:50 | 显示全部楼层
求助,但没效果!

出0入0汤圆

发表于 2012-5-4 09:59:46 | 显示全部楼层
我的读SD卡2G,4G没问题,但读microSd卡4G的有问题。正试图解决。有解决的说说。

出0入0汤圆

发表于 2012-5-11 11:22:10 | 显示全部楼层
我是看原子的程序

发送CMD55后只要SPI线上没有返回0xFF,就接着发ACMD41,同时判断是否0x00

如果连续几百次都没有0x00的回应,说明是MMC(好像就是那种TF卡),这个时候要换初始化的方式

循环发这个命令试试看

SD_SendCommand(1,0,0);

看看返回值是不是0x00

我看的是老版本的程序,里面注明这个命令没有试过

详细的话可以在论坛里面搜正点原子stm32程序,新版本据说测试过可以识别基本所有的卡

出0入0汤圆

发表于 2012-6-12 10:40:09 | 显示全部楼层
请教:发送cmd0能正确收到0x01,接着发送cmd1,可是接收到的一直是0xff 又遇到的么?怎么解决?

出0入0汤圆

发表于 2012-7-20 18:00:41 | 显示全部楼层
SD卡为1.0协议也遇到的楼主说的问题啊

出0入0汤圆

发表于 2012-7-28 12:49:07 | 显示全部楼层
我的一直返回0x01,郁闷中

出0入0汤圆

发表于 2013-3-27 13:43:11 | 显示全部楼层
90999 发表于 2009-9-14 04:32
以下给楼主参考

CM0 -> CMD8 ---->{ SD V2} else { CMD55_ACMD41 --->{SD} else {CMD1 ->MicroSD}

我在弄SD卡,发送CMD0,CMD8后都能收到0x01,再发CMD55和CMD41得到的是0X55,这是怎么回事啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 08:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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