2011年4月11日 星期一

SD Card Driver Design (init. cond. 1)

上回提到了辨識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 則留言:

jerry72 提到...

你好
請問一下
如果我是用sd mode去做的話
初始化設定是否相同呢
謝謝