2010-05-17 3 views
1

Я получаю неверные коды ответов с моей SD-карты (CMD8, CMD55 и CMD41).Инициализация SD-карты с использованием интерфейса SPI

Init рутина:

SDCS = 1; // MMC deaktiviert 
SPI1CON1bits.SMP = 0; 
SPI1CON1bits.CKE = 1; 
SPI1CON1bits.MSTEN = 1; 
SPI1CON1bits.CKP = 0; 
SPI1STATbits.SPIEN = 1; 

for(i=0; i<10; i++) 
    SPI(0xFF); 

// RESET 
unsigned char rr=Command(CMD0,0); 
SDCS=1; // MMC deactivated 
/* OK response == 1 */ 

r = Command(CMD8,0); // Check voltage 
SDCS=1; 
/* 
    esponse == 0xC1 ?!? 
*/ 

r = Command(CMD58,0); // READ_OCR 

unsigned char ocr1 = SPI(0xFF); 
unsigned char ocr2 = SPI(0xFF); 
unsigned char ocr3 = SPI(0xFF); 
unsigned char ocr4 = SPI(0xFF); 
unsigned char ocr5 = SPI(0xFF); 

/* 
    r = 0xF8; ?!? 
    ocr1 = 0x0F; 
    ocr2 = 0xFF; 
    ocr3 = 0xFF; 
    ocr4 = 0xFF; 
    ocr5 = 0xFF; 
*/ 

SDCS=1; 

// INIT 
unsigned char rrr = 0; 
i = 10000; 
do 
{ 
    rrr = Command(55,0); // Next is APP CMD 
    SDCS = 1; 
    if(r) 
     break; 
} while(--i>0); 

/* 
OK response == 1 
*/ 

// APP CMD 41 with OCR = 0x0F?? 

Вы можете прочитать коды ответов в комментариях.

Возможно ли код ответа CMD8 является 0xC1? Бит 7 должен быть 0, правильно?

Это аппаратная ошибка?

+0

Отсортируйте свой код в следующий раз. –

+0

Некоторые карты в основном не поддерживают режим SPI. Какой бренд карты? Это настоящая карта или подделка? –

ответ

1

Решение можно найти в разделе «Переполнение стека» Initializing SD card in SPI issues.

Вкратце: перед каждой командой (кроме CMD0) отправьте 0xFF, пока вы не получите 0xFF в качестве ответа.