硬汉嵌入式论坛

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

[SD/SDIO] stm32H743初始化SD卡失败

[复制链接]

3

主题

21

回帖

30

积分

新手上路

积分
30
发表于 2023-8-8 16:49:14 | 显示全部楼层 |阅读模式
  使用stm32cubemx配置SD卡以及fatfs文件系统,在执行SD卡初始化函数HAL_SD_Init(&hsd1)时,if (HAL_SD_ConfigWideBusOperation(hsd, hsd->Init.BusWide) != HAL_OK)报错返回HAL_ERROR;
SDMMC时钟频率为48Mhz,分频系数试过0,4,都是这个现象,求吧友们解答!






回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2023-8-8 16:53:53 | 显示全部楼层
用的SDMMC1还是SDMMC2,程序的主RAM空间使用的那个。
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-8 16:58:48 | 显示全部楼层
eric2013 发表于 2023-8-8 16:53
用的SDMMC1还是SDMMC2,程序的主RAM空间使用的那个。

应该是SDMMC1
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-8 16:59:05 | 显示全部楼层
eric2013 发表于 2023-8-8 16:53
用的SDMMC1还是SDMMC2,程序的主RAM空间使用的那个。

应该就是SDMMC1
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-8 17:01:21 | 显示全部楼层
就很常规的设置了4线的SDMMC1,然后fatfs也就改了改长文件名以及支持中文,我一直觉得是时钟问题。更改时钟后也还是这样
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-8 17:03:36 | 显示全部楼层
void MX_SDMMC1_SD_Init(void)
{

  /* USER CODE BEGIN SDMMC1_Init 0 */

  /* USER CODE END SDMMC1_Init 0 */

  /* USER CODE BEGIN SDMMC1_Init 1 */

  /* USER CODE END SDMMC1_Init 1 */
  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;
  hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
  hsd1.Init.ClockDiv = 4;
  /* USER CODE BEGIN SDMMC1_Init 2 */
if (HAL_SD_Init(&hsd1) != HAL_OK)//SD初始化
{
    Error_Handler();
}
if (HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B) != HAL_OK)//配置总线宽度
{
    Error_Handler();
}
  /* USER CODE END SDMMC1_Init 2 */

}
在SDMMC的初始化中添加了SD卡的初始化,之前是在读写测试函数中会触发这个报错,很明显是SD卡初始化失败了,所以干脆就直接加在这里面测试了。
回复

使用道具 举报

4

主题

46

回帖

58

积分

初级会员

积分
58
发表于 2023-8-8 17:30:10 | 显示全部楼层
[C] 纯文本查看 复制代码
//速度设定
    halState = HAL_MMC_ConfigSpeedBusOperation(&sdmmcHandle,SDMMC_SPEED_MODE_AUTO);
    if(halState != HAL_OK)
	{
        MCU_LogShowHalState(halState,sdmmcHandle.ErrorCode);
        return ERROR_SUB_BOARD_SDMMC_SET_SPEED;
    }

