Kann 8GB SDHC nicht initialisieren CMD8 antwortet mit (0xFF)

Ich versuche, eine 8-GB-SDHC mit dem STM32L0-Controller über SPI zu verbinden.

Habe dieses Tutorial befolgt .

Wie dieser Thread andeutet, habe ich die Befehlssequenz wie folgt befolgt:

  1. CMD0arg: 0x0, CRC: 0x95(Antwort: 0x01)
  2. CMD8arg: 0x000001AA, CRC: 0x87(Antwort: 0x01)

Ich sende einige Uhren mit aktiviertem und deaktiviertem CS zwischen diesen Befehlen, wie hier besprochen .

Irgendwie bekomme ich die Antwort von CMD0as 0x01aber CMD8antwortet immer mit 0xFF.

Im Folgenden ist der Code, den ich verwende, um meine SD-Karte zu initialisieren:

void SD_INIT(void){
    CS_HIGH;
    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }
    CS_LOW;
    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }

    uint8_t txBuff[] = {0x40,0x00, 0x00, 0x00, 0x00, 0x95 };
    HAL_SPI_TransmitReceive(&hspi2,txBuff,readBuff,6,100);

    //count = 255;   //Try 255 times..
    for(count = 255;count>0;count--){
            uint8_t dummy[] = {0xFF};
            HAL_SPI_TransmitReceive(&hspi2,dummy,readBuff,1,100);
            if(readBuff[0] == 0x01){
                    status = 1;
                    break;
        }

    }

    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }
    CS_HIGH;
    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }


/*-------------------SDHC TRY----------------*/

    if(status==1){

    //status=0;
    CS_LOW;
    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }
        //HIGH CAPACITY 0x000001AA 
    uint8_t tx1Buff[] = {0x48,0x00, 0x00, 0x01, 0xAA, 0x87 };
    HAL_SPI_TransmitReceive(&hspi2,tx1Buff,readTempBuff,6,100);

    //count = 255;   //Try 255 times.. //10ms = 160000
    for(count = 100;count>0;count--){
            uint8_t dummy[] = {0xFF};
            HAL_SPI_TransmitReceive(&hspi2,dummy,readTempBuff,1,100);
            if(readTempBuff[0] == 0x05){  //Invalid Command
                    status = 3;
                    break;
        }
    }

    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }
    CS_HIGH;
    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }
    }

void SPI_SEND_CMD_DUMMY(void){

        uint8_t txBuff = 0xFF;
        HAL_SPI_Transmit(&hspi2,&txBuff,1,100);
}

Die Antwort, die ich bekomme, readTempBuffist:

readTempBuff[0]  :  0xFF
readTempBuff[1]  :  0xFF
readTempBuff[2]  :  0xFF
readTempBuff[3]  :  0xFF
readTempBuff[4]  :  0xFF
Sie warten auf eine Antwort von 0x05 (Illegal Command) für CMD8, das würde nicht funktionieren, wenn die Karte es akzeptiert und ein OK R1 (mit Idle Set) zurückgibt. Sie müssen auch die vollständige R7-Antwort einlesen, da es sonst Karten gibt, die dort nur blockiert werden ( electronic.stackexchange.com/questions/321491/… ).

Antworten (1)

for(count = 100;count>0;count--){

Das sind nur 100 Antwortbytes, mein Code verwendet 1000 für jeden SD-Befehl. Einige Karten benötigen möglicherweise die zusätzliche Zeit/Uhren.

Beachten Sie, dass IIRC Sie auch die R7-Antwort des CMD8 verarbeiten müssen.

SDHC-Kartencode ist nicht trivial, aber es gibt viele Open-Source-Implementierungen, von denen man lernen kann.