STM32F429作为主机接收FPGA的数据后,进行SD卡存储时特别慢求助

2019-12-20 21:40发布

本帖最后由 thy110 于 2018-3-24 10:17 编辑

我使用STM32F429作为主机与FPGA进行通讯,接收数据,并用STM32存储数据。通讯接口采用的是SPI接口,使用的是STM32的SPI1接口,16分频,时钟为5.625MHZ,每次传输一个16位数据,数据的传输频率为5.625MHZ/16=351.56KHZ,同时开启了DMA循环接收模式来接收数据。FPGA上AD采集模块的采样频率是12.5KHZ,因此传输速度是远远满足的。
SPI的时钟如下图:
TIM截图20180324101710.png (648.42 KB, 下载次数: 0) 下载附件 2018-3-24 10:17 上传


现在的问题是在向SD卡里面写入数据时,速度特别慢。我在STM32里面设置了一个12500的数组来缓存采集到的数据,每接收12500个数据,就写入到SD卡中一次。但是在我实验时,平均1分钟内只能存储5个周期的数据即是12500*5,其余55个周期的数据没有保存下来。SD卡采用的是SDIO模式进行驱动的。不知道有什么好的办法提高存储速率的吗?整体代码如下:
       while(1)
       {
       sprintf(datasave,"%02x%02x%s",Rx_Buffer[0],Rx_Buffer[1]," ");//通过DMA接收到的数据进行格式化
       strcat(data_all,datasave);
              if(i== 12500)//每接受12500个数据时,进行一次存储,避免频繁的进行文件的读写操作。
              {
              i=0;
              res_sd= f_open(&fnew, "0:data.txt",FA_READ|FA_WRITE );
              f_lseek(&fnew,fnew.fptr+fnew.fsize);
              res_sd=f_write(&fnew,data_all,sizeof(data_all),&fnum);
              f_close(&fnew);
              memset(data_all,0, sizeof(data_all));
              }
       i++;
       }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
wye11083
1楼-- · 2019-12-21 01:06
不该这么慢的,再说你犯了个错误-你每次写4096的整数倍要快得多,毕竟sd卡底层是4KB的单元。fatfs配成4096B的唯一大小的页,分区表也对齐到4KB试试。最好不要用512B的页。要知道,最烂的sd卡也能写5MB/s
thy110
2楼-- · 2019-12-21 04:36
 精彩回答 2  元偷偷看……
thy110
3楼-- · 2019-12-21 06:02
wye11083 发表于 2018-3-24 10:46
不该这么慢的,再说你犯了个错误-你每次写4096的整数倍要快得多,毕竟sd卡底层是4KB的单元。fatfs配成4096 ...

还是不行,我把缓存数据量修改为4096*3时,依然是每秒存5个周期的数据
wye11083
4楼-- · 2019-12-21 06:08
thy110 发表于 2018-3-24 11:08
还是不行,我把缓存数据量修改为4096*3时,依然是每秒存5个周期的数据

我晕,我看错了,你带宽不够。sd卡速率才40KB/s,太慢了。加上一些其它开销,慢是肯定的。你至少要保证个500KB/s吧。试试。另外4KB扇区勿动。
thy110
5楼-- · 2019-12-21 11:16
wye11083 发表于 2018-3-24 11:37
我晕,我看错了,你带宽不够。sd卡速率才40KB/s,太慢了。加上一些其它开销,慢是肯定的。你至少要保证 ...

问一下,带宽应该怎么提高呢?
wye11083
6楼-- · 2019-12-21 15:40
thy110 发表于 2018-3-24 15:14
问一下,带宽应该怎么提高呢?

你stm的spi频率到底怎么配的?我看你5mhz是哪来的?为什么要16分频?是spi直接接sd卡吗?如果是,分频改小点。

一周热门 更多>