硬汉嵌入式论坛

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

[FatFs] SD 4bit重新初始化失败

[复制链接]

19

主题

125

回帖

182

积分

初级会员

积分
182
发表于 2023-10-16 18:55:54 | 显示全部楼层 |阅读模式
如题,严格来说不是说的FatFs,系统主要用了几大功能


STM32L4+FATFS+EMWIN+SD+USB MASS STROAGE+FREERTOS+SD DMA.
SD分频到6M。
系统主频48M,平时不联接USB,设备本地把数据存入SD卡中。
待机时,可以用USB取数,设备就是个从机,U盘。
有时候SD出报错,这个时候,把SDMMC失能,所有寄存器清空,DMA也重置,SD卡也断电再上电,FATFS系统也un mount 再mount。
这个时候,HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B)不会成功。

而且,之前系统是BOOT LOADER+APP的模式,如果在BOOT中初始化了4线模式,跳转时,所有寄存器也重置了,结果APP中4线制不成功。
如果BOOT中用的1线制,或且用的模拟SPI驱动,进APP后是可以4线制的。

反正APP中,如果开始初妈化成功4线制,再次重新初始化SD,那怕做了SD断电,SDMMC寄存器失能,DMA失能,再次4线制不成功。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-10-17 10:09:04 | 显示全部楼层
大概率跳转前没用提供干净的运行环境,试试我这个方案

实战技能分享,一劳永逸的解决BOOT跳转APP失败问题,含MDK AC5,AC6和IAR,同时制作了一个视频操作说明
https://www.armbbs.cn/forum.php? ... 9595&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-17 16:51:34 | 显示全部楼层
eric2013 发表于 2023-10-17 10:09
大概率跳转前没用提供干净的运行环境,试试我这个方案

实战技能分享,一劳永逸的解决BOOT跳转APP失败问 ...

问题是在APP中4bit初始化正常后再失能再初始化就不成功啊。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-10-17 17:10:06 | 显示全部楼层
ccschen 发表于 2023-10-17 16:51
问题是在APP中4bit初始化正常后再失能再初始化就不成功啊。

这样的话,那就是你的SDIO复位有问题了, 这次没理解错吧。复位是调用的DeInit那个函数吗,这个函数比较好使。

我在H7上的APP上喜欢各种复位和重新初始化配置外设,测试过SD的,在APP里面随意复位初始化。

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

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-17 20:53:38 | 显示全部楼层
eric2013 发表于 2023-10-17 17:10
这样的话,那就是你的SDIO复位有问题了, 这次没理解错吧。复位是调用的DeInit那个函数吗,这个函数比较好 ...

[C] 纯文本查看 复制代码
    retSD = FATFS_UnLinkDriver(SDPath);
    
    SD_OFF();
    HAL_Delay(500);
    retSD = f_mount(NULL, SDPath, 1);
    __HAL_SD_CLEAR_FLAG(&hsd1,SDMMC_STATIC_FLAGS);
    HAL_SD_DeInit(&hsd1);
    HAL_Delay(50);

    return retSD;



已经做到这个份上了。
然后再
[C] 纯文本查看 复制代码
        retSD = FATFS_LinkDriver(&SD_Driver, SDPath);

        SD_ON();
        HAL_Delay(200);
        retSD = f_mount(NULL, SDPath, 1);

        retSD = f_mount(&SDFatFS, SDPath, 1);

回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-17 20:56:08 | 显示全部楼层
失能后,看相关的寄存器都是清0了的,中断都是关了的。而且总线上都上拉了电阻的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-10-18 08:22:12 | 显示全部楼层
ccschen 发表于 2023-10-17 20:56
失能后,看相关的寄存器都是清0了的,中断都是关了的。而且总线上都上拉了电阻的。

HAL_SD_DeIni的底层接口里面NVIC,DMA,GPIO等复位做了没。贴代码,我看下。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-18 20:03:44 | 显示全部楼层
eric2013 发表于 2023-10-18 08:22
HAL_SD_DeIni的底层接口里面NVIC,DMA,GPIO等复位做了没。贴代码,我看下。

这些都失能了的,用的库文件,刚看了,都复位了的。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-18 20:53:38 | 显示全部楼层
eric2013 发表于 2023-10-18 08:22
HAL_SD_DeIni的底层接口里面NVIC,DMA,GPIO等复位做了没。贴代码,我看下。

这样,我空了,单独试下SDMMC四线制反复初始化。然后再反馈结果。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-21 02:23:56 | 显示全部楼层
STM32L476RCT6 SDIO DMA,居然HAL_SD_ERROR_INVALID_VOLTRANGE
未用RTOS。不知道怎么的,这步都过不了了。下一步反复初始化都没法做了。

