查看: 209|回复: 0

[原创] 如何优化SDK DMA SPI驱动程序以实现快速通信

[复制链接]

该用户从未签到

22

主题

50

帖子

0

高级会员

Rank: 4

积分
650
最后登录
2024-4-13
发表于 2023-12-17 19:27:25 | 显示全部楼层 |阅读模式
                   如何优化SDK SPI DMA驱动程序以实现快速通信

1. SDKDMA SPI驱动程序
NXP MCUXpresso SDK提供了SPI DMA驱动程序,实现通过DMA方式收发SPI。代码位于$(SDK)boards\lpcxpresso55s16\driver_examples\spi\dma_b2b_transfer\master目录。
实际测试发现每次开始每路SPI传输前都需要调用SPI_MasterTransferDMA(…)重新配置DMA,需要花费大约27us,占了整个SPI传输时间的37%,无法满足100us内完成5CH* 32字节多路SPI收发的时间要求。

2. 优化DMA SPI驱动程序
通过分析LPC55xx SPIDMA驱动程序源代码,可以知道SPI Tx使用了linkedtransfers方式。第一个DMA descriptor 实现一部分SPI Tx数据发送,第二个DMA descriptor完成最后一个字节的发送,并控制/CS管脚,然后使能DMA完成中断。

根据FIFOWR寄存器定义,将SPI发送字节和控制配置(TXSSEL_n,EOT,EOF,LEN)合并为一个32 bit数据。修改SPI_MasterTransferDMA函数,配置DMA descriptor直接把masterTxData_DMA数组传到FIFOWR寄存器。
uint32_t masterTxData_DMA[TRANSFER_SIZE];

masterTxData_DMA[0] = 0x070D0000  | (i % 256U);
………

masterTxData_DMA[TRANSFER_SIZE -1 ] =0x071D000F;  /* last byte, EOT=1, EOF=1*/

原有SDK驱动程序在每次开始SPI传输前都需要调用SPI_MasterTransferDMA(…)函数重新配置DMA,有很大部分操作都是重复不需要的,增加了不少初始化时间。我们对重复的DMA操作进行精简,只修改每次DMA结束后需要重新初始化的DMA descriptor等配置。新的SPI_MasterTransferDMA_OPT(…)函数大大简化了操作过程。

3. 优化前后SPI DMA性能测试对比

优化后的SPI_MasterTransferDMA_OPT(…)函数执行时间小于5us,相比优化之前的27us,只有原先的1/5,性能有很非常大的提高。特别在使能5个SPI DMA传输通道的应用场景下,能够保证总时间小于100us时间要求,满足客户产品性能要求。

如何优化SDK DMA SPI驱动程序以实现快速通信.pdf (838.83 KB, 下载次数: 5)
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-27 22:09 , Processed in 0.114751 second(s), 19 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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