使用SDIO+DMA 来读写SD卡,怎么提高写的速度?

2019-10-16 05:53发布

   在MINI开发板上我开始使用SPI接口实现一个读卡器,在Windows上写的速度是200KB左右,满足不了要求。后来我改成使用SDIO接口+DMA的方式来读写SD卡,但是在Windows上写文件的速度只有250KB左右,速度提高不明显啊。 我使用的是库函数版本是3.5的。请求指导一下,怎么提高U盘的读写速度啊???
   另外,如果我想使用外接USB的高速PHY芯片,如USB3300 芯片,是不是只能使用STM32F2或者STM32F4的主控啊?


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
elimbug
1楼-- · 2019-10-16 09:07
夏至硬汉 发表于 2016-11-9 13:04
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SDIO->DR;求问楼主这个你是怎么配置的,我编译就 ...

我是配置成这样:
#define SDIO_FIFO_Address               ((uint32_t)0x40018080)
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_Address;
elimbug
2楼-- · 2019-10-16 10:42
我自己来顶一下,我测试了一下SPI+SD方式的读写速度,写200KB左右,读350KB左右,是不是我们底层驱动函数导致读写这么慢啊?
elimbug
3楼-- · 2019-10-16 12:00
这是我测试读写速度的程序:
[mw_shl_code=c,true]printf("Write single sector time begin ... ");
                couter_time = 0;
                TIM_Cmd(TIM3, ENABLE);        
                for(i=0; i<10000; i++)
                {
                        SDCARD_Write_Sector(read_write_buf,1000+i,1);
                }
                TIM_Cmd(TIM3, DISABLE);
                printf("Write single sector time over ... ");
                printf("write single: time=%d s ",couter_time);
                printf("write single: speed=%d KBps ",5120/couter_time);//(512 * 1000/1024)=5120
               
                printf("Read single sector time begin ... ");
                couter_time = 0;
                TIM_Cmd(TIM3, ENABLE);         
                for(i=0; i<10000; i++)
                {
                        SDCARD_Read_Sector(read_write_buf,1000+i,1);
                }
                TIM_Cmd(TIM3, DISABLE);        
                printf("Read single sector time over ... ");
                printf("Read single : time=%d s ",couter_time);
                printf("Read single : speed=%d KBps ",5120/couter_time);//(512 * 1000/1024)=5120
               
               
               
                printf("Write multi sector time begin ... ");
                couter_time = 0;
                TIM_Cmd(TIM3, ENABLE);  
                for(i=0; i<10000; i+=20)
                {
                        while( SDCARD_Write_Sector(read_write_buf,20000+i,20) == 0xff){};
                }
                TIM_Cmd(TIM3, DISABLE);  
                printf("Write multi sector time over ... ");
                printf("write multi: time=%d s ",couter_time);
                printf("write multi: speed=%d KBps ",5120/couter_time);//(512 * 1000/1024)=5120
               
                printf("Read multi sector time begin ... ");
                couter_time = 0;
                TIM_Cmd(TIM3, ENABLE);  
                for(i=0; i<10000; i+=20)
                {
                        while( SDCARD_Read_Sector(read_write_buf,20000+i,20) == 0xff ){};
                }
                TIM_Cmd(TIM3, DISABLE);  
                printf("Read multi sector time over ... ");
                printf("Read multi : time=%d s ",couter_time);
                printf("Read multi : speed=%d KBps ",5120/couter_time);//(512 * 1000/1024)=5120[/mw_shl_code]
夏至硬汉
4楼-- · 2019-10-16 16:12
 精彩回答 2  元偷偷看……
夏至硬汉
5楼-- · 2019-10-16 16:40
elimbug 发表于 2016-11-9 13:40
我是配置成这样:
#define SDIO_FIFO_Address               ((uint32_t)0x40018080)
DMA_InitStructur ...

解决了,谢谢
elimbug
6楼-- · 2019-10-16 22:37
没有人回吗?我顶一下,请大神指导一下啊!!!!

一周热门 更多>