maudlu 发表于 2025-1-29 04:09

SPI加DMA通讯

单片机模拟SPI通讯实在是太慢了!
https://i0.hdslb.com/bfs/article/64b7a34e89314dae3da79b6168a5dfa2d7e78eec.png@1046w_1056h.webp耗时测试的方法:使用了个小软件,能在收到串口信息时输出当前时间(精确到ms),而单片机清屏开始前串口发送 “s”到电脑,结束时又发送“P”到电脑,对比两次时间的差距就知道花了多少时间了。https://i0.hdslb.com/bfs/article/27abeece10bf53df16fd56ae69e5b82117242230.png@1192w.webp
这是普通的SPI写入清屏的耗时,一个320*240的循环,每次写入2个Byte,这次耗时38ms而DMA加SPI写入数据的思路是,DMA传输512个Byte,等待传输结束,再次传输512个Byte,循环300次。
https://i0.hdslb.com/bfs/article/1f8e4c66c293c0d2c12d7ab6de0eed1e8cbcc5e0.png@1036w_1056h.webphttps://i0.hdslb.com/bfs/article/9ccbf155b3e01d508104f240c26656660dd7256c.png@1192w.webp
这次的运行耗时为25ms,由此可见DMA加SPI比单纯SPI发送快上不少,但具体原因我现在还不知道,如果谁有资料推荐的话在评论发一下链接,非常感谢。SPI1的发送和接收都是挂DMA2上的,我开始感觉,一个DMA不同通道同时搬运数据会不会让清屏时间变长?那样的话一个DMA不就只能开启一个通道?最后又花些时间实现SPI1加DMA同时发送接收时,清屏时间依然没有什么变化,总的来说,DMA搬运数据可能是STM32传输数据达到最快速度的必须的硬件了。

星辰大海不退缩 发表于 2025-1-30 10:33

单片机模拟SPI通讯实在是太慢了

公羊子丹 发表于 2025-3-12 08:14

DMA加速SPI传输确实效果明显,尤其是像320x240这种大数据量的场景,省去了逐字节搬运的数据开销。

周半梅 发表于 2025-3-12 08:15

你在DMA传输时检查过FIFO配置了吗?开启FIFO缓冲可能会进一步提升传输效率,减少突发数据丢失的情况。

帛灿灿 发表于 2025-3-12 08:17

DMA2本身带宽就大,SPI1加DMA同时收发数据其实不会有太大影响,毕竟DMA在硬件层面做了优化。

童雨竹 发表于 2025-3-12 08:18

SPI的时钟设置很关键,尝试提高时钟分频率,别忘了根据屏幕时序调整数据准备时间。

万图 发表于 2025-3-12 08:19

如果使用的是STM32F103,注意GPIO速度也要设置为50MHz模式,不然DMA效率再高也会受限。

Wordsworth 发表于 2025-3-12 08:20

试试将DMA的传输块大小调整成更接近屏幕数据帧的整数倍,可能会进一步减少DMA中断次数,提高效率。

Bblythe 发表于 2025-3-12 08:22

DMA模式下,检查你的NSS(片选)信号的时序,SPI设备可能对片选的稳定性要求较高。

Pulitzer 发表于 2025-3-12 08:23

如果你的屏幕支持,试着开启SPI双向数据线(双线全双工)模式,数据吞吐量会更快。

Uriah 发表于 2025-3-12 08:24

另外注意中断处理时尽量简化逻辑,DMA完成回调函数里别做太多耗时操作,不然可能会拖慢整体速度。

Clyde011 发表于 2025-3-12 08:25

STM32官方的库函数有不少冗余代码,考虑自己编写更精简的SPI+DMA配置,性能可能会进一步提升。
页: [1]
查看完整版本: SPI加DMA通讯