小寒节气的文章题目:请教SD卡读写的问题

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 01:31:03
楼主      请教SD卡读写的问题 发布时间 : 2006-2-27 下午2:12 提问者 : 广花路 最 近在做一个SD卡读写器的设计,但在SD卡初始化的时候遇到问题。在上电之后,我发出ACMD41命令读OCR寄存器,SD卡返回应答报告了工作电压范 围,但是无论我发多少次ACMD41下去,应答的第31位(上电状态位)一直为0,在SD规范上说当SD卡忙的时候该位是置0的。我用的是SD方式发命 令,在检测到卡插入之后,已经发了256个时钟让卡完成内部初始化的了,是否还有其他地方处理不正确或者没做处理?希望各位高手能指点一下,谢谢! 第 1 楼 :      sd卡读 发布时间 : 2006-3-2 上午10:05 提问者 : skeb 有可能是上电以后的延时不够50ms,你试着增加延时看看。 第 2 楼 :      sd卡读写 发布时间 : 2006-3-2 上午10:11 提问者 : skeb 可能是上电延时间不够,增加延时时间到50ms以上再试一下! 第 3 楼 :      已经做了延时 发布时间 : 2006-3-2 下午2:16 提问者 : 广花路 检测到卡插入之后,延时2秒再做处理的了。 第 4 楼 :      终于可以了 发布时间 : 2006-3-4 上午10:01 提问者 : 广花路 后来尝试了不判断上电完成标志位,提高了一点时钟频率,在发完ACMD41之后,读回的响应最高位虽然仍然为0,但是后面跟着发出的CMD2以及CMD3都能够收到正确的响应了,并且卡进入待命状态。 第 5 楼 :      sd卡读写 发布时间 : 2006-3-7 上午8:57 提问者 : skeb 你先发CMD55命令了吗 第 6 楼 :      OCR寄存器 发布时间 : 2006-3-7 上午9:53 提问者 : skeb OCR寄存器的内容读写的正确吗? 第 7 楼 :      OCR的内容正确 发布时间 : 2006-3-9 下午4:45 提问者 : 广花路 在将0x00FF8000这个值作为ACMD41的参数发下去后,读回的响应就有将第31位置位的。现在初始化过程已经完成,只是在发下擦除命令之后,DAT0线就一直变为低电平,不知道何解? 第 8 楼 :      卡状态寄存器 发布时间 : 2006-3-10 上午10:58 提问者 : 广花路 今天在等待DAT0高电平的时候,读了一下SD卡的状态寄存器,DAT0就变为高电平了,不知道是不是要读一下卡的状态寄存器,才能消除卡的忙状态呢? 第 9 楼 :      擦除命令 发布时间 : 2006-3-10 下午12:42 提问者 : skeb 由于擦除命令所需的时间相当的长,同时DAT0保持低,直到擦除操作结束。 第 10 楼 :      DAT0 发布时间 : 2006-3-14 上午9:14 提问者 : skeb 你再读一下卡里的数据,看一看擦除操作是否成功了。 第 11 楼 :      同样的问题 发布时间 : 2006-3-14 下午2:32 提问者 : cs 我 也是将0X00FF8000作为ACMD41参数发回去,但怎么也收不到第31位置1的响应。按照广花路的做法将频率提高了也还是不行。有几个问题我想问 一下:1,响应的第31位是不是SP7的最高位?(不要笑话我,因为手上没有多少完整资料,都是自己总结得出的结论)2,发CMD2,CMD3之前,还需 要发送CMD55吗?如果不麻烦的话希望广花路能发一份包含初始化命令的程序给我,我的邮箱是cuble@163.com,多谢多谢 第 12 楼 :      回复CS 发布时间 : 2006-3-14 下午4:39 提问者 : 广花路 我 是把0x00FF8000作为ACMD41的参数发下去,第一次读回的应答值是0x00FF8000,重发一次之后,读回的应答值就是 0x80FF8000 然后继续发CMD2,CMD3即可以完成SD卡的初始化。发CMD2,CMD3之前,不需要再发CMD55了。下面是我的初始化程序,只是一个简单的测试 程序,并没有做太多的考虑的。

