This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5962:如何使用 DMA 通过 MSP430FR5994/5962接收无限长度的数据

Guru**** 2382280 points
Other Parts Discussed in Thread: MSP430FR5994
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1321460/msp430fr5962-how-to-use-dma-to-receive-data-of-indefinite-length-with-msp430fr5994-5962

器件型号:MSP430FR5962
主题中讨论的其他器件:MSP430FR5994

团队成员:

   我目前正在进行两个芯片之间的 SPI 通信。 MSP430用作从器件。 我希望从器件通过 DMA 接收数据、然后对其进行解析并通过 DMA 发送数据。 但目前我遇到了一个问题。 由于主机发送的每个数据帧的长度不同、因此我想知道如何在该芯片上接收长度可变的数据。

void BMS_DMA_Rx_Init(void)
{
          DMACTL1 |= DMA2TSEL__UCA0RXIFG ;
          DMACTL4 |= DMARMWDIS ;
          DMA2CTL |= DMADT_4 + DMADSTINCR_3 + DMASRCINCR_0 + DMADSTBYTE_1 + DMASRCBYTE_1 + DMALEVEL_0 + DMAEN + DMAREQ ;
          DMA2SA = (uintptr_t)EUSCI_A_UART_getReceiveBufferAddress(EUSCI_A0_BASE);
          DMA2DA = (uint8_t)(uintptr_t)RecV_ping ;
          DMA2SZ = 16 ;
         
}

目前、我使用 MSP430FR5994开发板、并使用串行端口调试助手对主机将数据帧发送到 MSP430进行仿真。 我的 DMA 触发源是 DMA2TSEL__UCA0RXIFG。 也就是说、只要串行端口发送数据、DMA 就会开始转换并将数据移动到 recv_ping 阵列。

首先通过串行端口调试助手发送数据帧

MSP430接收如下:

当我发送第二个帧时、将相同的命令

MSP430的第一个字节从 recv_ping  [15],开始、而不是从  recv_ping [0]开始

如果这继续、我的数组中的数据将会无序。 如果我每次传输的数据长度不相等、肯定会导致下一次数据传输填补上一次数据传输中的空白、然后重新覆盖当前数组的值。

在当前的代码中、我只初始化串行端口代码并初始化 DMA。 我既没有使用串行端口接收中断、也没有使用 DMA 中断。 那么、在这种情况下、我应该怎么做? 有什么好主意吗?

我希望一些专家能够耐心地读出来、能有更好的建议。

我期待您的回复,谢谢。

顺便说一下、我想实施 SPI+DMA 通信方法。 目前我只在使用 UART+DMA 在开发板上进行实验。 我想这两者几乎是相同的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    DMA 以固定长度(DMAxSZ)批次方式工作、只有在发生多次传输后才会"完成"。

    可以随时设置 DMAEN=0来停止批处理(之后设置 DMAEN=1会再次重置所有内容)--如果可以提出一个合适的标准的话。 一种方法是超时;eUSCI 没有内置的超时机制、但可以使用计时器构建一个。