L476RCT6_SDMMC_4bits.rar

15.54 MB, 下载次数: 0

回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-24 00:40:59 | 显示全部楼层
SD卡有电源总开关,电平弄错了。现在的情况还是四线制不对。
报SDMMC_STA_STBITERR,在宽总线模式下,在所有的数据线号上没有检测到起始位中断。
问题是这线也基本上做了等长的啊。这是什么意思呢?
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-24 01:50:09 | 显示全部楼层
把测试工程的库更新到STM32Cube_FW_L4_V1.18.0,重新初始化SD对了,4线制也对了。
空了把实际产品的工程更改成最新的库,看是如何。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-24 23:59:41 | 显示全部楼层
eric2013 发表于 2023-10-18 08:22
HAL_SD_DeIni的底层接口里面NVIC,DMA,GPIO等复位做了没。贴代码,我看下。

event = osMessageGet(SDQueueID, SD_TIMEOUT);
卡这里了,加了FREERTOS后,用四线制就卡这里了,读的时候获取不到消息,如果用1线制,不会有这个问题。

如果不用FREERTOS的话,四线制也是没问题的。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-25 10:30:32 | 显示全部楼层
这是加了FREERTOS的工程,用4线制时,收不到消息,在函数DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)里面,event = osMessageGet(SDQueueID, SD_TIMEOUT);收不到信号量,直到超时。用1线制时没问题。
四线制不用FREERTOS,也不会有问题。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-25 10:50:20 | 显示全部楼层
这是加了FREERTOS的工程,用4线制时,收不到消息,
在函数DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)里面,
event = osMessageGet(SDQueueID, SD_TIMEOUT);
收不到信号量,直到超时。用1线制时没问题。
四线制不用FREERTOS,也不会有问题。 L476RCT6_SDMMC_4bits_FREERTOS.rar (15.57 MB, 下载次数: 0)
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-25 12:02:27 | 显示全部楼层
最新状况,在中断中打个断点,SD就能完成初始化,SDMMC1_IRQHandler打了断点就可以。那怕打一次断点都可以。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-10-25 15:56:32 | 显示全部楼层
ccschen 发表于 2023-10-24 23:59
event = osMessageGet(SDQueueID, SD_TIMEOUT);
卡这里了,加了FREERTOS后,用四线制就卡这里了,读的时 ...

要不搞个骚操作,APP里面直接调用NVIC Reset软件复位试试。这样的话,是不是不满足需求了。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-25 16:51:04 | 显示全部楼层
eric2013 发表于 2023-10-25 15:56
要不搞个骚操作,APP里面直接调用NVIC Reset软件复位试试。这样的话,是不是不满足需求了。

不满足要求啊,因为SD有出错的时候,文件系统也可能会不正常,需要重新初始化,继续操作。用1线制是可以,就是速度慢了点儿。文件一多,就恼火,所以,想四线制搞定。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-25 20:54:42 | 显示全部楼层
eric2013 发表于 2023-10-25 15:56
要不搞个骚操作,APP里面直接调用NVIC Reset软件复位试试。这样的话,是不是不满足需求了。

我特地拿F407的开发板试了,SDIO DMA FREERTOS FATFS,工程直接生成就可以用,工程默认是双工的,人为改成分时复用DMA,也是没问题的。看了下F4的DMA还是强大些,配置参数也多些。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-25 23:01:35 | 显示全部楼层
基本上是解决了。
如果SD中断开启了的话,FATFS初始化不成功,但是1线制可以。
如果要四线制,SD的中断就不要开启,只开DMA通道的。
官方的示例工程是开了SD的中断,有一定的误导,CUBEMX生成的工程,新建的时候,默认SD中断是没勾选上的。

新问题来了,U盘模式下,枚举没问题,读写磁盘无数据流。。。电脑上看到无数据包收发。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-26 21:39:19 | 显示全部楼层
结贴,要在main函数中执行MX_DMA_Init,先使能SD DMA CHANNEL及DMA时钟,然后再在HAL_SD_MspInit里使能SD IRQ,之前是需要读写时,使能DMA,那样不行。
之前打算需要时才使能相关的外设,却出了这种问题。问题是1bits时,这样操作又没问题。奇怪。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
 楼主| 发表于 2023-10-26 21:40:12 | 显示全部楼层
ccschen 发表于 2023-10-25 23:01
基本上是解决了。
如果SD中断开启了的话,FATFS初始化不成功,但是1线制可以。
如果要四线制,SD的中断就 ...

USB MSC PACKET太大,引起的,具体原因暂时没分析了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 19:40 , Processed in 0.276838 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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