完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
今天主要来测试一下SPI读写SD卡的速度。SD卡是一个嵌入式中非常常用的外设,可以用于存储一些大容量的数据。但用单片机读写SD卡速度一般都有限(对于高速SD卡,主要是受限于单片机本身的接口速度),在高速、实时数据存储时可能会有影响。但具体速度可以达到多少呢,今天就来实际测试一下。 SD卡一般有两种常用的接口SPI和SDIO,SDIO又有1线和4线之分。很多单片机没有SDIO接口,但SPI接口就比较常用,今天主要来测试一下SPI接口读写SD卡的速度,主要是写入速度。 测试条件:单片机:STM32L433CCT6编译环境:MDK 5.30+HAL库SD卡:32Gbit SDNAND,型号:米客方德MKDV32GCL-STH文件系统:FatFS R0.12c 1.单纯SPI接口测试(非DMA) 我们知道,像SD卡之类的Flash存储器,一般都是按扇区擦除整块数据。因此每次写入字节数是扇区整数倍时,效率会比较高。同时,每次写入数据时,都需要先发送一些SD卡的指令,所以单次写入数据量越大,平均速度也就越快。了解了这些,我们就知道如何进行测试了。 首先,SD卡底层驱动使用的是HAL库函数,单字节读写,没有任何改动和优化: 接下来,我们先确定SPI和时钟频率多少合适,经过测试,发现20MHz的时钟频率比较合适,10MHz时读写速度会降低,再高的时钟频率对速度的提升也很小。因此我们这里用20MHz的时钟。 然后我们分别测试单次写入4KB、8KB、16KB时的速度为多少,测试结果如下: 可以看到,单次写入数据量越大,平均速度就越快。当单次写入数据达到32KB时,速度提升不明显。而且一般单片机内部RAM缓存也有限,单次写入16KB是一个比较合适的选择。 看到这个不到100KB/S速度,我还是有的不敢相信的,毕竟20MHz的时钟,理论上速度可以达到2MB/S左右,考虑到一些文件系统等协议的消耗,能到1/3差不多,那也得600多KB,现在的速度差距有点大。 当然,这个使用的HAL库函数有关,HAL_SPI_TransmitReceive函数效率比较低,内部做了大量的判断等操作,而且单字节传输也严重影响效率。如果自己优化一下,相信效率会有很大的提升。有兴趣的小伙伴可以试试。我们这次其实主要是测试SPI+DMA的速度,所以就不在这里纠结了。 2.SPI+DMA接口测试 DMA可以在外设和内存之间搬运数据,而不需要CPU的参与。其优势在于大量数据传输时,比如SD卡读写、SPI接口的液晶屏刷屏等。如果只是读写几个字节的数据,比如一些SPI接口的AD、DA等,DMA的优势就不明显。 因为SPI接口的设备一般都不是纯数据传输,都要配合一些指令等。所以即使使用DMA,也是要等待DMA传输完成再进行其它操作。当然这期间CPU可以通过中断方式去处理一些其它事情。 SPI+DMA写数据函数如下,使用的也是HAL库,没有进行优化。 以向SD卡写数据为例,需要改为DMA的地方有2处:写命令和写扇区数据,因为这两处发送的字节数比较多。一些SD卡的起始、结束、应答等单字节的数据传输使用的还是非DMA方式传输。下面是部分程序: 我们进行了两种测试:只使能DMA写扇区数据,以及使能DMA写扇区数据和发送指令。都是按照单次写入16KB进行测试,测试结果如下: 可以看到,速度提升非常明显。数据和指令都用DMA传输时,速度最快。如果再进行一些底层函数的优化,速度还会有提升。 最后我们对读取速度也进行了测试,使用DMA方式,使能DMA读扇区数据和发送指令,测试结果如下,读取速度可以达到1.1MB~1.2MB/S。 |
|
相关推荐 |
|
偏置电路与宽带偏置电路(Bias-Tee)-----电感器比较与选择
1644 浏览 0 评论
5612 浏览 0 评论
3201 浏览 2 评论
6199 浏览 2 评论
4098 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 18:43 , Processed in 0.446202 second(s), Total 34, Slave 26 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号