硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3132|回复: 8
收起左侧

[有问必答] HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)出错

[复制链接]

7

主题

14

回帖

35

积分

新手上路

积分
35
发表于 2022-12-8 17:42:52 | 显示全部楼层 |阅读模式
首先说表象结论:HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)  SDIO硬件初始化执行到这一步就进入Error_Handler,程序无法继续运行.
原因: 使用STM32CubeMX 配置SDIO  :Mode选择SD 4 Bits Wide Bus,其他的常规操作,设置IO的上拉,生成代码之后,也不创建SD卡实例,运行
image.png
在MX_SDIO_SD_Init();卡住不往下执行,跳进去执行发现是执行到这一步
image.png
以为是ClockDiv = 0 设置不好,修改成10,还是一样的执行到这一步,,最后对比其他的代码发现是这句代码导致的,
image.png
CubeMX生成的是hsd.Init.BusWide = SDIO_BUS_WIDE_4B;手动修改为hsd.Init.BusWide = SDIO_BUS_WIDE_1B;,运行正常.
这个是CubeMX的BUG吗?还是我设置的不对? 在网上找到一段话
image.png ,
想知道原因,是软件生成的BUG还是我的设置导致的问题?
回复

使用道具 举报

7

主题

14

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2022-12-8 21:54:54 | 显示全部楼层
刚才下班回家之后拿家里的野火429开发板重新测试验证这个问题,现在发现修改这个hsd.Init.BusWide = SDIO_BUS_WIDE_1B;也不行了,还是会进入MX_SDIO_SD_Init()函数里面的Error_Handler(), 附上函数看下是不是有问题?还有CubeMX的设置
image.png

main.c

5.26 KB, 下载次数: 0

sdio.c

3.68 KB, 下载次数: 0

main.h

2.14 KB, 下载次数: 0

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107057
QQ
发表于 2022-12-9 10:24:30 | 显示全部楼层
使能硬件流控制是不是好点

image.png
回复

使用道具 举报

7

主题

14

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2022-12-9 12:07:45 | 显示全部楼层
eric2013 发表于 2022-12-9 10:24
使能硬件流控制是不是好点

使能硬件流控制之后,还是一样的,BusWide必须修改成SDIO_BUS_WIDE_1B,才可以继续运行,硬汉哥,知道怎么回事不?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107057
QQ
发表于 2022-12-10 11:20:32 | 显示全部楼层
Melvin_Klein 发表于 2022-12-9 12:07
使能硬件流控制之后,还是一样的,BusWide必须修改成SDIO_BUS_WIDE_1B,才可以继续运行,硬汉哥,知道怎么回事 ...

不行的话,对比下我们的吧

https://www.armbbs.cn/forum.php?mod=viewthread&tid=93255
image.png
回复

使用道具 举报

7

主题

14

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2022-12-10 11:50:50 | 显示全部楼层
eric2013 发表于 2022-12-10 11:20
不行的话,对比下我们的吧

https://www.armbbs.cn/forum.php?mod=viewthread&tid=93255

