STM32CUBEMX生成SD卡读写代码不能进入4线模式解决

文章讲述了在使用STM32CUBEMX生成STM32F407vet6的SDIO读写代码时,遇到SD卡在切换到4线模式时SD_CMD_SD_APP_SEND_SCR命令失败,CRC错误。问题在于GPIO配置不当,特别是GPIOC的PIN8-12和GPIOD的PIN2未设置为上拉。修正此配置后,SDIO功能恢复正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值