跟踪一下这个变量,以下是错误描述
[C] 纯文本查看 复制代码
#define SDMMC_ERROR_NONE                     ((uint32_t)0x00000000U)   /*!< No error                                                      */
#define SDMMC_ERROR_CMD_CRC_FAIL             ((uint32_t)0x00000001U)   /*!< Command response received (but CRC check failed)              */
#define SDMMC_ERROR_DATA_CRC_FAIL            ((uint32_t)0x00000002U)   /*!< Data block sent/received (CRC check failed)                   */
#define SDMMC_ERROR_CMD_RSP_TIMEOUT          ((uint32_t)0x00000004U)   /*!< Command response timeout                                      */
#define SDMMC_ERROR_DATA_TIMEOUT             ((uint32_t)0x00000008U)   /*!< Data timeout                                                  */
#define SDMMC_ERROR_TX_UNDERRUN              ((uint32_t)0x00000010U)   /*!< Transmit FIFO underrun                                        */
#define SDMMC_ERROR_RX_OVERRUN               ((uint32_t)0x00000020U)   /*!< Receive FIFO overrun                                          */
#define SDMMC_ERROR_ADDR_MISALIGNED          ((uint32_t)0x00000040U)   /*!< Misaligned address                                            */
#define SDMMC_ERROR_BLOCK_LEN_ERR            ((uint32_t)0x00000080U)   /*!< Transferred block length is not allowed for the card or the number of transferred bytes does not match the block length   */
#define SDMMC_ERROR_ERASE_SEQ_ERR            ((uint32_t)0x00000100U)   /*!< An error in the sequence of erase command occurs              */
#define SDMMC_ERROR_BAD_ERASE_PARAM          ((uint32_t)0x00000200U)   /*!< An invalid selection for erase groups                         */
#define SDMMC_ERROR_WRITE_PROT_VIOLATION     ((uint32_t)0x00000400U)   /*!< Attempt to program a write protect block                      */
#define SDMMC_ERROR_LOCK_UNLOCK_FAILED       ((uint32_t)0x00000800U)   /*!< Sequence or password error has been detected in unlock command or if there was an attempt to access a locked card    */
#define SDMMC_ERROR_COM_CRC_FAILED           ((uint32_t)0x00001000U)   /*!< CRC check of the previous command failed                      */
#define SDMMC_ERROR_ILLEGAL_CMD              ((uint32_t)0x00002000U)   /*!< Command is not legal for the card state                       */
#define SDMMC_ERROR_CARD_ECC_FAILED          ((uint32_t)0x00004000U)   /*!< Card internal ECC was applied but failed to correct the data  */
#define SDMMC_ERROR_CC_ERR                   ((uint32_t)0x00008000U)   /*!< Internal card controller error                                */
#define SDMMC_ERROR_GENERAL_UNKNOWN_ERR      ((uint32_t)0x00010000U)   /*!< General or unknown error                                      */
#define SDMMC_ERROR_STREAM_READ_UNDERRUN     ((uint32_t)0x00020000U)   /*!< The card could not sustain data reading in stream rmode       */
#define SDMMC_ERROR_STREAM_WRITE_OVERRUN     ((uint32_t)0x00040000U)   /*!< The card could not sustain data programming in stream mode    */
#define SDMMC_ERROR_CID_CSD_OVERWRITE        ((uint32_t)0x00080000U)   /*!< CID/CSD overwrite error                                       */
#define SDMMC_ERROR_WP_ERASE_SKIP            ((uint32_t)0x00100000U)   /*!< Only partial address space was erased                         */
#define SDMMC_ERROR_CARD_ECC_DISABLED        ((uint32_t)0x00200000U)   /*!< Command has been executed without using internal ECC          */
#define SDMMC_ERROR_ERASE_RESET              ((uint32_t)0x00400000U)   /*!< Erase sequence was cleared before executing because an out of erase sequence command was received                        */
#define SDMMC_ERROR_AKE_SEQ_ERR              ((uint32_t)0x00800000U)   /*!< Error in sequence of authentication                           */
#define SDMMC_ERROR_INVALID_VOLTRANGE        ((uint32_t)0x01000000U)   /*!< Error in case of invalid voltage range                        */
#define SDMMC_ERROR_ADDR_OUT_OF_RANGE        ((uint32_t)0x02000000U)   /*!< Error when addressed block is out of range                    */
#define SDMMC_ERROR_REQUEST_NOT_APPLICABLE   ((uint32_t)0x04000000U)   /*!< Error when command request is not applicable                  */
#define SDMMC_ERROR_INVALID_PARAMETER        ((uint32_t)0x08000000U)   /*!< the used parameter is not valid                               */
#define SDMMC_ERROR_UNSUPPORTED_FEATURE      ((uint32_t)0x10000000U)   /*!< Error when feature is not insupported                         */
#define SDMMC_ERROR_BUSY                     ((uint32_t)0x20000000U)   /*!< Error when transfer process is busy                           */
#define SDMMC_ERROR_DMA                      ((uint32_t)0x40000000U)   /*!< Error while DMA transfer                                      */
#define SDMMC_ERROR_TIMEOUT                  ((uint32_t)0x80000000U)   /*!< Timeout error                                                 */
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-8 17:36:27 | 显示全部楼层
  if (hsd->ErrorCode != HAL_SD_ERROR_NONE)   {     /* Clear all the static flags */     __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);     status = HAL_ERROR;   }
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-8 17:36:54 | 显示全部楼层
  if (hsd->ErrorCode != HAL_SD_ERROR_NONE)
  {
    /* Clear all the static flags */
    __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
    status = HAL_ERROR;
  }
