硬汉嵌入式论坛

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

[有问必答] F103RET6 SDIO 读取速度 512字节/421us

[复制链接]

9

主题

46

回帖

73

积分

初级会员

积分
73
发表于 2019-3-14 17:00:22 | 显示全部楼层 |阅读模式
TIM截图20190314010429.jpg

大家好,最近做了一个实验,F103RET6 用SDIO+DMA 读取SD卡扇区(无FATFS),

        while(1)
        {
                STM32_DEBUG0_L;
    /* Read block of 512 bytes from address 0 */
    Status = SD_ReadBlock(Buffer_Block_Rx, 0x00, BLOCK_SIZE);
    /* Check if the Transfer is finished */
    Status = SD_WaitReadOperation();
    while(SD_GetStatus() != SD_TRANSFER_OK);
                STM32_DEBUG0_H;               
        }        


代码如上,读取一个512字节扇区 时用一个IO做指示,然后用逻辑分析仪看到, 读取512字节用了421us, 也就是 1000000/421 * 512 = 1.2M字节/秒。

请问这个速度正常吗?实际我们还是需要更高的速度。我看到论坛有朋友说可以到达好几M的读取速度,想问怎么达到呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2019-3-14 18:09:15 | 显示全部楼层
驱动SD卡,一般我们都是配置的24MHz,如果是用的SDIO的4线DMA方式,理论最大值是12MB/S。需要你的卡也支持这么高速度才行。

一般像我用的CLASS4,在使用了FATFS的时候,读速度一般也就3MB/S左右。
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-3-14 19:03:28 | 显示全部楼层
大大好。

我刚才用逻辑分析仪看SD CLK 是 25MHZ

TIM截图20190314185941.jpg

我用 野火大大的 SD卡测试(无FATFS) 和 SD卡+FATFS 测试, 发现 读取512字节都是一样的,400+us。

我看了一下我的卡 上面写的是CLASS 10呢。。。想问为啥还这么慢呢。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2019-3-14 19:05:05 | 显示全部楼层
orta1986 发表于 2019-3-14 19:03
大大好。

我刚才用逻辑分析仪看SD CLK 是 25MHZ

看下你的SDIO配置是1线DMA还是4线,然后测试multiblock模式,这个模式速度有很大提升。
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-3-14 19:38:11 | 显示全部楼层
TIM截图20190314192937.jpg

在 SD_INIT 函数最后 开启4BIT 这里,我用串口打印出来查看是否ERROR, 串口显示 good  4 bit,也就是开启4BIT 没有错误。

太奇怪了呀。。。
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-3-14 19:46:22 | 显示全部楼层
本帖最后由 orta1986 于 2019-3-14 20:02 编辑

SD_Error SD_ReadMultiBlocks(uint8_t *readbuff, uint64_t ReadAddr, uint16_t BlockSize, uint32_t NumberOfBlocks)

我使用SD_ReadMultiBlocks 这个函数,申请一个 8192 字节的数组(SD_TEST_ARRAY), 也就是 512 X 16个扇区

                while(1)
                {
                        STM32_DEBUG0_L;
                        SD_ReadMultiBlocks(SD_TEST_ARRAY,0,512,16);                        Status = SD_WaitReadOperation();
                        while(SD_GetStatus() != SD_TRANSFER_OK);
                        STM32_DEBUG0_H;
                }

采用以上方式观察信号,发现 IO 为低的时长是1.1ms,  也就是 1000/1.1 * 8192 = 7.4M字节/秒,的确,比单个512字节传输要快不少呢。

但是大大,这个SD_ReadMultiBlocks 我是直接从扇区读数,不是通过FATFS打开的文件。

我自己做的一个子函数如下:

TIM截图20190314195057.jpg

也就是 打开一个文件,选择偏移地址,然后读出多少个字节。因为这个二进制文件是2的整次幂,所以,都按512字节为一个单位偏移。

然后测试方法改为:                while(1)
                {
                        STM32_DEBUG0_L;
                        SD_FILE_READ(STM32_DEBUG1_PORT,STM32_DEBUG1,"0:BACK",0,8192,SD_TEST_ARRAY);        
                        STM32_DEBUG0_H;
                }

从F_READ 中查看,内部调用了DISK _READ。 然后DISK_READ中,如下

TIM截图20190314195724.jpg

如果我用FATFS, 使用F_OPEN  及 F_READ 来读取 8192字节,则单次需要33MS, 与上面 我直接通过SD_ReadMultiBlocks 读取 速度差好多。

但是从F_READ -> DISK_READ 中看到,好像DISK_READ 也调用了SD_ReadMultiBlocks,但是怎么会差别这么大呢



