STM32 SDIO 的那些坑

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)就正常了。如下图。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值