STM32U5 SDMMC为什么BusWide只能设置为1B,设置为4B的时候没办法读写。硬件连接是没问题的, 4跟数据线都连接上了, 连接顺序也肯定没错, 上拉电阻也是有的。
SDMMC初始化代码:
hsd1.Instance = SDMMC1; hsd1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING; hsd1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE; hsd1.Init.BusWide = SDMMC_BUS_WIDE_4B; // 只有设置为SDMMC_BUS_WIDE_1B的时候才能够正常读写 hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE; hsd1.Init.ClockDiv = 4; if (HAL_SD_Init( hsd1) != HAL_OK) { Error_Handler(); }初始化之后可以HAL_SD_GetCardInfo, 但HAL_SD_WriteBlocks 或 HAL_SD_ReadBlocks 就会失败, 具体代码如下:
HAL_StatusTypeDef rtn; rtn = HAL_SD_GetCardInfo( hsd1, info); // 返回为HAL_OK HAL_Delay(1000); rtn = HAL_SD_WriteBlocks( hsd1,tx_buf,0,1,1000); // 返回错误 HAL_Delay(1000); rtn = HAL_SD_ReadBlocks( hsd1,rx_buf,0,1,1000); // 返回错误如果在初始化完SDMMC之后, 再调用一次 HAL_SD_InitCard 之后, HAL_SD_ReadBlocks 和 HAL_SD_WriteBlocks就能成功, 代码如下:
HAL_StatusTypeDef rtn; rtn = HAL_SD_GetCardInfo( hsd1, info); // 返回为HAL_OK HAL_SD_InitCard( hsd1); // 重新初始化SD卡 HAL_Delay(1000); rtn = HAL_SD_WriteBlocks( hsd1,tx_buf,0,1,1000); // 返回为HAL_OK HAL_Delay(1000); rtn = HAL_SD_ReadBlocks( hsd1,rx_buf,0,1,1000); // 返回为HAL_OK因为调用HAL_SD_InitCard之后, 其中就把BusWide设置为了1B, 其中部分代码为:
HAL_StatusTypeDef HAL_SD_InitCard(SD_HandleTypeDef *hsd){ ... /* Default SDMMC peripheral configura
tion for SD card initialization */ Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING; Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE; Init.BusWide = SDMMC_BUS_WIDE_1B; Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE; ...}为什么设置4B之后, 读写就会失败呢?