LPC5528 + DMA 搬运重复数据

一、前言

在使用 SPI+DMA 需要重复发送同一个数据很多次的时候,如果还是按照先把数据存放到数组里面再发送,这样会浪费很多存储空间。所以这次在 LPC5528 上面使用 SPI+DMA 的方式对同一个数据重复发送多次。

二、实现

通常 DMA 在搬运数据的时候,会先设定从哪里搬到哪里,就有一个目的地址和源地址,我们使用 SPI 外设,目的地址就是 SPI 外设,这个地址是不变的,而源地址就有两种情况了,一是搬运存在于数组这样的数据,每搬完一个,源地址都得增加,才能搬下一个。二就是搬一个数据多次的情况,每次都搬同一个数据,源地址不改变,下一次还是搬这个地址里面的数据。

这个关于地址增加的设定在 DMA 的 XFERCFGn 寄存器中,其中 n 代表的是通道编号。

这次要重复搬运同一个数据要设定的情况就是,源地址不增加,目的地址也不增加。

参照SDK 中 SPI+DMA 的 demo,做一些修改。

需要修改的是这个函数里面的内容

status_t SPI_MasterTransferDMA(SPI_Type *base, spi_dma_handle_t *handle, spi_transfer_t *xfer)

先把准备最后一个字节的函数修改好。

PrepareTxLastWord(xfer, &s_txLastWord[instance], spi_config_p);

直接修改成如下

static void PrepareTxLastWord(spi_transfer_t *xfer, uint32_t *txLastWord, spi_config_t *config)
{
*txLastWord = (uint32_t)xfer->txData[0] ;

XferToFifoWR16(xfer, txLastWord);
SpiConfigToFifoWR(config, txLastWord);
}

原来是根据数据宽度来设定最后一个字节,改为无论是 8 位的数据宽度还是 16 位的数据宽度,统一最后一个字节都是第一个字节,这样就不会出错,如果不修改这里,最后一个字节会出错。

接下来,再把设定 DMA 目的地址和源地址的寄存器内容修改。

在 transmit 里面,设定 DMA 的地方,把 kDMA_MemoryToPeripheral 改成 kDMA_StaticToStatic 即可,如下图。



这样就实现了重复搬运数据。

验证如下。

定义一个变量等于 25 ,使用刚刚修改好的函数对它发送 100 次。以下是逻辑分析仪抓到的波形和解码得到数据。

数据正确并且数据量刚好 100 个,与设定的相符。

三、总结

实现了这个搬运大量的重复数据的做法,能够大大节省发送数据耗费的时间。

四、参考资料

1、LPC5528 的 User manual ,可以从 NXP 官网 (NXP® Semiconductors Official Site | Home) 搜索下载
2、SDK  可以从网址 (Welcome | MCUXpresso SDK Builder (nxp.com)) 搜索下载

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

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

评论