EETOP 创芯网论坛 (原名:电子顶级开发网)

标题: sd卡SD模式操作 [打印本页]

作者: qswsjs    时间: 2012-11-17 15:13
标题: sd卡SD模式操作
最近在搞sd卡的驱动,先说说我发送的命令顺序,cmd0--cmd8--acmd41(first 0acmd41)---acmd41(询问acmd41)等待响应ocr[31] 也即是busy位变1后--cmd2--cmd3--cmd7都有正确响应----acmd6但是在发送acmd6命令时候,命令状态就始终卡在cmd8命令上了。不知道为什么,如果不发送acmd6命令,则前面的命令都能正确执行。请教高手,有谁知道这是为什么啊???
作者: elec_zxm    时间: 2012-11-19 18:03
这个表述太难理解了。。把命令续写先写清楚,然后另起段进行解释和问题描述。
作者: wdzic_fbb    时间: 2012-11-19 18:33
楼主是用FPGA在调试,还是PCB板级,很可能是板子的问题
作者: qswsjs    时间: 2012-11-21 21:07
回复 3# wdzic_fbb


    我用fpga调试的。用的是opencores上面的sd卡控制器的ip核,请问你看过这个么?
作者: qswsjs    时间: 2012-11-21 21:12
回复 2# elec_zxm


    我仔细说下吧!我用fpga调试的,用的是sd卡控制器的ip核。我在wishbone总线上发送命令给sd卡。我写的状态机,发送命令顺序就是上面所说的。我现在sd卡的初始换基本完成了。发送ACMD6命令,sd卡的响应也是正确的。但是我再继续写下面的命令,然后运行,sd卡cmd8命令的响应就会出错???不知道为什么,不知道你明白了没有?
作者: nono2000    时间: 2012-11-21 21:13
SD 是 1bit还是4bit?SD_1bit就是 spi 模式.
你的 SD IP 是硬核还是软核?软核友晶有这方面资料.
作者: qswsjs    时间: 2012-11-21 23:10
回复 6# nono2000


    我用的是sd模式4位数据线!我用的是软核啊。你有那个软核代码么,可以给我参考一下么,谢谢了
作者: 飞扬紫百合    时间: 2012-11-22 16:39
some CMD can be ignored!
you should not code your driver sheerly following the specification!
作者: elec_zxm    时间: 2012-11-22 18:42
找一个小于2GB的卡试试
作者: qswsjs    时间: 2012-11-25 19:51
回复 8# 飞扬紫百合


    ok,thank you alot
作者: qswsjs    时间: 2012-11-25 19:57
回复 9# elec_zxm


    现在手上只有一个4G的卡,我再调一下试试吧。
作者: harejavahill    时间: 2012-11-26 14:38
发送了ACMD6后怎么又发送CMD8??不是很理解!
LZ把命令顺序写清楚点或者把出问题地方的命令写出来大家看看。
因为从spec上看,CMD8只能在卡的IDEL状态接受,而ACMD6只能在卡的TRAN状态接受,因此我在想,LZ是不是在卡的相应状态送错了命令而被卡错误解释了。
作者: y23angchen    时间: 2012-11-26 16:09
看看高手怎么处理
作者: qswsjs    时间: 2012-11-26 20:01
回复 12# harejavahill


