[STM32H7] STM32H743 microSD 传输不稳定

[复制链接]
10|0
我的牙白 发表于 2026-7-25 16:48 | 显示全部楼层 |阅读模式
此前我已经解决了 SDMMC 外设的若干问题,但目前卡在 microSD 数据读写不稳定上。
我编写测试代码循环读取存储卡上的文件;运行一段时间后会触发`HAL_SD_ErrorCallback`,报错为 SDMMC\_ERROR\_CMD\_CRC\_FAIL命令 CRC 校验失败。
我已经试过下面这些方法进行过测试:
1)降低 SDMMC 时钟频率
2)重新改版 PCB,优化 microSD 信号线信号完整性
3)改用 SDMMC2 外设替代 SDMMC1
4)不使用 4bit 宽总线,切换为 1bit 传输模式,
5)升级 CubeIDE 至 1.3 版本
6)切换引脚内部上拉使能 / 关闭
下方是代码:
SD_HandleTypeDef hsd1;


void SDMgr::Init()
{
        memset(&hsd1, 0, sizeof(hsd1));

        hsd1.Instance                                        = SDMMC1;
        hsd1.Init.BusWide                                = SDMMC_BUS_WIDE_4B;
        hsd1.Init.ClockEdge                                = SDMMC_CLOCK_EDGE_RISING;
        hsd1.Init.ClockPowerSave                 = SDMMC_CLOCK_POWER_SAVE_DISABLE;
        hsd1.Init.HardwareFlowControl        = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;


        // This assumes an incoming clock of 400MHz / 16 = 25MHz
        // Based on measurements, this results in a 50MHz micro SD clock. We get checksum errors
//        hsd1.Init.ClockDiv                                = 2;

        // Based on measurements, this results in a 25MHz micro SD clock. We get checksum errors
        hsd1.Init.ClockDiv                                = 4;

        memset(&m_SDFatFs, 0, sizeof(m_SDFatFs));
        memset(&m_SDPath, 0, sizeof(m_SDPath));

        // It is not necessary to cal BSP_SD_Init() here. It is already being called
        // through FatFS at the appropriate time.

        Mount();
}


void SDMgr::Mount()
{
        FATFS_UnLinkDriver(m_SDPath);

        /*##-1- Link the micro SD disk I/O driver ##################################*/
        if (FATFS_LinkDriver(&SD_Driver, m_SDPath) != 0)
        {
                Logger::Print("Unable to FATFS_LinkDriver\n");
                return;
        }

        /*##-2- Register the file system object to the FatFs module ##############*/
        if(f_mount(&m_SDFatFs, (TCHAR const*)m_SDPath, 0) != FR_OK)
        {
                /* FatFs Initialization Error */
                Logger::Print("Unable to f_mount\n");
                Error_Handler();
        }
}


void HAL_SD_MspInit(SD_HandleTypeDef* hsd)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        if(hsd->Instance==SDMMC1)
        {
                /* Peripheral clock enable */
                __HAL_RCC_SDMMC1_CLK_ENABLE();

                /**SDMMC1 GPIO Configuration
                PC10 ------> SDMMC1_D2
                PC11 ------> SDMMC1_D3
                PC12 ------> SDMMC1_CK
                PD2 ------> SDMMC1_CMD
                PC8 ------> SDMMC1_D0
                PC9 ------> SDMMC1_D1
                */
                GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_8
                                                         |GPIO_PIN_9;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_PULLUP;
                GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;
                HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

                GPIO_InitStruct.Pin = GPIO_PIN_12;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_NOPULL;
                GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;
                HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

                GPIO_InitStruct.Pin = GPIO_PIN_2;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_NOPULL;
                GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;
                HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

                __HAL_RCC_SDMMC1_FORCE_RESET();
                __HAL_RCC_SDMMC1_RELEASE_RESET();

                /* NVIC configuration for SDIO interrupts */
                HAL_NVIC_SetPriority(SDMMC1_IRQn, IRQ_PRIORITY_SD, 0);
                HAL_NVIC_EnableIRQ(SDMMC1_IRQn);
        }
}



您需要登录后才可以回帖 登录 | 注册

本版积分规则

172

主题

173

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0