STM32CUBEMX生成SD卡读写代码不能进入4线模式解决
使用stm32cubemx生成stm32f407vet6开发板通过SDIO读写SD卡。发现有的SD卡可以,有的卡在切换成4线时失败。具体在发送命令SD_CMD_SD_APP_SEND_SCR时,SDIO状态STA为0X42,bit1为SD_CMD_CRC_FAIL,表示CRC错误。既然CRC错想应该是硬件错误,网购多个芯片和SD卡座焊上,没什么明显效果。换成网上的SDIO代码,读写正常。 反复和CUBEMX生成的代码,SDIO寄存器是完全一样的,直到排查了GPIOC和GPIOD寄存器,发现HAL代码定义了GPIOC的PIN8-12和GPID的PIN2复用为SDIO,但是没有定义为上拉。改成上拉后一切正常。CUBE生成的代码真是一言难尽啊。
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_SDIO_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/**SDIO GPIO Configuration
PC8 ------> SDIO_D0
PC9 ------> SDIO_D01
PC10 ------> SDIO_D02
PC11 ------> SDIO_D03
PC12 ------> SDIO_CK
PD2 ------> SDIO_CMD
*/
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
//2024-3 必须加上拉,很久才发现。
GPIO_InitStruct.Pull = GPIO_PULLUP;//GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;//GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);