SD模式读Sd卡数据周期错误,求高手,求前辈

根据SD模式时序的协议,FPGA应该在上升沿锁存卡返回的数据,图中reg_clk_sd是我提供给卡的时钟,但signaltap采到的数据表明,卡并没有按照我提供的时钟一个周期发4位数据,如图的F8数据,这就造成程序中保存不到这个数据,并造成后续字节错位,
signaltap是没问题的,因为我直接通过串口发到PC上看过了,F8就是没采到,
现在有以下几个问题:
1.发CMD17能读出数据证明我前边的初始化是没问题的吧?
难道是我读数据的时钟有问题?
2.请问出现这种情况的可能原因是什么呢?
跪谢。
您好,是否可以麻煩您說明一下你所發出的SD command flow呢?
您是預期發CMD17之後 SD card會給你4 bit mode的data對嗎?
前辈你好,我是以400kHZ,CMD0,CMD8,ACMD41,CMD2,CMD3完成初始化,
然后以25MHz,CMD7,ACMD6,CMD17开始读数据,应该没错吧?
嗨,你好。请教一下,我现在也在用FPGA调试SD卡,SD模式。初始化成功,发送完ACMD6后,发送CMD17,CMD17响应是0X900,CMD17的参数我设为的全0,就是想读取第一扇区的参数。现在的问题是数据线一直是F。不知为啥。我在ACMD6后用ACMD42把data3上的上拉电阻取消的。
不过,我在协议中看到一句话大概的意思是data3上有个上拉电阻,在数据传输时要把它取消掉。唉,我也不知道我的问题在哪里,woz现在用的是ISE调的改天也用Quaruts试试。希望我们能交流一下,谢谢。
嗨,你收到的应答应该是没问题的,你检查下你的sd_data方向控制的对不,也即,保证CMD17后sd_data是作为输入端口用的。
fkl523大大..你發的cmd flow 是對的...請問你是否有檢查過所有的 SD card 回的 response 呢?
是否有CRC error 或是 回的 status是不對的呢?
你好,我现在也在调试SD卡,用的是SD4线模式,FPGA。你的初始化成功吗?我把给SD卡的时钟取反给SD卡的,我的意图是保证SD卡和FPGA程序的时序上差半个时钟,这样让他们相互的数据都准备充分了在处理。不知你是怎么处理的。CMD17相应0x00400900.前面的响应都是对的,CMD3响应是0x700.请问诸位大侠是怎么回事啊?他关键是CMD17的响应有个4,代表着当前卡不接受的命令。哎,我就不懂了。能交流一下吗?
我在发送CMD17的时候,SD_data是输出F,之后的读响应是SD_data是输出Z,读开始为‘0’,接着是度响应,但现在的问题是,CMD17的响应是0x00400900,意思就是说卡当前状态不支持的命令。我就相当的不懂了。之前的初始化CMD8响应位0x1AA,ACMD41响应是0xC0FF8000,CMD2响应正常,CMD3第一次响应是0x520,第二次是0x700,我就是在CMD3的响应是为0x700后再接着发送CMD17,然而CMD17的响应就奇怪了。还特意向您请教一下,问题是出在哪里?

Hi,你CMD3为啥发两次呢?
发一次卡就回返回RCA了,然后用RCA作为参数发送CMD7选中卡(没看到你发CMD7),你试试可以不,
另外,SD卡是分物理地址和逻辑地址的,有的卡物理地址和逻辑地址是一样的,所以用WinHex之类的软件观察时要注意这个区别。
你只要能收到返回数据块的起始位,4个“0”就ok,接下来肯定是连续的数据了。

