SD卡的初始化过程
我的命令操纵过程是CMD0、CMD8、CMD55、ACMD41
首先,你要确定你测得的什么版本的卡,1.0,2.0还是3.0?
如果是2.0,你把你的ACMD41上的参数写出来,有可能是你的参数设置有问题。
谢谢你的回答。我
用的是2.0的协议,因为我发送CMD8之后,response是0x01。
我发送的ACMD41命令参数是0100_0000_0010_0000_0000_0000_0000_0000。我用万用表量了一下SD卡的电压两端,是3.34V。
好,非常感谢
1:CMD8的response中的back echo怎么全是0,难道你的CMD8参数中设置的为0?
2:至少要发两次ACMD41,而且这两次的参数和其response是不一样的,所以你还没有把问题描述清楚
1.我的CMD8response不是零,不是写了最后response是0x01么?返回的response的voltage accepted相应部分的值是0001;
2.第一次发送ACMD41命令是0100_0000_0010_0000_0000_0000_0000_0000;然后就开始一直的循环,用的参数就是0000_0000_0000_0000_0000_0000_0000_0000了。
1:如果是这样,那我感觉是不是你的CMD8命令就是问题了。
从协议上看,CMD8的response的最后16位是echo-back of check pattern,次4位才是voltage accepted。如果如你所说,那在CMD8参数中设置的check pattern是0x01(协议上推荐的值不是这个值),而且卡的voltage accepted是0,这个是不合理的。可以再看看协议资料
2:你第一次用ACMD41根本就没有读出卡的电压范围,所以你第二次发的时候可能出现电压不匹配。
个人觉得可能还是CMD8命令导致初始化不成功
1.好吧,我把CMD8的命令都贴出来吧,
CMD8的初始命令:
0100_1000_0000_0000_0000_0000_0000_0001_1010_1010_1000_0111
CMD8的response:
0000_1000_0000_0000_0000_0000_0000_0001_1010_1010_0001_0011
这里的response和cmd包含了全部48比特的信息,我觉得上面的命令和response是没错的。
2.我发送第一次ACMD41的命令之后,产生了response。
ACMD41的命令是:
0110_1001_0100_0000_0001_0000_0000_0000_0000_0000_1100_1101
ACMD41的response是:
0011_1111_0100_0000_1111_1111_1000_0000_0000_0000_1111_1111
我不觉得有啥问题啊
说得很仔细了。
从上面看,你的CMD8是没有问题的。但感觉你第一次发的ACMD41有点问题,但其response又没有问题。
个人建议:
1:把第一次发的ACMD41的参数全改为0试试:0110_1001_0100_0000_0000_0000_0000_0000_0000_0000_1100_1101
2:或者再把你第二次(三次)发的ACMD41命令和response贴出来看看
忘说了,把第一次ACMD41的参数全改为0后,后面的CRC可能不一样了,LZ不要把我写的那个数据直接copy了哈。
如果第一次发送ACMD41的参数都是0的话,那不就是询问OCR寄存器么,那有啥区别的?
不一样的,你可以试试,协议上规定是需要全为0的,卡里面可能就是检测全是0,才往下执行状态机
哦,我先试试看,谢谢你了啊。
怎麼跟我讀的spec不一樣?
底下先不談READY這件事,先談OCR register
如果是SD 1.0~1.1
SD Host在CMD0之後會對SD CARD送ACMD41, argument會內含OCR register的值(就是表示SD HOST可以支援的working voltage),然後SD CARD也會把可以support的working voltage回覆在R3 response裡面
如果是SD 2.0~3.X
SD HOST會發送CMD8 --> CMD0 --> AMCD41, ACMD41的argument也一樣會包含OCR register的值,只是額外還會在OCR register的BIT[30],顯示SD HOST是否支援高容量的CARD (High capacity) 或是一般容量的CARD (Standard capacity)
如果SD HOST送了ACMD41但argument全為0,就表示這個SD HOST任何工作電壓都不支援,這時候就看SD CARD端的設計,有的SD CARD還是會乖乖的在SD response裡面回覆可以support的工作電壓, 反正SD HOST有送Command來詢問,只要是legal command, 而且願意繼續送出SD Clock,那麼SD CARD就願意繼續回覆Response,
當然有的SD CARD也可能就直接不回覆response了,反正SD HOST都說任何電壓都不支援了,我為啥還要回覆response
另外,ACMD41是需要SD HOST一直發送給SD CARD,直到SD CARD回覆的response裡,OCR value BIT[31]變成1,SD HOST才會繼續送CMD2, CMD3 .....讓SD STATE繼續往後走,所以可別只送一次ACMD41,這樣SD CARD是來不及在短時間之內就處理完內部的工作而去設ORC register BIT[31] =1
第一,試著把你的OCR value改的跟CARD片一樣
現在的CARD都是Support 3.3V左右,但是可容忍範圍3.6V~2.7V都可以,因為怕有相容性問題,所以容忍範圍都比較大
第二,如果還是不行,請更換另一張SD CARD
有可能是SD CARD 內部的韌體死掉了,或是SD CARD內部的FLASH有很多BAD BLOCK,才會造成在initial state,SD CARD 一直是BUSY的狀態
另外提醒,雖然SD SPEC規定initial timeout時間為1秒,但是多半都是幾百us~數ms SD CARD就會ready, 以SD HOST的角度來說.....如果可以...請把timeout的時間拉長一點,因為現在SD CARD搭配的NAND FLASH效能越來越不好,需要花更多的時間才會變成READY
至于1.0,我不确认,但对于2.0,你说可能不正确。 你说的是第二次(或者第三次。)发ACMD41时的参数设置
现在的结果还是不行,我把现在做的过程以及结果都写下来,大家看看是不是哪里有问题,谢谢各位。
首先,问题是SD卡在ACMD41的response当中的busy位总是维持0状态,不能完成当前的initial操作。
而我做的操作流程有两个
第一个流程是CMD0、CMD8、CMD55、ACMD41(first ACMD41)、CMD55、ACMD41(询问ACMD41)、CMD55、ACMD41(询问acmd41)、。
第二个流程是CMD0、CMD8、CMD55、ACMD41(询问ACMD41)、CMD55、ACMD41(first ACMD41)、CMD55、ACMD41(询问acmd41)、。
根据我看到的协议呢,在2.0协议的情况下,ACMD41的第一次发送会像SD卡发送当前的HCS和电压值,在此之后,再发送的ACMD41仅仅是询问ACMD41,主要的用途是为了获得SD卡的OCR寄存器的值,并且查询当前initial的过程有没有完成,也就是OCR的31位busy位了。我觉得这个的理解是没错的,我从协议上也看到了相应的说明。至于在询问ACMD41阶段的参数值是不是和first ACMD41一致,还是清零,这个我可以试试。
目前所做的两种测试结果什么区别,得到的响应很相近。
CMD0命令为:
0100_0000_0000_0000_0000_0000_0000_0000_0000_0000_1001_0101
CMD8命令为:
0100_1000_0000_0000_0000_0000_0000_0001_1010_1010_1000_0111
CMD8的response为:
0000_1000_0000_0000_0000_0000_0000_0001_1010_1010_0001_0011
CMD55的命令为:
0111_0111_0000_0000_0000_0000_0000_0000_0000_0000_0110_0101
CMD55的response为:
0011_0111_0000_0000_0000_0000_0000_0001_001-_0000_1000_0011
ACMD41的命令为:
0110_1001_0100_0000_0010_0000_0000_0000_0000_0000_1100_1101
ACMD41的response为:
0011_1111_0100_0000_1111_1111_1000_0000_0000_0000_1111_1111
在上述的命令响应当中,ACMD41的response一致是如此的,而且最奇怪的是,所有的电压位都表示位1,这是有错误么?
我用万用表量了一下SD卡的供电电压为3.5V,所以我觉得我的设定没有错误的啊
对你说了半天,白说了。
什么白说了,我试过了,先发送CMD55和ACMD41(所有ACMD41里面的电压参数为0),然后再发送CMD55、ACMD41(正常设置里面的电压参数),然后在发送询问类的ACMD41。不是这样么?
结果一样,没区别
先解決dabenzhong的問題
1. 先確定你手上的SD卡在其它的SD HOST有沒有相容性問題,比方拿一台SD CARD READER來試試看,看看能不能正常辨識到這張SD 卡,或是換卡來測試
(1)如果別的SD HOST也辨識不到這張卡,就表示這張卡有問題,請換張正常的卡
(2)如果你換了別張卡(在其他SD HOST是可以正常認到卡的)來測試你自己的SD HOST, 卻還是認不到,請利用Logical analyzor或是SD protocol analyzor來查問題,模仿別的SD HOST來發送Command (不只command argument內容,還有SD clock的頻率)
=====================================================
在SD Version 2.0
只有特別提到SD CARD會在第一個ACMD41中,去檢查OCR的HCS bit.
並沒有特別提到所謂的第二個ACMD41 第三個ACMD41 .....的差別. SD HOST原則上都是送出ACMD41,都是帶著一樣的Command argument.
規格中,針對Initialization and Identification Flow,這是用來示意,表示某功能的flag的判斷順序,給SD CARD的Designer參考,並非真的就是照它畫的去區分1st ACMD41 -- 2nd ACMD41 -- 3rd ACMD41.....
我知道TestMetrix在測試SD compliance的時候,在power-up之後,會送多個ACMD41
1st ACMD41 with argument = 0
2nd ACMD41 with argument = work voltage
3rd ACMD41 with argument = work voltage
...
... 直到SD CARD回READY
這是TestMetrix它自己的測法,但不表示SD SPEC裡 ACMD41有第二第三的差別
每個ACMD41的間隔時間也很長,內部處理速度快的CARD可以在第二或是第三個ACMD41就可以讓CARD變成 Ready
以上是我的經驗和認知
當然也有SD HOST就模仿TestMetrix的測試方式去發送Command,它們的想法是...既然SD CARD可以測試過TestMetrix,那麼設計SD HOST的時候,也照著一樣的方式去發送Command,應該也不會出什麼錯誤
回pcbass
我现在所有的结构都是通过逻辑分析仪观察所得,在测试当中发现了个奇怪的问题。
首先,我用的是2G以上的Sd卡。发送第一个ACMD41的时候,所有参数为0,然后之后的ACMD41命令的时候都正常设置。然后,我通过逻辑分析仪观察到,如果SD卡的response响应了HCS位,那么再发送ACMD41后,SD卡无response。而如果SD卡的response没响应HCS位,那么就会一直busy。
关于第二点我可以理解,因为协议上也说明了,如果是HCS卡而没有将相应的位设置为1的话,那么就会在初始化的过程当中一直维持busy状态。但是我不明白为什么当SD卡响应了HCS位之后,为什么再发送ACMD41命令后会没有response的呢?
而且,我想问一下,在第一次发送ACMD41的时候,并且所有argument都为0的情况下,SD卡的response当中的HCS位会拉高么?也就是OCR寄存器当中的第30位——CCS
LZ用的是标准SD卡,还是SDHC卡?
~
SD 卡卡的初始化开始于接收到ACMD41指令之后,ACMD指令的 HCS(Host Capacity
Support)位如果设定为1的话,表明控制器支持SDHC 卡,否则表示不支持。
在 CMD8 命令发送之后的ACMD41指令其功能有所扩展,在参数里多了HCS 部分,在响应
里面多了 CCS(Card Capacity Status)部分。HCS参数会被不响应CMD8 命令的SD卡所抛
弃。控制器向不响应CMD8的卡发送 ACMD41指令时,HCS位应该设置为零0。如果向 SDHC
卡发送 HCS位为 0的ACMD41命令,SDHC卡返回的响应,其busy 标识位永远为0,代表忙状
态。HCS标识位用来表明SD 卡是否已经完成初始化,如果未完成,HCS为零,否则为1,如
果 HCS为 0,控制器会重复发送ACMD41指令,SD卡只检查首次接收到的ACMD41指令的HCS
位。
响应CMD8的 SD卡发送的对于ACMD41指令响应会包含CCS部分,控制器只检查HCS标
志位为 1 的响应所包含的CCS 位。CCS=1表明其为SDHC 卡,否则为标准SD卡
刚开始研究SD协议,希望能一起讨论
wangyingwei提供的資料沒錯
SD CARD只有在第一個ACMD41會去檢查CARD是否是高容量的卡(4G以上),所以dabenzhong要是第一個ACMD41沒有把OCR register的BIT[30]設成1, 這張高容量的SD CARD就會認為,它所對應的到SD HOST並不支援 High capacity (只支援Standard capacity),所以後續就不回response.
如果SD HOST一開始有送CMD8, 再加上第一個ACMD41的HCS=0, SD CARD就會認為對方是一個符合SD v2_00 但是只支援Standard capacity 的SD HOST
可以去看SD v2_00 Spec的 Chapter 3.3 Card Capacity, 這邊有一張圖,就會看到 Host supporting Standard capacity 不能用於High capacity SD Memory Card (那條連線是虛線,不是實線)
所以只要把第一個ACMD41的HCS設成1,SD CARD依該就有RESPONSE了.....先這樣試試看!
(好久沒複習SD Spec了.....)
如果是Standard capacity的card就不會 (CCS=0) 如果是High capacity的card (大於等於4GB)才會CCS=1
根据我所看到的结果,CMD8的相应没问题,试过很多张卡,响应都是一致的,而且没有错误。但是到后面的ACMD41就很奇怪,要不就是没有CCS的response,要不就是busy位总是0,不明白是为什么。
我用的SDHC高容量卡,协议是2.0的(CMD8的response证实了这点)。然后时钟是200KHz的,电压为3.5V(ACMD41当中的相应位和SD卡两端的电压匹配),第一次ACMD41设置HCS和相应的Voltage值,之后的ACMD41的Voltage值都为0。
但是目前SD卡对ACMD41的response中的busy响应始终为0。试过kinston的2G卡、8G卡、16G卡以及sandec的SDHC卡,结果一样,还有什么地方是我忽略了的?
CMD0的那边是有个等待80个时钟周期的过程是吧,是指在给SD卡供电之后,在提供了SD卡时钟之后,至少维持CMD线高电平80个时钟周期再发送命令是吧。