回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-3-14 20:09:22 | 显示全部楼层
请问怎么在使用FATFS , F_READ 的情况下 调用 readmultiblocks 呢?这个效率确实高好多
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-3-14 20:14:40 | 显示全部楼层
请问 if((dword)buff & 3)是什么意思呢? 好像由于进入这个条件,导致 F_READ下面的 readmultiblocks  无法使用。
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-3-14 22:28:40 来自手机 | 显示全部楼层
F1系列DMA要做四字节对齐,所以底层麻烦,性能捉急,研究价值不大。F4就好了,支持DMA FIFO,可以不对齐了
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-3-14 23:06:17 | 显示全部楼层
本帖最后由 orta1986 于 2019-3-14 23:09 编辑
byccc 发表于 2019-3-14 22:28
F1系列DMA要做四字节对齐,所以底层麻烦,性能捉急,研究价值不大。F4就好了,支持DMA FIFO,可以不对齐了

那请问如果我的传输数组 这么声明 __align(4) u8 buffer[8192];, 是不是就可以了呢?
刚才这么尝试,没有什么效果。。
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-3-14 23:42:16 来自手机 | 显示全部楼层
没用,在缓冲首地址4字节对齐的情况下,除非每次传输都是512的整数倍,才正常。否则终会有不对齐的时候,测试bmp图片显示容易复现这种情况。
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-3-15 00:25:33 | 显示全部楼层
byccc 发表于 2019-3-14 23:42
没用,在缓冲首地址4字节对齐的情况下,除非每次传输都是512的整数倍,才正常。否则终会有不对齐的时候,测 ...

我现在设计就是按照512的整数倍传输的。 目前如果不采用FATFS,直接用read_multiblock是没问题,但是要是使用FATFS,调用F_READ,就会特别慢。我看F_READ里是有read_multiblock,但是并没有被执行。不知道怎么解决
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-3-15 00:35:09 | 显示全部楼层
你的底层驱动为了实现4字节对齐,做的太啰嗦了,所以没辙。。凑过用吧。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-3-15 01:16:08 | 显示全部楼层
byccc 发表于 2019-3-15 00:35
你的底层驱动为了实现4字节对齐,做的太啰嗦了,所以没辙。。凑过用吧。

想问 你指的 底层驱动是 DISK_READ 函数内部吗?
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-3-15 09:40:27 来自手机 | 显示全部楼层
orta1986 发表于 2019-3-15 01:16
想问 你指的 底层驱动是 DISK_READ 函数内部吗?

是滴。
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-3-15 13:23:31 | 显示全部楼层

那有没有可能修改一下呢?改为调用read_multiblock
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-3-15 14:43:44 | 显示全部楼层
orta1986 发表于 2019-3-15 13:23
那有没有可能修改一下呢?改为调用read_multiblock

使用FATFS找到位置后,自己调用multiblock读取。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-3-15 18:29:10 | 显示全部楼层
byccc 发表于 2019-3-15 14:43
使用FATFS找到位置后,自己调用multiblock读取。

不可行,FATFS存储并不一定是连续的
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-3-15 20:08:46 | 显示全部楼层
sanit 发表于 2019-3-15 18:29
不可行,FATFS存储并不一定是连续的

请问,我要读取的二进制文件 就是单一一个文件,比如32KB,那一旦通过FATFS 找到其首地址后,从首地址+32KB 期间 应该都是连续的吧?
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-3-15 22:42:57 | 显示全部楼层
orta1986 发表于 2019-3-15 20:08
请问,我要读取的二进制文件 就是单一一个文件,比如32KB,那一旦通过FATFS 找到其首地址后,从首地址+32 ...

并不一定是得,可能你格式化一下后存是,你删除几个文件,再存入几个文件,可能就不连续了。
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-3-16 10:44:55 | 显示全部楼层
byccc 发表于 2019-3-14 22:28
F1系列DMA要做四字节对齐,所以底层麻烦,性能捉急,研究价值不大。F4就好了,支持DMA FIFO,可以不对齐了

请问如果使用STM32F4系列,是不是FATFS的读取速度会快很多呢
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-3-16 14:35:26 | 显示全部楼层
sanit 发表于 2019-3-15 18:29
不可行,FATFS存储并不一定是连续的

芯片低格并文件系统格式化后就行,SD卡全部使用完毕后再删除,放在不连续
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-3-16 14:35:42 | 显示全部楼层
orta1986 发表于 2019-3-16 10:44
请问如果使用STM32F4系列,是不是FATFS的读取速度会快很多呢

会快点。其实跟F1的性能区别不大,只是DMA更方便了。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

9

主题

46

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2019-3-16 20:38:24 | 显示全部楼层
byccc 发表于 2019-3-16 14:35
芯片低格并文件系统格式化后就行,SD卡全部使用完毕后再删除,放在不连续

请问你说的这个是什么意思呢?
是说,先把SD卡插入PC,进行格式化,然后考入512字节整数倍的文件 就可以连续吗?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 23:08 , Processed in 0.246607 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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