AnsweredAssumed Answered

SD Card On SDIO, Command Response fails after ACMD 41

Question asked by v.jeff on Feb 29, 2012
Latest reply on Mar 25, 2013 by Clive One
Hello,
My initialization of a 2Gbyte SD  card on the SDIO interface is failing.
Results of commands have been:
CMD0: 
SDIO_GetCommandResponse() returns 0  SDIO_GetResponse(SDIO_RESP1) returns 0
CMD55:
SDIO_GetCommandResponse() returns 55  SDIO_GetResponse(SDIO_RESP1) returns 288
ACMD41:
SDIO_GetCommandResponse() returns 63  SDIO_GetResponse(SDIO_RESP1) returns 1674444

All following calls to the SDIO_Get functions return 63 and 1674444.  Any ideas on whats wrong.  I've had difficulty finding information on initializing SD cards on the SDIO interface.  I'm following the commands on page 726 of RM0090 for STM32F407.

Thank you
Code:

SDIO_GPIO_init();

SDIO_init1();

void SDIO_init1(void)
{
    SDIO_InitTypeDef SDIO_InitStructure;
    char TMP [40];


    SDIO_InitStructure.SDIO_ClockDiv = 120;//SDIO_INIT_CLK_DIV;
    SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
    SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;
    SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
    SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;
    SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
    SDIO_Init(&SDIO_InitStructure);

    /*!< Set Power State to ON */
    SDIO_SetPowerState(SDIO_PowerState_ON);


    /*!< Enable SDIO Clock */
    SDIO_ClockCmd(ENABLE);



       //CMD0 Go idle.
     SDIO_CmdInitTypeDef SDIO_CmdInitStructure;                    //Structure.
     SDIO_CmdInitStructure.SDIO_Argument = 0x0;
     SDIO_CmdInitStructure.SDIO_CmdIndex = 0;
       SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_No;
    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
    SDIO_SendCommand(&SDIO_CmdInitStructure);
    SDIO_print_respnse(0);




      // CMD55
    SDIO_CmdInitStructure.SDIO_Argument = 0x00;
    SDIO_CmdInitStructure.SDIO_CmdIndex = 55;
    SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
    SDIO_SendCommand(&SDIO_CmdInitStructure);
    SDIO_print_respnse(55);


    //ACMD41
    SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SD_STD_CAPACITY ;
    SDIO_CmdInitStructure.SDIO_CmdIndex = 41;
    SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
       SDIO_SendCommand(&SDIO_CmdInitStructure);
    SDIO_print_respnse(41);


    //Send CMD2 ALL_SEND_CID
    SDIO_CmdInitStructure.SDIO_Argument = 0x0;
    SDIO_CmdInitStructure.SDIO_CmdIndex = 2;
    SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Long;
    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
    SDIO_SendCommand(&SDIO_CmdInitStructure);
    SDIO_print_respnse(2);


    //Send CMD3 RCA
    SDIO_CmdInitStructure.SDIO_Argument = 0x00;
    SDIO_CmdInitStructure.SDIO_CmdIndex = 3;
    SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
    SDIO_SendCommand(&SDIO_CmdInitStructure);
    SDIO_print_respnse(3);

  /*
    //CMD 8
    SDIO_CmdInitStructure.SDIO_Argument = SD_CHECK_PATTERN;
    SDIO_CmdInitStructure.SDIO_CmdIndex = 8;
       SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
       SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
       SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
       SDIO_SendCommand(&SDIO_CmdInitStructure);
    SDIO_print_respnse(8);

*/







    SDIO_CmdInitStructure.SDIO_Argument = 1 << 16;
    SDIO_CmdInitStructure.SDIO_CmdIndex = 9;
    SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Long;
    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
    SDIO_SendCommand(&SDIO_CmdInitStructure);

    SDIO_print_respnse(9);

}
void SDIO_GPIO_init(void)
{

    GPIO_InitTypeDef  GPIO_InitStructure;


    /* GPIOC and GPIOD Periph clock enable */
    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE );
    /* Enable the SDIO APB2 Clock */
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_SDIO, ENABLE );



    /* Configure PC.12 pin: CLK pin */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIOC->BSRRL = GPIO_Pin_12;
    GPIOC->BSRRH = GPIO_Pin_12;
    GPIOC->BSRRL = GPIO_Pin_12;
    GPIOC->BSRRH = GPIO_Pin_12;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_Init(GPIOC, &GPIO_InitStructure);


    /* Configure PD.02 CMD line */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    /* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_Init(GPIOC, &GPIO_InitStructure);


    GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_SDIO);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SDIO);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SDIO);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO);


}
void SDIO_print_respnse(uint8_t CMD)
{
    LCD_clear();
    char TMP [40];
    LCD_SetCursor ( 0, 0 );

        sprintf( TMP, "CMD %d - %d ", CMD,
        (int)SDIO_GetResponse(SDIO_RESP1));
        LCD_write_str((unsigned char *)TMP);


        LCD_SetCursor ( 0, 1 );
        sprintf( TMP, "CMD Resp %d", SDIO_GetCommandResponse());
        LCD_write_str((unsigned char *)TMP);


    _delay_us(0x4FFFFF);

}

Outcomes