首先CMD0,然后发送CMD8 参数0x000001aa ,响应0x000001aa
CMD55,参数0x0,响应0x00000120
first  ACMD41 ,参数0x00100000 , 响应0x00ff8000 ,BUSY位没有置1
CMD55,参数0x0,响应0x00000120
second ACMD41,参数0x00000000,响应0xC0ff8000 ,BUSY拉高了
CMD2>CMD3>CMD7这些命令的响应都是正确。
然后就要就写数据读写操作了。
先说一下,我用fpga调的,用的是opencores上面的sd卡控制器的ip核。
接着,我就要送出要读sd卡blcok的地址,和把读取的数据存储到ram的地址,控制器里面不断的查询状态,当监视到有地址信息时,控制器自动发送cmd17命令。现在问题出现了,就在我发送地址信息时,sd卡就会卡在cmd8命令上,sd卡没有响应,也就不能执行下面的命令。
ps:cmd8命令指的是上面说的发送的那个命令,不是在cmd7命令之后发送的,我的意思是我要进行数据读写的时候就会在cmd8命令上卡住,不知道为什么,求解答
作者: elec_zxm    时间: 2012-11-27 09:16
仔细扣扣协议吧,之前搞过这玩意,现在都忘了。Busy状态,忘了,和IDE有点混。你还是好好看看协议。
作者: chui0    时间: 2012-11-27 14:22
回复 1# qswsjs


    太复杂了。。。
作者: stormyoyo    时间: 2012-11-27 15:05
查一下opencore的代码看看问题出在哪里
作者: qswsjs    时间: 2012-11-27 16:16
回复 17# stormyoyo


    我一直在研究这个代码呢,找不到问题在哪。
作者: zhch7777    时间: 2012-11-29 16:46
没太看懂,CMD8不是在初始化时只能跟在CMD0后面的吗?发CMD17怎么会和CMD8有关系?发个CMD17就该给数据了
作者: qswsjs    时间: 2012-11-30 21:37
回复 19# zhch7777


    不是在cmd17命令之后发送的cmd8。是我要进行读数据的时候,初始化的时候那个cmd8的命令就没响应了。
作者: zhch7777    时间: 2012-11-30 22:09
初始化一次不就行了,读数据时候干嘛还要初始化?
作者: qswsjs    时间: 2012-12-1 14:49
回复 21# zhch7777


     但是我继续写程序的时候,重新下载程序,肯定又要重新运行啊。程序肯定又从头开始执行啊
作者: zhch7777    时间: 2012-12-1 20:55
再一次就不行了?有点怪,我原来是直接FPGA产生的时序,只要先发cmd0,再发cmd8都可以阿.有可能的话,可以用示波器看看cmd线有啥区别
作者: qswsjs    时间: 2012-12-4 23:12
回复 24# zhch7777


    我也是直接fpga产生的时序,所以说每加一条命令,又要重新综合布线什么的,重新下载,从头开始运行!我现在cmd17命令发送下去了,但是sd卡没有传输数据,数据线一直为高!那个cmd17的参数设置(也就是sd卡的地址)应该怎么设置,我直接设置成0x000000了,也就是读取第一个扇区的值。不知道地址设置的对不对呢??
作者: elec_zxm    时间: 2012-12-5 09:54
协议看的不够仔细,这些东西不能猜的。
作者: zhch7777    时间: 2012-12-5 10:00
回复 25# qswsjs


   对的呀,不论是大容量卡还是原来的标准卡都是可以的,cmd17没有响应,可能是本身命令发的不对
也可能是上一个命令发的不对,可以仔细查一下上一个命令的响应码,有明确的错误代码的
作者: qswsjs    时间: 2012-12-5 11:14
回复 27# zhch7777


响应是正确的。我发送ACMD6设置四位模式。响应是0x0920,处于transfer状态。发送CMD17命令,响应是0x0900,也处于transfer状态,应该也是正确的,因为如果在数据传输过程中应该是在data state,传输之前和传输完成之后应该就是在transfer tate,我现在发送cms17命令,还没开始数据传输,sd卡处在transfer state也应该是正确的,现在就是不知道为什么没开始数据传输,cmd17读命令发送下去之后,一般在100ms内,sd卡就会启动数据传输的!
作者: qswsjs    时间: 2012-12-5 11:15
回复 26# elec_zxm


    没有猜的,我都是按照协议写的,sd卡的地址最后9位为0,前面的地址是扇区的地址。
作者: zhch7777    时间: 2012-12-5 14:11
回复 28# qswsjs


   那往里面写过数据吗?最好先擦除后再写点数据
