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.

[参考译文] MSP430FR5994:MSP430 DMA 无序传输 SPI 通信数据

Guru**** 1139640 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/1327258/msp430fr5994-msp430-dma-transfers-spi-communication-data-out-of-order

器件型号:MSP430FR5994

团队成员:

   在 MSP430FR5994芯片中、如果我想使用 DMA 模块接收采样芯片发回的数据、应如何正确配置 DMA 底层?
问题背景:
  我想收集8个电路板的数据。 当我请求数据时、我会一次申请一个电路板。 目前、MSP430与采样芯片之间的通信是 SPI 通信。 当 MSP430中的 SPI 接收到数据时、UCB2RXIFG 被建立。 使用此标志作为 DMA 的触发源、DMA 开始将数据从 SPI 接收缓冲区传输到 voltdest_buff 数组 I set、然后我将在数组中提取有效数据以进行后续处理。
问题说明:
根据上述说明、整个过程由主机发送第1板的数据请求帧。 1号采集芯片响应后、建立 SPI 接收标志、DMA 开始移动数据。 等待一段时间后、主机开始发送2号电路板的数据请求帧、等待2号芯片应答后 DMA 开始移动数据、等待一段时间 主机开始发送第3个... 这个循环持续到所有电路板数据被读取。 我现在发现、如果 voltdest_buff 阵列大小设置为 一个板返回的数据的大小。 数组的大小将导致数组中的数据出现故障(数据正确、但顺序错误)。 如果 voltdest_buff 数组的大小设置为6个电路板返回的数据的总大小、则该数组将具有数据覆盖。 数组的初始数据很杂乱、但如果您往下看、可以找到完整的数据有效帧。
值得怀疑的要点:
(1)使用 UCB2RXIFG 作为 DMA 传输的触发源将导致 DMA 传输的时序是不可控的。 我仍然不知道如何解决。 应如何控制时序?
(2)使用 DMAREQ 作为 DMA 传输的触发源、传输没有成功。 我不知道如何正确修改我的配置。 我知道、使用 DMAREQ 作为触发源将使整个传输过程可控。
我的配置如下:

您是否有更好的建议或常规参考?

我期待您的回复,谢谢。

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

    SPI 是全双工的、即、当您发送 Tx 字节时、您始终可以获取尽可能多的 Rx 字节(即使其中的某些字节不有趣)。 必然结果:通过控制 Tx 大小来获得所需的 Rx (DMA)数据包大小。

    如果每个事务发送 NC 请求数据包字节、且期望返回 ND 数据字节、则整个事务的长度为(NC+ND)个字节、您将同时发送和接收如此多的 字节。 这确实意味着你必须在每个交易中考虑 NC (无用) Rx 字节、这是的、有点恼人。

    DMA 对芯片选择一无所知。 没有理由不能让所有8个目标的 Rx DMA 处于活动状态、在一个(Rx)事务中收集8*(NC+ND)个字节、而 Tx 事务执行8次(每个(NC+ND)个字节长)。

    138号数字有什么意义? 此外、数据字节在什么情况下是顺序错误的? (差距? 字节反转?)

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

    配置 DMA 可能有点棘手。 通常仅在绝对需要时使用。 要使所有这些功能正常工作、需要仔细阅读 MSP430和目标器件数据表。 我不知道目标是什么。

    如图所示进行配置后、每个触发器可获得一个传输(字节)。 在软件中设置 DMAREQ 是一个单次触发。 (通道未配置为查找该触发器- DMA4TSEL__DMAREQ。) 您必须针对 RXIFG 进行测试并为每个字节设置 DMAREQ。 由于响应 RXIFG 而处理传输会更简单、因此几乎不值得。

    您用于 SPI 传输的代码非常有用。 从您所说的情况来看、MSP430是主器件、并且正在生成时钟。 SPI 端口仅在有要发送的数据时才生成时钟。 除非数据正在通过 DMA 传输、否则在接收端使用 DMA 是毫无意义的。