对比了硬件,都是用的4线Data,硬件上拉我没有设计,修改成软件上拉,没有SD检测引脚,其他的就没有区别,
软件代码编译Debug之后差异在hsd.Init.BusWide = SDIO_BUS_WIDE_4B;你的范例代码是hsd.Init.BusWide = SDIO_BUS_WIDE_1B这个是STM32CubeMX生成的,看来是软件BUG,需要手动修改啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107057
QQ
发表于 2022-12-10 11:58:34 | 显示全部楼层
你这么说,我终于明白你的意思了,SD卡的初始化有说明的,最后配置完毕才做4线的。

  *** SD Card Initialization and configuration ***
  ================================================   
  [..]
    To initialize the SD Card, use the HAL_SD_Init() function. It Initializes
    SDIO IP(STM32 side) and the SD Card, and put it into StandBy State (Ready for data transfer).
    This function provide the following operations:

    (#) Initialize the SDIO peripheral interface with defaullt configuration.
        The initialization process is done at 400KHz. You can change or adapt
        this frequency by adjusting the "ClockDiv" field.
        The SD Card frequency (SDIO_CK) is computed as follows:
  
           SDIO_CK = SDIOCLK / (ClockDiv + 2)
  
        In initialization mode and according to the SD Card standard,
        make sure that the SDIO_CK frequency doesn't exceed 400KHz.

        This phase of initialization is done through SDIO_Init() and
        SDIO_PowerState_ON() SDIO low level APIs.

    (#) Initialize the SD card. The API used is HAL_SD_InitCard().
        This phase allows the card initialization and identification
        and check the SD Card type (Standard Capacity or High Capacity)
        The initialization flow is compatible with SD standard.

        This API (HAL_SD_InitCard()) could be used also to reinitialize the card in case
        of plug-off plug-in.
  
    (#) Configure the SD Card Data transfer frequency. By Default, the card transfer
        frequency is set to 24MHz. You can change or adapt this frequency by adjusting
        the "ClockDiv" field.
        In transfer mode and according to the SD Card standard, make sure that the
        SDIO_CK frequency doesn't exceed 25MHz and 50MHz in High-speed mode switch.
        To be able to use a frequency higher than 24MHz, you should use the SDIO
        peripheral in bypass mode. Refer to the corresponding reference manual
        for more details.
  
    (#) Select the corresponding SD Card according to the address read with the step 2.
   
    (#) Configure the SD Card in wide bus mode: 4-bits data.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107057
QQ
发表于 2022-12-10 11:59:37 | 显示全部楼层
我们这个就是他这种方式初始化的。

[C] 纯文本查看 复制代码
/** @defgroup STM324x9I_EVAL_SD_Private_Functions SD Private Functions
  * @{
  */

/**
  * @brief  Initializes the SD card device.
  * @retval SD status
  */
uint8_t BSP_SD_Init(void)
{ 
  uint8_t SD_state = MSD_OK;
  
  /* uSD device interface configuration */
  uSdHandle.Instance = SDIO;

  uSdHandle.Init.ClockEdge           = SDIO_CLOCK_EDGE_RISING;
  uSdHandle.Init.ClockBypass         = SDIO_CLOCK_BYPASS_DISABLE;
  uSdHandle.Init.ClockPowerSave      = SDIO_CLOCK_POWER_SAVE_DISABLE;
  uSdHandle.Init.BusWide             = SDIO_BUS_WIDE_1B;
  uSdHandle.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  uSdHandle.Init.ClockDiv            = SDIO_TRANSFER_CLK_DIV;
  
#if 0
  /* Configure IO functionalities for SD detect pin */
  BSP_IO_Init(); 
  
  /* Check if the SD card is plugged in the slot */
  if(BSP_SD_IsDetected() != SD_PRESENT)
  {
    return MSD_ERROR;
  }
#endif
  
  /* Msp SD initialization */
  BSP_SD_MspInit(&uSdHandle, NULL);
  
  if(HAL_SD_Init(&uSdHandle) != HAL_OK)
  {
    SD_state = MSD_ERROR;
  }
  
  /* Configure SD Bus width */
  if(SD_state == MSD_OK)
  {
    /* Enable wide operation */
    if(HAL_SD_ConfigWideBusOperation(&uSdHandle, SDIO_BUS_WIDE_4B) != HAL_OK)
    {
      SD_state = MSD_ERROR;
    }
    else
    {
      SD_state = MSD_OK;
    }
  }
  
  return  SD_state;
}
回复

使用道具 举报

7

主题

14

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2022-12-10 12:30:30 | 显示全部楼层
eric2013 发表于 2022-12-10 11:59
我们这个就是他这种方式初始化的。

[mw_shl_code=c,true]/** @defgroup STM324x9I_EVAL_SD_Private_Func ...

那这么看来确实是CubeMX生成代码时候的小BUG了,初始化的时候不能设置BUS_WIDE为4B,只能设置为1B,太依赖这个CubeMX了, 应该是生成代码的时候BUS_WIDE=1B,后面利用HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)修改为4B,硬汉哥是这样理解吧
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 09:07 , Processed in 0.188331 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表