作者: qswsjs    时间: 2012-12-5 14:52
回复 30# zhch7777


    现在读都读不出来数据,写更不行了。还是先把读数据测通!
作者: zhch7777    时间: 2012-12-5 21:05
回复 31# qswsjs


    好像不是的,要先写数据,才能读出来,没数据读啥啊?我是先调擦除,后写做好才读的,响应没问题,数据应该出来.擦除状态下没数据,好像读不出来数据.
作者: see123    时间: 2012-12-7 17:32
。把命令续写先写清楚,然后另起段进行解释和问题描
作者: duchuanchuan    时间: 2013-9-9 13:45
你好,我现在也在做SD卡控制器,发送完CMD8命令相应不对,你是怎么做的?
作者: kka    时间: 2013-9-16 00:28
可以把你發的整個flow先描寫一下嘛...
你先發sd initial flow,後來在發ACMD6.
怎麼又會發到CMD8呢?
作者: darin_l    时间: 2013-12-23 14:14
你现在调通了么?我好像遇到了跟你一样的问题啊~~~~~~~~~~~~~~~
作者: darin_l    时间: 2013-12-23 15:58
回复 34# duchuanchuan


   你 arguement参数配正确了么?
作者: guyuehsw    时间: 2014-7-25 10:41
回复 29# qswsjs


   既然是4G的卡,那就是高容量卡,那么块地址就不应该左移九位!
作者: enjoylife2017    时间: 2015-8-5 12:36
回复 12# harejavahill


   嗨你好,CMD8不是保留吗? 居然还有人发这个指令?。。
作者: enjoylife2017    时间: 2015-8-5 12:49
诸位,要是问题解决的话,就发一下结果和怎么解决的嘛,让我们这些也学习一下嘛。。。
作者: enjoylife2017    时间: 2015-8-24 10:49
回复 1# qswsjs

你好,请问你当时的问题是怎么解决的?我现在SD卡SD模式调到你当时的那个位置了。初始化到CMD17指令,CMD17的返回是0X900.CMD17的参数是0x000000,就是想读取DBR扇区里的一些参数。不知道为啥,数据线一直为高。。特意向你请教,非常感谢。
作者: enjoylife2017    时间: 2015-8-24 21:45
回复 1# qswsjs
嗨,你好。请教一下,我现在也在用FPGA调试SD卡,SD模式。初始化成功,发送完ACMD6后,发送CMD17,CMD17响应是0X900,CMD17的参数我设为的全0,就是想读取第一扇区的参数。现在的问题是数据线一直是F。不知为啥。我在ACMD6后用ACMD42把data3上的上拉电阻取消的。
作者: eebinqiu    时间: 2015-10-22 17:41
回复 42# enjoylife2017


    我是用signtaltap看波形的,我开始也以为没有数据,后来发现数据是在很多个时钟后才出来的,signaltap没有足够的深度来采样, 可以用dat0的下降沿为触发信号, 看看有没有数据。
作者: enjoylife2017    时间: 2015-10-22 22:20
回复 43# eebinqiu


   O(∩_∩)O谢谢。我已经看到数据了。不过现在有个奇怪的问题。我有俩块板子。CMD18在altera板子上可以读取到数据直到数据最后的一个字节。但是Xilinx则在数据传输的过程中,比如在10k字节的时候数据就错了。就不对。当然我都是用逻辑分析仪和chipscope看的。这点不知您能不能給个建议。
作者: fanshuang123456    时间: 2016-8-30 11:01
软核怎么弄的:
作者: slsfamily    时间: 2017-1-3 09:07
回复 5# qswsjs


  你好,最近我也在搞SD卡驱动的程序。SD卡ip核的代码是否可以给我一份,谢谢。1584051085@qq.com




欢迎光临 EETOP 创芯网论坛 (原名:电子顶级开发网) (https://bbs.eetop.cn/) Powered by Discuz! X3.5