找回密码
 立即注册
查看: 380|回复: 11

SPI读取SD卡速度测试

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:190
  • 最近打卡:2026-04-03 00:10:33

25

主题

231

回帖

2093

积分

金牌会员

积分
2093
发表于 2026-1-18 15:29:53 | 显示全部楼层 |阅读模式
STC32G144K246 SPI接口读取TF卡测试,FATFS读取TF卡上一个2MB多文件,每次读取8KB,直至文件结束。
直接读到RAM缓冲区不做任何处理。

原始demo程序,SPI时钟频率10MHz,增加如下代码测量速度。
  1. void speedTest(const char *rootPath)
  2. {
  3.         uint16_t br;
  4.         uint32_t total, time;
  5.         f_open(&file, str_concat(rootPath, "/test.dat"), FA_READ);
  6.         printf("打开文件并读取文件内容\n");
  7.        
  8.         sec = 0;
  9.         Timer1_Init();
  10.        
  11.         total = 0;
  12.         LED = 1;
  13.         do
  14.         {
  15.                 f_read(&file, testbuf, 8192, &br);
  16.                 total += br;
  17.         }while(br == 8192);
  18.         LED = 0;
  19.        
  20.         TR1 = 0;
  21.         ET1 = 0;
  22.         time = (((TH1*256+TL1) - 151) * 1000UL)/(65536UL - 151);
  23.         time += sec*1000;       
  24.   
  25.         f_close(&file);       
  26.         printf("file read %ld byte : %ld ms.\n", total, time);
  27. }
复制代码

测量结果如下
文件大小2124765字节,耗时5.078秒,平均速度约408KB/S。



本帖被以下淘专辑推荐:

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:369
  • 最近打卡:2026-04-03 10:05:28

844

主题

1万

回帖

2万

积分

管理员

积分
22789
发表于 2026-1-18 15:43:57 | 显示全部楼层
SPI  可以 放到 30MHz ~ 45MHz
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:369
  • 最近打卡:2026-04-03 10:05:28

844

主题

1万

回帖

2万

积分

管理员

积分
22789
发表于 2026-1-18 15:44:42 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:190
  • 最近打卡:2026-04-03 00:10:33

25

主题

231

回帖

2093

积分

金牌会员

积分
2093
发表于 2026-1-18 16:23:50 | 显示全部楼层
SPI时钟速度提升至17MHz后,读取同样文件耗时为4.298秒,平均速度约480KB/S。
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:190
  • 最近打卡:2026-04-03 00:10:33

25

主题

231

回帖

2093

积分

金牌会员

积分
2093
发表于 2026-1-18 16:27:30 | 显示全部楼层
SD规范规定SPI模式下最大时钟频率25MHz,初始化时时钟最大400KHz。

尝试设置SPI时钟24.75MHz,初始化时钟保持300多KHz不变,读卡失败。
失败时的打印信息如下

开始发送至少74个时钟周期的空闲信号...
空闲信号发送完成。
发送CMD0,尝试让SD卡进入空闲状态...
SD卡已成功进入空闲状态,CMD0响应:0x01
发送CMD8,检查SD卡是否支持2.0协议...
SD卡支持2.0协议,CMD8响应:0x01
读取CMD8的4字节响应...
CMD8的4字节响应读取完成。
发送CMD58,读取OCR寄存器...
成功发送CMD58,开始读取OCR寄存器的4字节...
OCR寄存器的4字节读取完成。
SDSC卡容量:503316480 字节,c_size:3839,read_bl_len:9,c_size_mult:6
SDSC卡容量:503316480 字节,c_size:3839,read_bl_len:9,c_size_mult:6
SD卡初始化成功。
挂载磁盘失败,13
初始化失败.
文件系统初始化失败

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:190
  • 最近打卡:2026-04-03 00:10:33

25

主题

231

回帖

2093

积分

金牌会员

积分
2093
发表于 2026-1-18 17:06:05 | 显示全部楼层
测试结果极限就是17MHz,再高一点就失败。17.5MHz也不行。

PLL输出408MHz,SYSCLK 102MHz,SPI时钟408 /2 /3 /4 = 17MHz。
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:190
  • 最近打卡:2026-04-03 00:10:33

25

主题

231

回帖

2093

积分

金牌会员

积分
2093
发表于 2026-1-19 17:17:18 | 显示全部楼层
SPI时钟17MHz查询方式,文件读取速度480KB/S,此时SPI传输字节间隔较大。
精简SPI读写函数,
void SPI_WriteByte(u8 dat)  //SPI发送一个字节数据
{
    if(ESPI)
    {
        B_SPI_Busy = 1;
        SPDAT = dat;
        while(B_SPI_Busy);  //中断模式
    }
    else
    {
        SPDAT = dat;
        while(!(SPIF));        //查询模式
        SPI1_ClearFlag();    //清除SPIF和WCOL标志
    }
}
改为宏定义
#define SPI_WriteByte(dat)  SPDAT = (dat);while(!SPIF);SPI1_ClearFlag()

u8 SPI_ReadByte(void)
{
    SPDAT = 0xff;
    if(ESPI)
    {
        B_SPI_Busy = 1;
        while(B_SPI_Busy);  //中断模式
    }
    else
    {
                while(!(SPIF));        //查询模式
        SPI1_ClearFlag();        //清除SPIF和WCOL标志
       
    }
    return (SPDAT);
}
这个有返回值,不太好用宏定义替代,直接在调用处替换代码。
SPDAT = 0xff;while(!SPIF);*buffer++ = SPDAT;SPI1_ClearFlag();

上述处理后,读文件速度飙升至715KB/S。

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:190
  • 最近打卡:2026-04-03 00:10:33

25

主题

231

回帖

2093

积分

金牌会员

积分
2093
发表于 2026-1-19 17:22:58 | 显示全部楼层
启动SPI DMA,彻底消除SPI字节间隔时间。

实测开启SPI DMA但未开启FIFO,速度还不如CPU查询方式。

开启FIFO并启用SPI DMA后,速度达到798KB/S。此时用示波器观察波形,SPI CLK近乎连续,但字节间仍有很小的间断。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:651
  • 最近打卡:2026-04-02 13:22:49

33

主题

2927

回帖

6597

积分

论坛元老

积分
6597
发表于 2026-1-20 10:12:56 | 显示全部楼层
hea*** 发表于 2026-1-19 17:22
启动SPI DMA,彻底消除SPI字节间隔时间。

实测开启SPI DMA但未开启FIFO,速度还不如CPU查询方式。

SPI通讯不连续,一直都是他们家的问题。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:651
  • 最近打卡:2026-04-02 13:22:49

33

主题

2927

回帖

6597

积分

论坛元老

积分
6597
发表于 2026-1-20 10:17:40 | 显示全部楼层
截图202601201016021057.jpg

我用的单片机相对旧,没有太多的功能(FIFO)。这个是梁工的回复。

https://www.stcaimcu.com/forum.p ... =7892&pid=73870
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-3 16:08 , Processed in 0.121439 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表