我正在尝试收集进入 SPI 端口的数据、并使用 DMA 将其从 SPI 端口传输。 最初、我使用的是 DMA 的通道0、它工作正常、但在长时间测试时、DMA 偶尔停止传输。 我现在处于 DMA 不再传输的状态。 甚至对电路板进行循环供电也没有什么帮助。
我找到了 DMA 勘误表9 :https://www.ti.com/lit/er/slaz574v/slaz574v.pdf?ts=1636610126959 、并尝试了第二次变通办法、也添加了通道2。 同样、没有传输发生。
在启用 DMA 的例程中、我检查是否已为任一通道触发标志、这将导致程序离开循环。 我知道我可以离开循环、在用户选择停止收集数据时使用中断、这会导致设置标志、从而程序离开数据采集模式。 相关条件为:
while ((((DMA0CTL 和 DMAIFG)=0)&&((DMA2CTL 和 DMAIFG)=0);
我在收集数据之前置位 DMAEN 位、并在循环条件后将其禁用、循环条件持续循环至置位并复位、直到用户完成。
我的其余 DMA 设置如下:
ADC 的// DMA 设置
DMA0CTL &=~DMAEN; //禁用 DMA
DMA0SA =(字)&ASPI_RXBUF; //源地址是来自 ADC 的 RX 缓冲器
DMA0DA =(字)&ADCOUT[0]; //目标地址是一个字节数组,将存储6个字节(L0、L1、L2、L3、R0、 R1)
DMACTL0 |= DMA0TSEL_16; //在 USCIB1RX 上启动 DMA 传输这意味着当一个字节被接收到 USCI B1 RX 缓冲器中时、传输将发生
DMACTL4 |= DMARMWDIS; //在 CPU 的读取-修改-写入周期期间 DMA 传输被禁用
DMA0CTL &=~DMAIFG; //清除任何潜在的挂起中断
DMA0CTL |= DMADD_0 + DMADSTINCR_3 + DMASBDB; //重复单次传输模式、包括目标地址、源是字节、dest 是字节、边沿敏感触发器
DMA0SZ = 0x06; //传输大小为6字节(L0、L1、L2、L3、R0、 R1)
//修复勘误表 DMA9: https://www.ti.com/lit/er/slaz574v/slaz574v.pdf?ts=1636610126959
DMA2CTL &=~DMAEN;
DMA2SA =(字)&ASPI_RXBUF;
DMA2DA =(字)&ADCOUT[0];
DMACTL1 |= DMA2TSEL_16;
DMA2CTL &=~DMAIFG;
DMA2CTL |= DMADD_0 + DMADSTINCR_3 + DMASBDB;
DMA2SZ = 0x06;