报错位置
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-8 17:37:35 | 显示全部楼层
  if (hsd->ErrorCode != HAL_SD_ERROR_NONE)
  {
    /* Clear all the static flags */
    __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
    status = HAL_ERROR;
  }
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2023-8-8 18:45:36 | 显示全部楼层
直接分享你的工程到百度云,我看下
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-9 08:14:40 | 显示全部楼层
eric2013 发表于 2023-8-8 18:45
直接分享你的工程到百度云,我看下

好的,稍等我整理一下
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-9 08:29:16 | 显示全部楼层
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-9 09:22:14 | 显示全部楼层
SDMMC操作SD卡在设置FATFS时,是必须要开启DMA吗?在fatfs的设置里面有开启DMA的选项,但是我没启用DMA,因为我这个串口的数据量很小,而且也不会挂FREERTOS。
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-9 09:46:19 | 显示全部楼层
测试板是自制的,之前做了一块小的板子只有743和SD卡槽,那块板子一样的设置能正常跑文件系统读写SD卡,小板子跟这块新板子区别不大,就是晶振大小不一样,然后SD卡槽接法上有一点区别,就是卡槽的CLK时钟线没接上拉电阻,小的板子接了上拉电阻,新的板子没接,不知道有影响不。
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-9 15:16:23 | 显示全部楼层
dengxiaojundink 发表于 2023-8-8 17:30
[mw_shl_code=c,true]//速度设定
    halState = HAL_MMC_ConfigSpeedBusOperation(&sdmmcHandle,SDMMC_SP ...

感谢,目前来看还是初始化没成功的问题,能挂载上,但f_open的时候会报03FR_NOT_READY,可能是硬件原因。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2023-8-10 00:16:37 | 显示全部楼层
幸亏看了下你的工程代码,这个地方果然有问题。
1、将0x2000 0000地址前的对勾去掉,这个是DTCM RAM空间,SDMMC1不支持操作这个RAM空间。仅支持AXI SRAM,即0x2400 0000

下载 (2).png

2、然后工程里面没有看到你的MPU/Cache配置。

可以直接关闭0x2400 0000地址512KB空间RAM的读写Cache试试。




回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-10 16:22:42 | 显示全部楼层
eric2013 发表于 2023-8-10 00:16
幸亏看了下你的工程代码,这个地方果然有问题。
1、将0x2000 0000地址前的对勾去掉,这个是DTCM RAM空间, ...

MPU没有设置都是关闭的,这部分修改过后测试无明显变化。现在发现SD卡的句柄居然是空的。。。HAL_StatusTypeDef HAL_SD_Init(SD_HandleTypeDef *hsd)
{
  HAL_SD_CardStatusTypeDef CardStatus;
  uint32_t speedgrade;
  uint32_t unitsize;
  uint32_t tickstart;

  /* Check the SD handle allocation */
  if (hsd == NULL)
  {
    return HAL_ERROR;               //直接进到这里了
  }
现在发现SD卡的句柄居然是空的。。。
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-17 08:32:08 | 显示全部楼层
后来又找了块开发板试了下,能正常读写SD程序没问题,可能是板子电装的时候哪出问题了
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2023-8-17 08:34:12 | 显示全部楼层
后来我又找了块开发板试了下,开发板能正常读写SD卡,所以问题可能出在板子电装上。此贴终结,感谢版主和大伙的指导!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2023-8-17 14:47:22 | 显示全部楼层
787741568 发表于 2023-8-17 08:32
后来又找了块开发板试了下,能正常读写SD程序没问题,可能是板子电装的时候哪出问题了

谢谢告知最终原因。
回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
发表于 2023-9-1 17:39:15 | 显示全部楼层
硬汉哥,我好像也碰到这个问题了,完全是STM32CubeMX生成的SD卡初始化程序,结果卡死了。
但换一块板子就好了,并且我也可以保证我两块板子的SDIO功能都是正常的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 20:35 , Processed in 0.389320 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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