【RT1020 】- 提升 SDK 中 LPSPI+DMA 传输速率的简单方法

关键字 :LPSPIDMANXP

一、前言

在使用 RT1020 关于 LPSPI+DMA 的 SDK 例程的时候发现其在高 Baudrate的情况下发送数据的实际总耗时与理论值相差太远,举个例子,按最高速率 66M 的 Baudrate 发送 5K Byte 数据量的时候,其实际耗时 1.4ms,理论上只需要约 620us,实际耗时是理论时间的 2 倍有余,这样在一些高速率的应用中可能远远达不到要求。本文就这个问题提供一些简单的解决方法。

二、解析

使用 SDK 的 LPSPI+DMA 的例程先测试低速 6.6M Baudrate 的情况下发送 5K Byte 的总耗时,理论时间是 1 / 6.6 * 8 * 5 * 1024 = 6206us,实测总耗时如下图,6564us,可以看到实际比理论慢 300us 左右。

把 Baudrate 提升至 66M,发送 5K Byte 的理论时间是 1 / 66 * 8 * 5 * 1024 = 620us,使用 SDK 代码实测总耗时如下图,1401us,实际比理论慢 781us。

这里讲述一种比较简单的在 66M Baudrate 的情况下发送数据尽量接近理论用时的方法。上述两次测试,按照 SDK 例程的做法是 DMA 每一次是搬 8bit,SPI 每次也是发 8bit,现在在不动底层的情况下,让 DMA 以 32bit 去搬,SPI 以 32bit 去发,原要发送的 5K Byte 的数据让其每 4 个 Byte 合成一个 32bit 的元素放到一个 32bit 的数组里面去。

具体做法如下图。

其中 masterTxData 就是 32bit 的数组,其元素个数 _32bit_TRANSFER_SIZE 就是 8bit 的 _8bit_TxData 数组的 1/4, 以 5K Byte 为例,_32bit_TRANSFER_SIZE 就是 5*1024/4 = 1280,图片中这个 for 循环处理时间按 5KByte 的数据量大约耗时 100us。

然后正常配置 DMA 和 SPI 以 32bit 去发,实际测得的耗时如下图,约 700us,这个 700us 是加上了上面那个 for 循环的 100us,如果没有这个数据处理,实际耗时就约与理论时间相一致。从机端只要保持按 8 bit 去收即可。



在配置的时候需要注意的是如下图,发送的 dataSize 是单位是多少个 Byte 而非发送 buffer 的元素个数,如果使用本文的合成数据的方法,其中的 KLPSPI_MasterByteSwap 不要使能,否则 32bit 的数据会进行 24-31 bit 与 0-7bit,8-15bit 与 16-23bit 的数据交换。



三、总结

本文提出了在 RT1020 的 LPSPI+DMA 例程以 66M Baudrate 发送数据的时候实际耗时与理论耗时相差太远的简单解决办法。使用的 SDK 版本是 RT1020 的 2.11.0,下载地址放在参考资料中。


四、参考资料

1、NXP SDK 下载官网

Select Board | MCUXpresso SDK Builder (nxp.com)

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论