SPI方式读写SD卡速度有多快?

这篇具有很好参考价值的文章主要介绍了SPI方式读写SD卡速度有多快?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

很久没有写公众号了,一方面忙,另一方面也不知道写些什么内容,大家如果有想了解的(前提是我也懂),可以后台发送给我。

今天主要来测试一下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库函数,单字节读写,没有任何改动和优化:

uint8_t SPI_ReadWriteByte(uint8_t TxData)
{
    uint8_t RxData = 0;
HAL_SPI_TransmitReceive(&hspi3,&TxData,&RxData,1,100);
    return RxData;
}

接下来,我们先确定SPI和时钟频率多少合适,经过测试,发现20MHz的时钟频率比较合适,10MHz时读写速度会降低,再高的时钟频率对速度的提升也很小。因此我们这里用20MHz的时钟。

然后我们分别测试单次写入4KB、8KB、16KB时的速度为多少,测试结果如下:

         sd卡spi模式传输速率,单片机,stm32,嵌入式硬件

可以看到,单次写入数据量越大,平均速度就越快。当单次写入数据达到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库,没有进行优化。         

int8_t SD_WriteBuffer_DMA(const uint8_t *TxData, uint16_t Size)
{
  uint32_t i = 0;          // 循环变量


  SPI3_DMA_Flag = 0;
  SPI_TransmitReceive_DMA(&HSPI_TF, (uint8_t*)TxData, txrxdata, Size); 


  /* 等待DMA传输完成 */
  while (1)
  {
    if(SPI3_DMA_Flag == 1)
      break;
    i++;
    if (i > 0xFFFFFF)
    {
      return 1;  /* 超时退出 */
    }
  }
  return 0;
}

以向SD卡写数据为例,需要改为DMA的地方有2处:写命令和写扇区数据,因为这两处发送的字节数比较多。一些SD卡的起始、结束、应答等单字节的数据传输使用的还是非DMA方式传输。下面是部分程序:

sd卡spi模式传输速率,单片机,stm32,嵌入式硬件

我们进行了两种测试:只使能DMA写扇区数据,以及使能DMA写扇区数据和发送指令。都是按照单次写入16KB进行测试,测试结果如下:

sd卡spi模式传输速率,单片机,stm32,嵌入式硬件

可以看到,速度提升非常明显。数据和指令都用DMA传输时,速度最快。如果再进行一些底层函数的优化,速度还会有提升。

最后我们对读取速度也进行了测试,使用DMA方式,使能DMA读扇区数据和发送指令,测试结果如下,读取速度可以达到1.1MB~1.2MB/S。

sd卡spi模式传输速率,单片机,stm32,嵌入式硬件

3.总结

SPI+DMA的方式读写SD卡速度优势明显,推荐使用。当然,这跟非DMA方式的底层函数效率低下有很大的关系。

但DMA的另一个更重要的优势在于,读写数据时可以大部分释放CPU资源。比如我之前的一个应用,需要以1KHz的频率在外部中断中去读取一些数据,每次大约需要几十uS。如果使用非DMA方式,频繁的中断,且几十uS时间也不短,会导致SD卡写入出错。而使用DMA方式则不会有这个问题。

最后,附上底层驱动程序:

链接:https://pan.baidu.com/s/1RnMCw5EAm_xMjT-UkUKoMA?pwd=98sb

提取码:98sb

推荐阅读:

STM32CubeMX系列教程

单片机通过WIFI模块(ESP8266)获取网络时间与天气预报

串口接收不定长数据的几种方法

不会写Bootloader?看这里,现成的!

UART波特率对时钟精度的要求有多高?

Keil调试时设置断点的高级用法

   欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。文章来源地址https://www.toymoban.com/news/detail-556445.html