ptr.ComandIndex = SD_APP_OP_COND;

ptr.Argument.DwordArgument=swapl(MY_OCR);

ptr.Crc = 0;

i = SDSendACommand(&ptr);



ptr.ComandIndex = ALL_SEND_CID;

ptr.Argument.DwordArgument = 0;

ptr.Crc = 0;

SDSendCommand(&ptr);

GetResponse_R2(Csd);

PRINT("The CID:");

PRINT_DATA(Csd,15);

PRINT("n");



ptr.ComandIndex = SEND_RELATIVE_ADDR;

ptr.Argument.DwordArgument = 0;

ptr.Crc = 0;

SDSendCommand(&ptr);

GetResponse_R6(Rca,status);



ptr.ComandIndex = SEND_CSD;

ptr.Argument.charArgument[0] = Rca[0];

ptr.Argument.charArgument[1] = Rca[1];

ptr.Argument.charArgument[2] = 0;

ptr.Argument.charArgument[3] = 0;

ptr.Crc = 0;

SDSendCommand(&ptr);

Result = GetResponse_R2(Csd);

if(Result != RESULT_PASS)

{

PRINT("SD Card Test failed n");

while(1);

}

PRINT("The CSD:");

PRINT_DATA(Csd,15);

PRINT("n");

// Read card id from RCA address, remain in stby state

ptr.ComandIndex = SEND_CID;

ptr.Argument.charArgument[0] = Rca[0];

ptr.Argument.charArgument[1] = Rca[1];

ptr.Argument.charArgument[2] = 0;

ptr.Argument.charArgument[3] = 0;

ptr.Crc = 0;

SDSendCommand(&ptr);

Result = GetResponse_R2(Csd);

if(Result != RESULT_PASS)

{

PRINT("SD Card Test failed !n");

while(1);

} 第 13 楼 :      DAT0一直低电平的原因 发布时间 : 2006-3-15 上午11:15 提问者 : 广花路 SD卡在忙的时候,把DAT0拉为低电平,如果没有继续提供时钟信号给SD卡,DAT0是不会变回高电平的,即使卡已经可以继续接受数据 第 14 楼 :      感谢广花路的帮忙 发布时间 : 2006-3-15 下午1:42 提问者 : cs 我从一篇关于Intel PXA250的资料上看到第一次ACMD41的参数为0X00200000,第二次ACMD41参数好象没有多大影响,

0X00200000,0X00FF8000好象都可以收到0X80FF8000的响应,CMD2,CMD3也已经收到正确响应.我想再问个问题,后面的初始化还有些命令的INDEX我不清楚,想请教一下,ACMD42,ACMD3,ACMD6的INDEX分别是多少? 第 15 楼 :      请教SD卡读卡器的问题 发布时间 : 2006-3-17 上午11:12 提问者 : 杨阳光 我也在做读卡器,但是初始化就收不到响应,我想请问一下?



(1)上电以后你发CMD0了吗?还是直接发ACMD41?

(2)按标准说明,发ACMD41前,应该发CMD55,

你发了吗?

(3)CMD0,CMD55以及ACMD41的CRC7的值是多少啊?



能不能把上述命令的48位二进制代码告诉我啊,谢谢啊!
第 16 楼 :      to 阳光 发布时间 : 2006-3-18 下午3:37 提问者 : cs 我用的是ARM平台,只需要配置几个寄存器就行了,CRC是处理器自己算出来的.我的初始化流程是:CMD0 => CMD55 => ACMD41 第 17 楼 :      我用的是FPGA 发布时间 : 2006-3-20 上午10:34 提问者 : 杨阳光 谢谢你!我也是这样发送的,那么你发送完CMD0后,等待多长时间发送下一条命令了,像广花路说的2ms吗?