你说得对。我发2次CMD3的原因是因为第一次发CMD3他不会返回0x700,返回0x520.而且这里,我的另一张卡他一来就返回0x700,不会返回你的0x520.
之后我就立马发了CMD7,ACMD6,CMD17.还有一个问题,在返回的R1响应里的卡状态里的“CURRENT_STATE”,Z这个的意思是收到命令时卡的状态。也即是说是前一个命令对应的卡的状态,而当前命令的状态要在下一个命令的响应里才能看到。这样理解对吗?协议里是这样写的。这样理解是对的话,CMD2后是identification 状态,则CMD3就该响应0x500,表示CMD2后的卡状态是在identification。不知道我有没有理解错,还请求你赐教一下。谢谢
好的,看见了。非常谢谢。你是低容量卡?我马上只发CMD3一次试试。
对了,在之前我的FPGA的始终和输出给SD卡的时钟是一样的,但是实际给SD卡的时钟的时候我取了反再给SD卡。前天是正确的读出第一扇区的。不知道这个有没有影响。我现在还是取反后给SD卡。
你发了两次ACMD6?,看你的图片你的第一次ACMD6回应0x920,第二次回应0x900. 我也用的4线SD模式,也要看你的ACMD6啊。这是我的QQ号1170430934,能加我一下吗。拜托。
我的问题解决了。原因是我的程序是对的。然而我给的CMD17的参数是0,他读的是物理扇区的数据,不是逻辑扇区0的数据,当然就不是启动扇区的数据了。我之前用的是中文版的WINHEX,他不给力呀,我用了英文版的winhex就看见了我读到的是物理0扇区。
特此感谢flk523.
您好,我最近在调SD卡的初始化FPGA程序,但是发送命令没有响应,用的是200k时钟,发命令之前等待512个时钟,之后直接发CMD8,再发CMD55,ACMD41等,但是从CMD8开始就得不到响应,我测过SD卡的电压是3.3V,在2.7-3.6V的范围内。求大神指点,或者告诉我当时您的初始化具体流程,先谢过了!
您好,我最近在调SD卡的初始化FPGA程序,但是发送命令没有响应,用的是200k时钟,发命令之前等待512个时钟,之后直接发CMD8,再发CMD55,ACMD41等,但是从CMD8开始就得不到响应,我测过SD卡的电压是3.3V,在2.7-3.6V的范围内。求大神指点,或者告诉我当时您的初始化具体流程,先谢过了!
第一个应该是CMD0吧,你再试试
谢谢您的回复,之前是因为看到specification中说SD模式下发CMD0没有必要,所以省去了。后面我把CMD0加上了,发了CMD0后,等了16个时钟,发送CMD8,发完CMD0后直接把cmd设为了输入模式(对SD卡来说),仍然没有响应。另外,我也将数据线都设为输入模式了,发的全1,实在找不出是哪儿的问题。
你的问题解决没? CMD0没有应答啊,等16个周期没问题,发CMD8的参数对不对?对的话CMD8应该有应答的。
如果还是没应答,建议查一下硬件是否有问题。
没解决,是这样的,我之前写了个SPI模式的,但是功能正常,发CMD8有正确的响应,但是SD模式下就是没响应,所以我觉得硬件出问题的可能性不大(如果我说的不对请指正)。虽然我怀疑是cmd的三态总线出了问题,但是我觉得我没用错啊,我定义了输出使能信号oe,如果oe为0,则向SD卡控制模块向SD卡发送命令,cmd = (!oe)?cmd_ff:1'bz,这里的cmd_ff是我从初始化模块中输出到SD卡控制模块的命令。之后我把cmd打拍到cmd_reg中,如果oe为1,我就把cmd_reg作为响应信号(rsp_tmp)送到初始化模块里面。chipscope里面抓的信号如下所示。希望大神指点迷津,绊在这儿好几天了。对了,我用的是microSD卡,这应该没什么影响吧?
对了,数据线我也拉高了,assign dat = doe_ff ? din_ff : 4'hz;里面的din_ff我在前面都设置的是全1,doe_ff也是1.
你CMD8的参数及CRC都是正确的,你这个chipscope的图是在发送CMD0时触发的,你有没试试对应答进行触发看之后能否触发到?也许CMD8好多周期才回的应答呢。
好的,这也是我正想试试的方法,谢谢大神,有什么进展我会再贴出来。
,我试过了,触发不到,一点响应都没有。我也核对了pin连接,没有问题,我在初始化模块和SD控制模块使用的时钟都是400k的SD时钟,都是用的上升沿触发,发命令前等待的时间也是够了的,发命令的顺序也没错,三态门我自认为也没写错。到底是哪儿的问题?关键是其他人好像还没遇到过这种奇葩的问题,好揪心。希望大神继续指点!
