上回提到了辨識SDHC與SD 2.x的方法
這次我們就來看SD 1.x與MMC的辨識方法囉
老樣子, 還是那一張圖...不過這次著眼於紅色框框內喔!!
不過這次我們要走的flow是CMD 8 -> ACMD 41 -> CMD 1
首先在CMD 8的部分就不再多贅述了
(cond. 1裡面已經有提到它的功能)
直接看code吧
// Send CMD8 to check SD card version r1 = SD_Send_Cmd(SEND_IF_COND, 0x000001AA); // If CMD8 response return 0x05: SD_V1/MMC if(r1 == 0x05) { SD_Dummy_Delay(); SD_MMC_Check(); }
// If CMD8 response is 0x01: SDV2/SDHC else if(r1 == 0x01) { SDHC_V2_Check(); }
在這段code中, 若CMD 8回傳的值是0x05的話
表示指令錯誤(Error)或者是沒有回應(no. resp.)
這就符合了流程圖上的規範
因此, 此張卡片為SD 1.x或是MMC
=================================================================
卡片的辨別仍是需要用到ACMD 41的指令
// Send CMD55 + ACMD41 repeatedly for checking card is SD V1 or MMC do { do { r1 = SD_Send_Cmd(APP_CMD, 0); SD_Dummy_Delay(); }while((r1 == 0xFF) && (test < MAX_TIMEOUT)); // If response of CMD55 is 0xFF denotes command trasnmitt fail if(test == MAX_TIMEOUT) return r1; // Otherwise, send ACMD41 for checking card's version r1 = SD_Send_Cmd(SD_SEND_OP_COND, 0); SD_Dummy_Delay(); retry++; }while((r1 != 0x00) && (retry < MAX_TIMEOUT));
跟先前的SD 2.x與SDHC的辨別不太一樣的地方
在這裡ACMD 41所輸入的參數為0x00000000
這個參數是進行SD 1.x與MMC判別的參數
再來就是等待ACMD 41回應的參數就好了
當ACMD 41回應的值為0x00, 表示這張卡是SD 1.x
=================================================================
等不到ACMD的回應嗎? 沒關係
可別傻傻的等喔
如果是MMC的話
可能你等個天荒地老都不會有response......
// If response of ACMD41 is not 0x00, and repeat to the limit // the card may be a MMC if(retry == MAX_TIMEOUT) { retry = 0; // Send CMD 1 for MMC initialization do { r1 = SD_Send_Cmd(SEND_OP_COND, 0); SD_Dummy_Delay(); retry++; }while((r1 != 0x00) && (retry < MAX_TIMEOUT));
在程式中已經先設定好retry的次數了
(一般而言設個100~200就足夠了)
只要retry的次數到了, 就自動下CMD 1的指令
(然後也是再等個它1~2百次......)
如果連CMD 1都沒有反應(或是一直收到0x01)
那有可能表示這張卡已經掛了
或者是它不是SD卡= =
=================================================================
話若是講透枝, 目屎是流不離
講到這裡, SD卡的初始化流程已完整解密
當然, 這個部分也是設計SD卡驅動程式中最複雜的一段
因為初始化不成功, 是沒辦法進行對SD卡操作的
另外要再提醒一些小細節
首先是 timing 的部分
當下達SD卡的指令時, SD卡不一定會馬上給你回應
可以多try個幾次, 直到SD卡回覆為止
這個部分的程式實現, 請善用do-while loop
相信它可以幫你完成你想要的功能
(當然也是要小心使用)
第二就是在SD卡的CMD部份
其實SD卡的CMD是非常之多
各有各的用途
在使用前, 請先詳細閱讀SD SPEC.
(可到SD Association下載)
一定會幫助你對SD卡內部的架構更為熟悉
在完成初始化之後
再來就可以對SD卡進行讀寫了...
1 則留言:
你好
請問一下
如果我是用sd mode去做的話
初始化設定是否相同呢
謝謝
張貼留言