硬汉嵌入式论坛

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

[STM32H7] stm32h7 驱动 sd 卡, 有没有什么方法自动判断sd卡的速度,然后根据这个判断来重新设置 sd 的分频啊 ?

[复制链接]

678

主题

3465

回帖

5524

积分

论坛元老

积分
5524
发表于 2024-7-23 08:58:02 | 显示全部楼层 |阅读模式




stm32h7 驱动 sd 卡, 有没有什么方法自动判断sd卡的速度,然后根据这个判断来重新设置 sd 的分频啊 ?

我目前使用的是 sdmmc 2 主时钟配置为 120MHz

120MHz / (2*2) = 30MHz

uSdHandle.Init.ClockDiv            = 2;    目前默认分频系数 , 目前测试低速,高速都可以,只是高速卡没有发挥最高性能

如果分频系数配置为: uSdHandle.Init.ClockDiv            = 1;  , 低速卡不行, 高速卡可以









回复

使用道具 举报

25

主题

72

回帖

147

积分

初级会员

积分
147
QQ
发表于 2024-7-23 09:18:45 | 显示全部楼层
你要知道,如果客户自备TF卡,那么无解。因为某些低速TF卡会被包装成高速TF卡,这时候你如果使用高速驱动,那么TF卡可能会卡死。

我现在的做法是:做一个TF卡速度设置选择窗口,设置低速、中速和高速,由客户自己去选择。
回复

使用道具 举报

10

主题

111

回帖

141

积分

初级会员

积分
141
发表于 2024-7-23 10:07:02 | 显示全部楼层
HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode) 这个函数不是判断了卡类型和重新设置速度吗?

回复

使用道具 举报

33

主题

188

回帖

287

积分

高级会员

积分
287
发表于 2024-7-23 11:04:44 | 显示全部楼层
一种就是提前选择设置高速、中速、低速
一种就是默认高速,不行再自动切换到中速,还不行再切换到低速
但是卡死的地方要优化好
回复

使用道具 举报

6

主题

50

回帖

68

积分

初级会员

积分
68
发表于 2024-7-23 18:58:58 | 显示全部楼层
RL-FlashFs是通过下面函数,根据CSD[103:96]值判断速度的。但不明白为什么不是最大速度
/**
  Determine maximum transfer speed from the CSD register data.
  \return maximum transfer speed in Hz
*/
static uint32_t get_tran_speed (uint32_t *r2) {
  static const uint8_t tim_val[] = {
    0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80
  };
  uint32_t i, n, m, speed;
  uint8_t *b;

  b = (uint8_t *)r2;

  /* Max. data transfer rate (TRAN_SPEED: CSD[103:96] */
  n = (b[12] >> 3) & 0xF;
  m = (b[12] & 0x7) + 1;
  speed = tim_val[n];
  for (i = 0; i < m; i++) {
    speed *= 10;
  }
  return (speed * 1000);
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-7-24 07:42:05 | 显示全部楼层
你单步跟踪这这部分初始化代码,如果没记错的话,H7 HAL库的这部分初始化代码有速度判断识别的过程
回复

使用道具 举报

678

主题

3465

回帖

5524

积分

论坛元老

积分
5524
 楼主| 发表于 2024-7-24 11:16:10 | 显示全部楼层
pnhywyb 发表于 2024-7-23 09:18
你要知道,如果客户自备TF卡,那么无解。因为某些低速TF卡会被包装成高速TF卡,这时候你如果使用高速驱动, ...

如果客户也不清楚是 高速, 中速, 低速的 的话, 那怎么处理呀 ?

还是让他自动的配置设置一遍 ??
回复

使用道具 举报

678

主题

3465

回帖

5524

积分

论坛元老

积分
5524
 楼主| 发表于 2024-7-24 11:23:57 | 显示全部楼层
xy201207 发表于 2024-7-23 10:07
HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode) 这个函数不 ...

貌似这个配置的 效果 并不好啊,没有 初始化时给出的分频的效果好
回复

使用道具 举报

6

主题

50

回帖

68

积分

初级会员

积分
68
发表于 2024-7-24 20:02:19 | 显示全部楼层
RL-FlashFS是分二步确定时钟频率的。第一步,以400K初始化卡,然后读取卡内信息,确定卡类型,速度。用5楼函数确定输出速度后,再次将时钟调整到对应工作频率。是根据卡内信息确定时钟频率的,不需要事先输入卡类型、速度等。如果纠结,不妨转RL-FlashFS。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-7-25 11:27:23 | 显示全部楼层
hpdell 发表于 2024-7-24 11:16
如果客户也不清楚是 高速, 中速, 低速的 的话, 那怎么处理呀 ?

还是让他自动的配置设置一遍 ??

程序自动简单匹配的,不需要用户做
回复

使用道具 举报

5

主题

241

回帖

256

积分

高级会员

积分
256
发表于 2024-7-30 17:20:26 | 显示全部楼层
记得好像sdio规范里是有卡的速度等级标记的,是C4还是C10可以用代码读出来
其实我觉得把sdmmc时钟源改一下最好,改成100M的,这样不管怎么分频都能照顾到高低速
回复

使用道具 举报

678

主题

3465

回帖

5524

积分

论坛元老

积分
5524
 楼主| 发表于 2024-7-31 11:09:11 | 显示全部楼层
DX3906 发表于 2024-7-30 17:20
记得好像sdio规范里是有卡的速度等级标记的,是C4还是C10可以用代码读出来
其实我觉得把sdmmc时钟源改一下 ...

我目前设置的是 200M ,  分频后得到 50M
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 03:19 , Processed in 0.287556 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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