硬汉嵌入式论坛

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

[有问必答] v5的板子上SD卡偶尔不识别的问题。

[复制链接]

45

主题

70

回帖

205

积分

高级会员

积分
205
发表于 2021-4-7 09:10:34 | 显示全部楼层 |阅读模式
本帖最后由 chinashaoshu 于 2021-4-7 09:14 编辑

如题,使用13年的标准库版本的bsp_sdio_sd.c,卡是京东的SDHC CLASS10 V10的卡 32G,热插拔500ms,最近测试sd卡热插拔的时候偶尔会卡住,卡在SD_PowerON函数里,
  1.   /*!< If errorstatus is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch)
  2.        or SD card 1.x */
  3.     if (errorstatus == SD_OK)
  4.     {
  5.         /*!< SD CARD */
  6.         /*!< Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
复制代码
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2021-4-7 10:12:40 | 显示全部楼层
测试下我新做的HAL版是否正常,这个做了很多修改。

另外你用的那个厂家的卡,各种SD卡我基本都够了买

【安富莱】V6,V5开发板用户手册,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至50章(2021-02-22)
https://forum.anfulai.cn/forum.p ... 3255&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

45

主题

70

回帖

205

积分

高级会员

积分
205
 楼主| 发表于 2021-4-7 10:42:51 | 显示全部楼层
eric2013 发表于 2021-4-7 10:12
测试下我新做的HAL版是否正常,这个做了很多修改。

另外你用的那个厂家的卡,各种SD卡我基本都够了买

上次提问 代码不知道怎么了 不完整 卡在这里while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))

并且SDType也一直为0 正常的时候是SD_HIGH_CAPACITY,在CMD8: SEND_IF_COND出 就出错了。

另外换了个别的卡 试了很多次 就没出。

我这的问题,就出在识别过程中,还没有涉及到传输数据。所以拿最新的基于HAL库的对比了一下PWOER_ON那段,没看出有出入,过程一样。

回复

使用道具 举报

45

主题

70

回帖

205

积分

高级会员

积分
205
 楼主| 发表于 2021-4-7 10:45:15 | 显示全部楼层
eric2013 发表于 2021-4-7 10:12
测试下我新做的HAL版是否正常,这个做了很多修改。

另外你用的那个厂家的卡,各种SD卡我基本都够了买

file:///C:/Users/Administrator/Desktop/Snipaste_2021-04-07_10-37-46.bmp
Snipaste_2021-04-07_10-37-46.bmp
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2021-4-7 11:23:49 | 显示全部楼层

磊科? 这个卡我有,用我二楼发的没问题。
回复

使用道具 举报

45

主题

70

回帖

205

积分

高级会员

积分
205
 楼主| 发表于 2021-4-7 15:03:35 | 显示全部楼层
eric2013 发表于 2021-4-7 11:23
磊科? 这个卡我有,用我二楼发的没问题。

嗯 另外发现我屏蔽了Can发送函数(100us的定时器调用) 就不怎么出问题了,不屏蔽很大概率出问题。现在整个工程都是标准库的,要把最新的HAL弄过来,我得花些时间了。。。。
回复

使用道具 举报

45

主题

70

回帖

205

积分

高级会员

积分
205
 楼主| 发表于 2021-4-7 16:15:52 | 显示全部楼层
本帖最后由 chinashaoshu 于 2021-4-7 16:29 编辑
eric2013 发表于 2021-4-7 11:23
磊科? 这个卡我有,用我二楼发的没问题。
  1. SD_Error SD_PowerON(void)

  2. {

  3.     __IO SD_Error errorstatus = SD_OK;

  4.     uint32_t response = 0, count = 0, cnt = 0,validvoltage = 0;

  5.     uint32_t SDType = SD_STD_CAPACITY;



  6.     /*!< Power ON Sequence -----------------------------------------------------*/



  7.     /*!< Set Power State to ON */

  8.     /*!< Enable SDIO Clock */

  9.     /* Required power up waiting time before starting the SD initialization  sequence */

  10.     extern void delay_us(uint32_t n);

  11.     delay_us(50);

  12. __retry://重点是这里***********************

  13.     /*!< CMD0: GO_IDLE_STATE ---------------------------------------------------*/

  14.     /*!< No CMD response required */



  15.     /*!< CMD8: SEND_IF_COND ----------------------------------------------------*/

  16.     /*!< Send CMD8 to verify SD card interface operating condition */

  17.     /*!< Argument: - [31:12]: Reserved (shall be set to '0')

  18.                  - [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V)

  19.                  - [7:0]: Check Pattern (recommended 0xAA) */

  20.     /*!< CMD Response: R7 */

  21. .....

  22.     if (errorstatus == SD_OK)
  23.     {
  24.         CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0; /*!< SD Card 2.0 */

  25.         SDType = SD_HIGH_CAPACITY;

  26.         /*!< Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */

  27.         while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))

  28.         {
  29.          ....
  30.         }
  31.         if (count >= SD_MAX_VOLT_TRIAL)

  32.         {

  33.             errorstatus = SD_INVALID_VOLTRANGE;

  34.             return(errorstatus);

  35.         }

  36.         if (response &= SD_HIGH_CAPACITY)

  37.         {

  38.             CardType = SDIO_HIGH_CAPACITY_SD_CARD;
  39.         }

  40.     }
  41.     else
  42.     {

  43.         if(cnt++<10)   //重点是这里*************

  44.             goto __retry;

  45.         CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1;

  46.         SDType = SD_STD_CAPACITY;

  47.        。。。。。。。。。。。。

  48.     }

  49.     DEBUG_LOG(DEBUG_SD,("retyn times = %d,wait volt times = %d.\n", cnt,count));//打印

  50.     return(errorstatus);

  51. }
复制代码

我在主机发送CMD8: SEND_IF_COND 查询CMD Response: R7得到的不是SD_OK的情况下 如果不是0,我就让他重复发送CMD0和CMD7,做多10次,如果还不行就放弃。
或者说 CMD8: SEND_IF_COND 连续发送两遍 就没有问题。。。

这样的话,就可以了,且cnt=1,也就是说,基本一次以后,就能识别成功。另外发现两种卡,等待电压就绪的时间不一样。
硬汉老师,我这样处理,有没有可能不按套路来啊,或者可能带来其他问题啊。。。







Snipaste_2021-04-07_16-14-01.bmp
Snipaste_2021-04-07_16-12-51.bmp
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2021-4-8 08:27:53 | 显示全部楼层
chinashaoshu 发表于 2021-4-7 15:03
嗯 另外发现我屏蔽了Can发送函数(100us的定时器调用) 就不怎么出问题了,不屏蔽很大概率出问题。现在整 ...

我的意思是你测试下是否稳定。

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-16 15:09 , Processed in 0.041864 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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