按资料说明,上电后自动进入idle状态,应该不用发CMD0,对马?但是,无论是否发CMD0,我后面的命令都收不到响应。

我用FPGA来设计host,用的是verilog语言,我要设计初始化过程,但是无论发CMD55,还是ACMD41,我就是收不到响应,CRC也是我们自己设计的,还想请教一下:CRC的值无论正确与否,是否都会收到响应呢?还是如果不正确,就没有任何响应?

新手上路,还请各位多多指教! 第 18 楼 :      CRC 发布时间 : 2006-3-22 上午10:09 提问者 : 广花路 在SD 模式,crc错误的话,SD卡是没有响应返回的,而SPI模式好像进入之后就不用管CRC校验的。要验证CRC是否正确,可以计算一下 0X40,0X00,0X00,0X00,0X00的校验和是否0X95。上电之后,卡是自动进入IDLE状态,不发CMD0也可以,但调试的时候经常复 位系统、重新下载程序,如果不发CMD0的话,卡的状态就有可能不正确了,所以我还是在程序运行的时候先发一个CMD0下去,之后稍作一点延时,大概 100uS左右就继续后面的命令了。 第 19 楼 :      关于INDEX 发布时间 : 2006-3-22 上午10:24 提问者 : 广花路 我对SD规范的理解也不是很深刻、ACMD42应该就是先发CMD55,再发CMD42吧、INDEX就是42。同样、ACMD3的INDEX为3,ACMD6的INDEX为6 第 20 楼 :      回复:INDEX 发布时间 : 2006-3-22 下午3:31 提问者 : skeb ACMD命令和CMD命令主要的差别就是在每一个ACMD命令之前都要先发一个CMD55命令

例如:ACMD3命令正确的格式应该是

CMD55--〉ACMD3(命令索引是55,03)。 第 21 楼 :      我现在做SD卡的读卡器,出现了读不出数据的问题 发布时间 : 2006-4-9 下午10:35 提问者 : miaoxun206 我用的SPI模式.

初始化流程是:CMD0 => CMD55 => ACMD41

之后我又发命令:CMD58 => CMD16

之后延时一段时间进行读一个随机的块,命令是CMD17.

但是SD卡没有数据输出.不知问题出在哪里?请指点,谢谢
第 22 楼 :      回复主题:请教SD卡读写的问题 发布时间 : 2007-9-19 下午1:13 提问者 : 大鹏展翅 我也遇到了同样的问题,网上可以找到很多SPI模式的例程参考,不过我用的是SD模式,初始化都读不到响应,CRC计算程序我测试过没问题,至少CMD0不会错,但是那块卡就像石头一样“纹丝不动”。 第 23 楼 :      回复主题:请教SD卡读写的问题 发布时间 : 2007-10-7 下午3:57 提问者 : 追雨的日子 我也在用FPGA实现sd卡初始化,也遇到上面大家说的一些问题,哪位大侠能给知道一下啊,不胜感激!我的QQ:56072473 第 24 楼 :      回复主题:请教SD卡读写的问题 发布时间 : 2007-10-10 下午3:12 提问者 : JackYuan 单片机读写SD卡,MMC卡,MiniSD,TF卡,MicroSD卡
一:系统构成:
1:89C51单片机(ISP 单片机,可不用编程器)
2:128x64LCD
3: 带SD ,MiniSD ,MicroSD(TFSD)卡座 送32MByte SD卡
4:支持红外线遥控器(选配)
5:RS232接口
6:9按键

二:功能特点:
1:按扇区读写SD卡数据,支持任意容量的SD卡。
2:支持FAT16,读写SD卡中的文件。完全支持2G以下SD卡。
3:提供LCD的读写程序
4:红外遥控(选配)
5:所有程序均为C语言源码,有详细的函数说明,
可以方便移植到自己的系统中。

三:应用领域:
1:工业数据采集
2:移动数据存储
3:其它