使用CubeMX配置SDIO,初始化代码如下:
void MX_SDIO_SD_Init(void) { hsd.Instance = SDIO; hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; hsd.Init.BusWide = SDIO_BUS_WIDE_1B; hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_ENABLE; hsd.Init.ClockDiv = 0; if (HAL_SD_Init(&hsd) != HAL_OK) { _Error_Handler(__FILE__ __LINE__); } if (HAL_SD_ConfigWideBusOperation(&hsd SDIO_BUS_WIDE_4B) != HAL_OK) { _Error_Handler(__FILE__ __LINE__); } }
然后HAL_SD_ConfigWideBusOperation返回错误。
卡是Kingston 4GB的卡,原子的开发板F103ZET 战舰版。用原子的例程读写卡正常。
自己答一波
原因是,hsd.Init.ClockDiv 不能等于0
按取值为0算,SD卡的频率就是36MHz
SD卡的协议上说上限是48MHz,但许多SD卡上不了这么高的频率。
按理说,时钟频率决定的是上限,对低速的卡应该还是兼容读写的