到了这里,关于SPI方式读写SD卡速度有多快?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32存储左右互搏 SPI总线FATS文件读写SD/MicroSD/TF卡

    SD/MicroSD/TF卡是基于FLASH的一种常见非易失存储单元,由接口协议电路和FLASH构成。市面上由不同尺寸和不同容量的卡,手机领域用的TF卡实际就是MicroSD卡,尺寸比SD卡小,而电路和协议操作则是一样。这里介绍STM32CUBEIDE开发平台HAL库SPI总线FATS文件操作读写SD/MicroSD/TF卡的例程。

    2024年04月25日
    浏览(34)
  • STM32采集问答式串口传感器数据写入SD卡(spi模式)

    STM32f103RCT6板子 问答式温湿度传感器(TTL信号) 外接SD卡模块(淘宝都差不多) 1. SD卡模块 ,采用SPI1接线 (CLK)SCK —PA5 (DATA0)MISO —PA6 (CMD)MOSI —PA7 (DATA3)CS —PA4 前面小括号里的是SDIO模式的接线,可以忽略。 2. 传感器模块 问答式TTL信号的传感器都可以, 连接到板子的串口2,

    2024年02月05日
    浏览(44)
  • 【单片机】UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB、SD卡、1-WIRE、Ethernet等常见通信方式

    在单片机开发中,UART、I2C、RS485等普遍在用,这里做一个简单的介绍 UART口指的是一种物理接口形式(硬件)。 UART是异步(指不使用时钟同步,依靠帧长进行判断),全双工(收发可以同时进行)串口总线。它比同步串口复杂很多。有两根线,一根TXD用于发送,一根RXD用于接收

    2024年02月11日
    浏览(39)
  • STM32F429 Discovery开发板应用:实现SPI-SD Card文件写入(搭载FatFS文件系统)

    MCU:STM32F429ZIT6 开发环境:STM32CubeMX+MDK5   外购了一个SPI接口的SD Card模块,想要实现SD卡存储数据的功能。 首先需要打开STM32CubeMX工具。输入开发板MCU对应型号,找到开发板对应封装的MCU型号,双击打开(图中第三)。   此时,双击完后会关闭此界面,然后打开一个新界面。

    2024年02月08日
    浏览(54)
  • stm32读写SD卡(SDIO模式)

    目录 一、SD卡简介 二、源码下载 三、移植条件 1、芯片参数 2、硬件连接 四、驱动代码 1、依赖宏如下 2、驱动代码实现 3、测试代码 4、运行截图 五、总结 SD卡有SDIO驱动模式和SPI驱动模式,本例中使用SDIO模式驱动SD卡。 https://download.csdn.net/download/qq_30095023/88702705 https://downl

    2024年01月24日
    浏览(46)
  • 物联网开发笔记(96)- Micropython ESP32开发之SPI接口控制Micro SD卡TF卡模块挂载内存卡

    一、目的         这一节我们学习如何使用乐鑫的ESP32开发板连接SD卡模块,进行目录、文件的相关操作。         在早前我们也介绍过TFT SD卡的操作,这里我们重新复习一下。 物联网开发笔记(60)- 使用Micropython开发ESP32开发板之SPI接口控制Micro SD卡TF卡模块_microsd卡

    2024年01月25日
    浏览(41)
  • STM32CubeMX系列09——SDIO(SD卡读写、SD卡移植FATFS文件系统)

    ==== 文章汇总(有代码汇总) ==== 准备看看这方面的知识,一时间还没不清有什么区别,先补补课,不需要的跳过。 参考文章(内容来源):http://www.360doc.com/content/21/1125/22/59057945_1005908465.shtml 主要写这两个:SD卡、TF卡 共同点:SD、TF、MMC都是在MMC基础上演化发展不同的规范,

    2024年02月09日
    浏览(46)
  • android 12 SD动态申请读写权限

    android 12不仅需要在AndroidManifest.xml申请读写权限也需要在代码中动态的申请 关于如何动态申请读写权限仅需要两步 在AndroidManifest.xml文件中申请读写权限 在代码的启动MainActivity中动态申请方法 下面是关于动态权限申请的Manifest.class类大家有兴趣可以去了解下

    2024年02月11日
    浏览(36)
  • android 高版本sd卡目录读写权限

    1、从安卓11不允许访问sd目录,官方说明如下: https://developer.android.com/about/versions/11/privacy/storage?hl=zh-cn 2、使用MediaStore方法 一手遮天 Android - 存储: Android 11 通过 MediaStore 管理文件 - webabcd - 博客园 (cnblogs.com)  3、关于权限的文章 (31条消息) Android 10、11分区存储适配踩坑总结_安

    2024年02月15日
    浏览(41)
  • 【STM32学习】——SPI通信协议&SPI时序&W25Q64存储芯片&软件SPI读写

    目录 前言 一、SPI通信协议 1.概述​ 2.硬件电路  3.移位示意图 二、SPI时序 1.时序基本单元 2.完整时序波形 三、W25Q64存储芯片 1.芯片简介  2.硬件电路引脚定义  3.芯片框图 4.Flash操作注意事项 四、软件SPI读写W25Q64 五、SPI通信外设 总结 声明:学习笔记来自江科大自化协B站教

    2024年02月09日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包