如何优化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时间要求,满足客户产品性能要求。
|