发新帖我要提问
12
返回列表
打印
[应用相关]

SD卡读写速度

[复制链接]
楼主: beety
手机看帖
扫描二维码
随时随地手机跟帖
21
beety|  楼主 | 2009-9-8 07:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
专业的问题,怎么就没人回答了呢?是不是大家都认为这个片子的SDIO很好用了呢?好像不是吧

使用特权

评论回复
22
wjc3k| | 2009-9-8 12:52 | 只看该作者
建议你仔细看下ST的SDCAR.C 和SDIO的例子,再看下SD_ReadBlock和SD_ReadMultiBlocks的区别,看你前面的代码只用了SDIO_READ_SINGLE_BLOCK模式,我想你该再试下SDIO_READ_MULT_BLOCK模式,要想再提高速度,SD_ReadMultiBlocks是必须的。不好用很多时候是不会用,ST的SDIO很好用,我们的一个SDIO设备跑到36M都没有问题(更高的速度没试)。你可以再具体分析下速度到底是慢在SDIO上还是USB上。我前面的LOG信息是用的SDCARD.C的函数在FATFS下的测试结果。没有通过USB. 附上我的测试代码:
#define BUFSIZE 512*4
#define FAT_READ_TEST
#define FAT_WRITE_TEST

void FatFS_Test()
{
//        FILINFO finfo;
        UINT len,wlen;
        UINT bufsize=1024;
        DWORD tlen,maxsize;
        u8 name[32];
        u32 i;
        u8 k;
test:
#ifdef FAT_READ_TEST
        fr = f_open(&fp,"test.bin",FA_OPEN_EXISTING | FA_READ);
        if(fr != FR_OK)
        {       
                printf("\r\nopen file fail!");
                return;
        }               
        printf("\r\nRead File %d bufsize=%d",fp.fsize,bufsize);
        //printf("\r\nFileSize:%Ld\r\n",fp.fsize);
        tm_count=0;
        SysCount(1);
        tlen=0;
        while(1)
        {
                fr =         f_read(&fp,buf,bufsize,&len);
                if(fr != FR_OK && len==0)
                {       
                        printf("\r\nread from  file fail!");
                        break;
                }
                else
                {
                }               
                //USART_SendData(USART1,'.');
                if(len<bufsize) {break; }
        }
        tm = SysCount(0);
        f_close(&fp);
        printf("\r\n Read bufsize=%d  %d/%d =  %4.3f MB/S\r\n",bufsize,fp.fsize, tm,(float)fp.fsize/(tm) );
#endif


#ifdef FAT_WRITE_TEST
        tm_count=0;
        SysCount(1);
        tlen=0;
        maxsize = 8*1024*1024L;
        //bufsize = 1024;
        //for(i=0;i<bufsize;i++) (u8)buf[i]=i;
        sprintf((char *)name,"WRA_%d.bin",bufsize);
        fr = f_open(&fp2, (const char *)name, FA_CREATE_ALWAYS | FA_WRITE);
        if( fr != FR_OK)
        {
                 printf("\r\nCreate File Failed");
        }                 
        else
                printf("\r\nCreate File OK!");
  len = bufsize;
        k='A';
        while(1)
        {

                memset(buf,k++,len);
                fr = f_write(&fp2,buf,len,&wlen);
                if( fr != FR_OK)
                {
                         printf("\r\nWrite File Failed!\r\n");
                        break;
                }                       
                else
                {
                        tlen +=wlen;
                        if(tlen>=maxsize)  break;
                }
        }
        tm = SysCount(0);                       
        //printf(".");
        printf("\r\n Write bufsize=%d  %d/%d =  %4.3f MB/S\r\n",bufsize,maxsize, tm,(float)maxsize/(tm) );
        f_close(&fp2);
#endif
        if( bufsize>=16384) {        printf("\r\n FatFS Test OK!"); return; }
        else
        {
                bufsize=bufsize<<1;
                goto test;
        }

使用特权

评论回复
23
beety|  楼主 | 2009-9-8 21:36 | 只看该作者
我也用过这个FATFS测试过,速度也并不比USB下快,读写速度都是差不多的,刷一块480X240的TFT慢死了,FSMC的速度已经达到了6M,读的速度500k/s左右,LS能不能把你的读写SD_ReadBlock和SD_WriteBlock贴出来,我参考下,或者如果不方便的话,能不能留个联系方式,我们私聊下,交个朋友!

使用特权

评论回复
24
wjc3k| | 2009-9-8 21:53 | 只看该作者
SD_ReadBlock和SD_WriteBlock 都是直接调用SDCARD.C里面的。没有改动。

使用特权

评论回复
25
beety|  楼主 | 2009-9-9 07:43 | 只看该作者
不会吧,我也问了其他人,他们说读写速度都是300~400k/s,在没有改变这两个函数的情况下,你的居然能跑1.2M/s,你的是什么卡?是不是卡引起的?能不能说说你测试的环境啊?

使用特权

评论回复
26
wjc3k| | 2009-9-9 09:19 | 只看该作者
FATFS 读速度测试
STM32F103VBT6
文件长度113M(118806371Byte)
读操作
24MHZ
113MB 优化0113MB10.1MB 优化010.1MB 优化(default)10.1MB 优化010.1MB10.1MB10.1MB 优化3
BUFSIZEDMA+SDIO+MBDMA+SDIODMA+SDIO+MBDMA+SDIO+MBDMA+SDIO+MBDMADMA+MBDMA+MB
5121.311.3091.6431.8041.6430.9850.9871.248
10242.3241.3432.8333.0992.8331.0051.4661.709
20483.8511.3614.5234.8784.5231.0151.9722.214
40965.6521.376.3356.7026.3351.022.3752.544
81925.6951.3726.3896.7256.3891.0222.3822.548
163845.7151.3736.4176.7386.4171.0222.3862.55

FATFS.rar

2.15 KB

使用特权

评论回复
27
heqinlong2009| | 2009-10-2 13:39 | 只看该作者
楼主,可能你的USB驱动有问题
SDIO我也用的ST的代码 OK!

使用特权

评论回复
28
heqinlong2009| | 2009-10-2 15:38 | 只看该作者
STM32的SDIO功能还不错。
ST的SDIO演示代码是没有问题的。程序考虑的非常全,SDHC支持也很好。
SD卡读写可以进一步优化。
代码中 DMA模式 在传送数据的时候CPU依然是用的查询方式,查询标志位
待传送数据结束后在继续下一个操作,可以加大缓冲区,同时把这部分时间利用起来 切换给其他任务用。这涉及到操作系统相关的东西。
等有时间我整理一下我的代码。

使用特权

评论回复
29
zq1987731| | 2009-10-5 09:58 | 只看该作者
我在用STM32的SDIO时
SD_ReadMultiBlocks很正常,测试了N张卡,读取一个20MB的TXT,平均速度10.06MB/S
但是SD_WriteMultiBlocks就不正常了,创建一个文件竟然内容全是0x00,说明根本就没写进去,然后我用SD_WriteBlock来一块一块得写,总算是能正常写入了,但是速度仅有60~150KB/S,慢得没法接受..

使用特权

评论回复
30
(⊙o⊙)你| | 2011-12-29 14:34 | 只看该作者

使用特权

评论回复
31
xzhihui| | 2013-8-2 08:28 | 只看该作者
本帖最后由 xzhihui 于 2013-8-2 08:29 编辑

为什么写入速度比读取速度慢很多呢?

看了楼上的,我的总结
想要写入速度快要:
1:DMA开起来;
2:多块写入;
3:4bit SDIO 传输

使用特权

评论回复
32
bu2zhouzhu| | 2014-2-19 10:47 | 只看该作者
wjc3k 发表于 2009-9-3 09:06
Read TEST ............................................................................

  ---------- ...

请问bufsize是在哪里修改呢?是在diskio.c下 #define BLOCK_SIZE 512 的这一句吗?如果是这句的话,我改为1024后单片机无法对SD卡进行任何操作了。

使用特权

评论回复
33
wallace_tsou| | 2014-2-21 14:44 | 只看该作者
本帖最后由 wallace_tsou 于 2014-2-21 14:47 编辑

使用Class 10卡,寫入8MB,花1.44秒

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则