1、环境:STM32F103VET6,EWARM ,J-LINK,4G/2G内存卡
SDIO硬件配置如下
2、问题一、SDIO的GPIO不能初始化
HAL_SD_MspInit(hsd)这个函数的原型为:
是一个weak定义,那么什么是weak定义呢?就是说如果如果没有定义HAL_SD_MspInit这个函数,就使用weak修饰的这个函数(在这里什么都不做)。如果定义了就使用自己定义的。
所以果断将此函数添加到里。
如下:
void HAL_SD_MspInit(SD_HandleTypeDef* hsd)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(hsd->Instance==SDIO)
{
/* USER CODE BEGIN SDIO_MspInit 0 */
/* USER CODE END SDIO_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SDIO_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/**SDIO GPIO Configuration
PC8 ------> SDIO_D0
PC9 ------> SDIO_D1
PC10 ------> SDIO_D2
PC11 ------> SDIO_D3
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;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/* USER CODE BEGIN SDIO_MspInit 1 */
/* USER CODE END SDIO_MspInit 1 */
}
}
3、第二个问题SD卡(硬件),只有初始化成功后面读写擦除都有问题
if (HAL_SD_Init(&hsd) != HAL_OK)
发现是硬件问题
哈哈,这个地方怎么画的,没有连上呀。
在R23与C19下面的两个焊盘之间用导线连上。
4、第三个问题SD卡可以读不能写
我的测试程序如下
SD_HandleTypeDef hsd;
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_DISABLE;
hsd.Init.ClockDiv = 0;
if (HAL_SD_Init(&hsd) != HAL_OK)
{
//Error_Handler();
kk = 4;
}
if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK)
{
//Error_Handler();
kk = 5;
}
HAL_SD_CardInfoTypeDef info;
if(HAL_OK == HAL_SD_GetCardInfo(&hsd, &info)){
info.Class = info.Class;
}
HAL_Delay(20); //如果不延时可能到值写操作失败
if(HAL_SD_ReadBlocks(&hsd, Buffer_Block_Rx, WRITE_READ_ADDRESS, NUMBER_OF_BLOCKS, 0xFFFF) == HAL_OK){
kk++;
}
if(HAL_SD_WriteBlocks(&hsd, Buffer_Block_Tx, WRITE_READ_ADDRESS, NUMBER_OF_BLOCKS, 0xFFFF) == HAL_OK ){
HAL_Delay(200);
if(HAL_SD_ReadBlocks(&hsd, Buffer_Block_Rx, WRITE_READ_ADDRESS, NUMBER_OF_BLOCKS, 0xFFFF) == HAL_OK){
uint8_t j = 0;
}else{
kk = 1;
}
}else{
kk = 2;
}
实际测试中发现,使用1线制通信正常。然而使用4线通信,就出现读正常写错误。
经过反复调试,将流控打开,时钟分频改为2(72/(2+2) = 18)就正常了。如下图。