找回密码
 立即注册
查看: 29|回复: 8

为什么Ai8H8K64U的DMA_SPI比纯硬件SPI没任何速度提升?

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-10-02 17:26:23
已绑定手机

2

主题

5

回帖

50

积分

注册会员

积分
50
发表于 昨天 17:26 | 显示全部楼层 |阅读模式
为避开国庆假开始的拥堵,这两天测试了Ai8H8K64U的DMA_SPI驱动ST7789P3的240*320的IPS彩屏,本以为会有性能的大幅提升,没想到相差无几,不知是何原因,求大神指教!
主频:24MHz
SPI频率:主频/4
DMA_SPI实现思路:双缓存,每个缓存256字节,写满一路缓存启动发送后写第二路缓存。采用中断方式,一旦传送结束,马上释放SPI总线以供其他共享部件使用。

测试思路:
设置Timer0每1ms中断进行用时计算,然后调用纯硬件的SPI进行全屏填纯色3次,停止timer0计时,显示所用时间。
复位计时变量和timer0,重新启动timer0计时,调用DMA_SPI进行全屏填纯色3次,停止timer0计时,显示所用时间。
结果纯硬件SPI 3次全屏刷新用时1782ms,DMA_SPI 3次全屏刷新用时1781ms,这个还是在只有一种颜色时的理想结果。
在根据字模输出字色或背景色时,由于每个点都多了一次if判断,并根据结果选择不同颜色填充缓存时,3次刷屏用时比纯硬件SPI还多400多ms。
想请教一下,Ai8系列的PDF文档中只有DMA_SPI_AMT这一个发送数量寄存器,没有高8位的数量?是否一次最多只能发256字节?

下面贴代码:

定时器0中断

定时器0中断


DMA_SPI中断

DMA_SPI中断


主程序

主程序


LCD_DMA子程序

LCD_DMA子程序


LCD_DMA过程

LCD_DMA过程


查阅了AI8H.H头文件关于DMA_SPI的相关寄存器好像真只有DMA_SPI_AMT这一个是控制传送数量的。

AI8H

AI8H




个人感觉如果真只能这样的话,那增加那么些代码来实现就没必要了。希望有经验的大神和官方工程师指点迷津。


回复

使用道具 举报 送花

3

主题

1928

回帖

704

积分

等待验证会员

积分
704
发表于 昨天 17:28 | 显示全部楼层
您好,感谢您对 Ai8H8K64U 的深入测试和分享。关于您提到的 DMASPI 相比纯硬件 SPI 没有带来预期的速度提升问题,这是一个非常典型且值得深入探讨的技术问题。以下从多个角度为您分析可能的原因,并提出优化建议。

一、DMASPI 理论优势与实际瓶颈

DMA(Direct Memory Access)的主要优势在于:在数据传输过程中,无需 CPU 参与搬运,从而释放 CPU 资源,提高系统整体效率。在 SPI 通信中使用 DMA,理论上可以减少 CPU 中断开销和数据拷贝的负担,从而提升数据吞吐量。

但在实际应用中,是否能真正带来性能提升,取决于以下几个关键因素:

1. SPI 主频与系统主频的匹配度
2. DMA 配置与使用方式是否合理
3. 数据准备与发送之间的流水线效率
4. 外设本身的响应能力(如 ST7789P3 屏幕)
5. CPU 在 DMA 传输期间是否有其他任务可并行执行

二、Ai8H8K64U 平台下的 DMASPI 实现分析

您提到的配置如下:
主频:24MHz
SPI频率:主频 / 4 = 6MHz
DMASPI实现方式:双缓存(每缓存256字节),中断方式切换
测试方式:Timer0 每1ms中断计时,对比纯硬件SPI与DMASPI的全屏刷新耗时

从这些信息来看,我们可初步分析如下:

1. SPI频率限制是瓶颈
SPI频率为6MHz,意味着每个字节传输需要约 1.33微秒(1/6M  8)。
240x320像素的屏幕,每个像素需要2字节(RGB565),则全屏数据量为:
  
  1. 240  320  2 = 153600 字节
复制代码
传输时间理论值为:

  1. 153600  1.33us ≈ 204.29ms
复制代码
即使不考虑初始化、命令发送、DMA准备等开销,单次刷新至少需要约200ms,3次即约600ms。而您实测为1781ms,说明还有较多额外开销。

2. CPU 主频与 SPI 频率差距不大
主频为24MHz,SPI频率为6MHz,即每4个系统时钟周期完成1位传输。
这意味着 CPU 在 SPI 传输期间仍然需要频繁响应中断或等待 SPI 状态,无法完全脱手。

3. DMA 传输效率受限于缓存大小
您采用的是双缓存机制,每缓存256字节。虽然可以实现一定程度的流水线传输,但256字节在全屏数据面前显得非常小。
每次DMA传输完成后需要重新配置下一段数据,中断处理开销较大。
若中断处理逻辑复杂(如判断字模、颜色选择),反而会拖慢整体性能。

4. 外设响应时间限制
ST7789P3 屏幕在接收数据时有一定的响应延迟,尤其是当需要频繁发送命令和数据切换时。
即使SPI速率很高,屏幕本身的处理能力也可能成为瓶颈。

三、为何DMASPI未带来速度提升?

结合您的测试结果(纯硬件SPI与DMASPI耗时几乎相同),我们可以归纳为以下几点原因:

1. SPI传输速率已接近极限
当前SPI频率为6MHz,已经是一个较高的速率。
在这个速率下,CPU与DMA之间的效率差异已经不大,尤其是当DMA缓存较小、中断频繁时,反而可能增加系统开销。

