eric2013 发表于 2020-6-30 13:50:26

继续提升STM32F4的4线SDIO DMA方式的读写稳定性,发布新版案例(2020-06-30)


static/image/hrline/4.gif
1、请使用这里的小软件做SD卡格式化:
   SD卡联盟发布的SD/SDHC/SDXC格式化小软件V5.0.1
   http://www.armbbs.cn/forum.php?mod=viewthread&tid=96181

2、解决DMA的4字节对齐问题,通过DMA FIFO方式的收发位宽设置解决
3、解决DMA突发传输的1KB边界问题。


4、解决一个bug:
https://img.anfulai.cn/dz/attachment/forum/201907/18/090237u040rfmfemg11mee.jpg

static/image/hrline/4.gif
稳定性测试:
连续测试20次2MB文件的读写,全部正确无错误。






mexico007 发表于 2020-6-30 15:42:23

@硬汉哥 能同步出个F407的版本吗 好像F407也有类似问题

eric2013 发表于 2020-6-30 15:57:22

mexico007 发表于 2020-6-30 15:42
@硬汉哥 能同步出个F407的版本吗 好像F407也有类似问题

F407和F429的SDIO一样的,直接复制就可以使用,注意你使用的引脚

mexico007 发表于 2020-6-30 16:05:46

@硬汉哥 还有个比较纠结的问题1. 用FATFS操作SD卡 是不是f_open打开文件的情况下 突然掉电 就会出现SD损坏的情况 还是只有在f_write时 才会出现SD卡损坏 2.如果我是f_open的情况下 突然掉电 会出现什么问题吗?

eric2013 发表于 2020-6-30 16:10:45

mexico007 发表于 2020-6-30 16:05
@硬汉哥 还有个比较纠结的问题1. 用FATFS操作SD卡 是不是f_open打开文件的情况下 突然掉电 就会出现SD损坏 ...
FATFS不支持掉电保护,这个不太好整,如果仅仅是读取,不用大小,只有写入才会出问题了,特别是FatFS处理FAT表阶段出问题。

如果你的设备有可能发生掉电问题,几个思路
1、使用支持掉电保护的,如RL-FlashFS,FileX等
2、硬件上加个超级电容啥的,掉电了及时处理。
3、使用FatFS给的简易处理思路,一定程度上降低掉电造成的异常:


http://elm-chan.org/fsw/ff/doc/appnote.html





missfox 发表于 2020-7-1 09:02:35

超赞

mexico007 发表于 2020-7-7 15:12:58

@硬汉哥 请求能将你上面第二点和第三点更改的地方批注出来吗 我下载了代码 刷了半天 没看到不同点 可能太多 一一对比 眼镜看不过来了 麻烦 谢谢

eric2013 发表于 2020-7-7 16:03:36

mexico007 发表于 2020-7-7 15:12
@硬汉哥 请求能将你上面第二点和第三点更改的地方批注出来吗 我下载了代码 刷了半天 没看到不同点 可能太多 ...

在DMA配置的地方,有区别。

mexico007 发表于 2020-7-7 16:18:24

@硬汉哥 void SD_LowLevel_DMA_TxConfig(uint32_t *BufferSRC, uint32_t BufferSize) 是这个函数吗 可以具体点吗

mexico007 发表于 2020-7-7 16:19:53

@硬汉哥 void SD_LowLevel_DMA_TxConfig(uint32_t *BufferSRC, uint32_t BufferSize) 请问是这个函数吗? 找了半天就是这个DMA 还有这个是解决了以上第二点第三点两个问题?

mexico007 发表于 2020-7-7 16:29:49

void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize) 就发现这个函数有一条设置不一样 硬汉哥 你最新版改的是SDDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;原来的版本是SDDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;就改了这边吗?

mexico007 发表于 2020-7-8 09:35:22

@硬汉哥 请求解惑 因为第二点 第三点还是蛮重要的 我想搞清楚硬汉哥是怎么解决的 理解一下原理

eric2013 发表于 2020-7-8 11:51:38

mexico007 发表于 2020-7-7 16:29
void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize) 就发现这个函数有一条设置不一 ...

对,就是修改的这些。

eric2013 发表于 2020-7-8 11:53:20

mexico007 发表于 2020-7-8 09:35
@硬汉哥 请求解惑 因为第二点 第三点还是蛮重要的 我想搞清楚硬汉哥是怎么解决的 理解一下原理

这个后来不断实践中发现的。

rnjack 发表于 2020-7-31 09:32:02

@硬汉哥 能不能研究下F4的HAL库SDIO+DMA,我遇到读写multiblock很慢的问题(调用函数:HAL_SD_WriteBlocks_DMA()、HAL_SD_ReadBlocks_DMA()、HAL_SD_GetCardState()),先用HAL_SD_WriteBlocks_DMA/HAL_SD_ReadBlocks_DMA很快返回OK,然后调用HAL_SD_GetCardState,要等好几秒才能返回传输完成状态,如果只用1block的方式就很快返回完成状态,但是整体读写速度又会慢

rnjack 发表于 2020-7-31 09:41:54

@硬汉哥 能不能研究下F4 HAL库SDIO DMA的,我遇到读写MultiBlock,调用HAL_SD_GetCardState轮询传输完成状态有时要几秒才返回完成,SINGLE_BLOCK就能很快,但会影响整体速度

eric2013 发表于 2020-7-31 10:48:26

rnjack 发表于 2020-7-31 09:32
@硬汉哥 能不能研究下F4的HAL库SDIO+DMA,我遇到读写multiblock很慢的问题(调用函数:HAL_SD_WriteBlocks_ ...

好的,近期做第3版emWin会配套上HAL SDIO的模板。

rnjack 发表于 2020-7-31 13:32:11

问题解决了,参考你这个例子http://www.armbbs.cn/forum.php?mod=viewthread&tid=96817&highlight=SDIO%2BDMA,先判断DMA完成状态,再调用HAL_SD_GetCardState

eric2013 发表于 2020-7-31 15:35:54

rnjack 发表于 2020-7-31 13:32
问题解决了,参考你这个例子http://www.armbbs.cn/forum.php?mod=viewthread&tid=96817&highlight=SDIO%2BD ...

好的:handshake

pjzmj2012 发表于 2023-3-21 10:23:38

不太明白为什么Write block等待却是 SD_WaitReadOperation????
为啥呀

pjzmj2012 发表于 2023-3-21 10:35:59

看了老哥的代码 SDIO_FLAG_TXUNDERR并没有配置的地方呀

pjzmj2012 发表于 2023-3-21 10:36:57

SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE);
是这里吗?

eric2013 发表于 2023-3-21 10:38:32

pjzmj2012 发表于 2023-3-21 10:23
不太明白为什么Write block等待却是 SD_WaitReadOperation????
为啥呀
认真看帖



eric2013 发表于 2023-3-21 10:45:09

pjzmj2012 发表于 2023-3-21 10:35
看了老哥的代码 SDIO_FLAG_TXUNDERR并没有配置的地方呀

我没有改这个,这个是是坛友提的问题。

此贴14楼。

F4系列标准库库SDIO的FatFS例子修改一个bug,可提升4线SDIO的DMA稳定性
https://www.armbbs.cn/forum.php?mod=viewthread&tid=94492&fromuid=58
(出处: 硬汉嵌入式论坛)
页: [1]
查看完整版本: 继续提升STM32F4的4线SDIO DMA方式的读写稳定性,发布新版案例(2020-06-30)