2. DMA中断与缓存切换开销较高
每次DMA传输完成后都需要触发中断、切换缓存、写入新数据。
如果这部分逻辑在中断中执行较重(如判断颜色、填充缓存),反而可能抵消DMA带来的优势。

3. 任务并行度不高
在纯硬件SPI中,CPU虽然在等待SPI发送完成时处于“忙等”状态,但由于SPI传输时间较长,实际等待时间也差不多。
使用DMA后,若CPU没有其他任务可并行执行,实际节省的时间非常有限。

4. 测试方法可能掩盖了DMA的优势
您测试的是“全屏填纯色”,数据准备非常简单,DMA在数据搬运上的优势不明显。
若测试的是复杂图形(如图像传输、字库渲染),DMA优势可能更明显。

四、优化建议

1. 增大DMA缓存
将单次DMA传输的缓存大小增大至1KB或更大,减少中断次数。
若内存允许,甚至可以采用单次DMA全屏传输的方式。

2. 优化中断处理逻辑
中断处理中尽量避免复杂的判断逻辑(如if判断、颜色选择)。
可将数据准备放在主循环中,仅在中断中切换缓存指针。

3. 采用DMA+双缓冲+乒乓机制
利用DMA的自动重载功能,实现真正的“乒乓”缓冲机制,减少中断次数。
可结合硬件自动切换缓存地址,避免软件干预。

4. 提高SPI频率
若ST7789P3支持更高SPI频率(如12MHz或24MHz),可尝试提高SPI频率以提升传输速率。
注意屏幕的最大SPI频率限制。

5. 考虑使用硬件加速或并行接口
若平台支持并行接口(如RGB接口或FSMC),可考虑改用并行驱动方式,大幅提升刷新速度。

五、结语

DMASPI 的优势在于降低CPU负担、提高系统并发能力,而不是在所有场景下都直接提升传输速度。在 SPI 频率受限、缓存机制不合理、中断逻辑复杂的情况下,DMA 的优势难以体现。

建议您根据实际需求优化DMA使用方式,结合硬件能力进行合理配置。如需进一步调试建议或代码优化指导,欢迎继续交流。

祝您开发顺利!

国芯人工智能团队

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:195
  • 最近打卡:2025-10-02 09:04:52

784

主题

1万

回帖

1万

积分

管理员

积分
19406
发表于 昨天 17:28 | 显示全部楼层
DMA只是解放 CPU, 让CPU去干更重要的事。SPI的速度是SPI控制的,和 DMA无关
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-10-02 17:26:23
已绑定手机

2

主题

5

回帖

50

积分

注册会员

积分
50
发表于 昨天 17:47 | 显示全部楼层
神*** 发表于 2025-10-2 17:28
DMA只是解放 CPU, 让CPU去干更重要的事。SPI的速度是SPI控制的,和 DMA无关

在没看人工智能的分析前我就感觉缓存太小了,所以在思考是不是我阅读PDF不认真遗漏了某些信息。但反复查阅后没有找到更多的资料了,所以上来求助,希望得到官方的确认。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-10-02 17:26:23
已绑定手机

2

主题

5

回帖

50

积分

注册会员

积分
50
发表于 昨天 17:49 | 显示全部楼层
如果我阅读的信息已完整,这个系列的DMA单次传输数据量是否可以提高到1K,甚至更多呢?

点评

传输量由这个单字节寄存器控制,所以需要按最大256分批传输。如果需要单次更大可以考虑STC32G\Ai8051U系列 [attachimg]116694[/attachimg] [attachimg]116695[/attachimg]  详情 回复 发表于 昨天 18:08
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:315
  • 最近打卡:2025-10-02 12:32:59
已绑定手机

83

主题

3209

回帖

7092

积分

荣誉版主

无情的代码机器

积分
7092
发表于 昨天 18:08 | 显示全部楼层
ean*** 发表于 2025-10-2 17:49
如果我阅读的信息已完整,这个系列的DMA单次传输数据量是否可以提高到1K,甚至更多呢? ...


传输量由这个单字节寄存器控制,所以需要按最大256分批传输。如果需要单次更大可以考虑STC32G\Ai8051U系列
截图202510021806522977.jpg


截图202510021808051622.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-10-02 17:26:23
已绑定手机

2

主题

5

回帖

50

积分

注册会员

积分
50
发表于 昨天 19:28 来自手机 | 显示全部楼层
ercircle 发表于 2025-10-2 18:08
传输量由这个单字节寄存器控制,所以需要按最大256分批传输。如果需要单次更大可以考虑STC32G\Ai8051U系 ...

感谢大神假期的关注。目前已经是按这个思路实现。并在调试中发现程序的耗时主要是在准备数据中,当写一块新缓存到大约0x6A-0x70个字节时,dma_spi就已经中断,表示256字节的发送时间占数据准备时间的一半不到。
一会准备把数据准备中的字节操作改成字操作,把数据准备时间减少。
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:195
  • 最近打卡:2025-10-02 09:04:52

784

主题

1万

回帖

1万

积分

管理员

积分
19406
发表于 昨天 21:25 | 显示全部楼层
让 STC8H8K64U工作在 40MHz, 40MHz/4 = 10MHz 比 24M/4 = 6M快
另外,双缓冲乒乓技术,高效刷屏
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:195
  • 最近打卡:2025-10-02 09:04:52

784

主题

1万

回帖

1万

积分

管理员

积分
19406
发表于 昨天 21:29 | 显示全部楼层
另外 AI8051U的 DMA缓冲区是 64K, 还可以外设直接到外设,要刷 TFT彩屏,AI8051U更合适。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-3 07:00 , Processed in 0.165247 second(s), 100 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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