你(们)好
你好。
我们的客户在使用带有 SPI 的 DMA 从从从器件读取多字节时遇到问题。 他们正在尝试使用 DMA 从 ADXL362进行 SPI 突发读取、并将 DMA 配置 为与 RXbuffer 配合使用并发送读取指令、但没有使 DMA 正常工作。
这是 DMA 配置。
SPIconfiguration
以下是运行 DMA 代码时逻辑分析仪的屏幕截图。 读取指令被发送到 ADXL362、但是没有接收到任何内容。 DMA 配置是否错误?
感谢您的帮助。
此致、
卡洛
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.
你(们)好
你好。
我们的客户在使用带有 SPI 的 DMA 从从从器件读取多字节时遇到问题。 他们正在尝试使用 DMA 从 ADXL362进行 SPI 突发读取、并将 DMA 配置 为与 RXbuffer 配合使用并发送读取指令、但没有使 DMA 正常工作。
这是 DMA 配置。
SPIconfiguration
以下是运行 DMA 代码时逻辑分析仪的屏幕截图。 读取指令被发送到 ADXL362、但是没有接收到任何内容。 DMA 配置是否错误?
感谢您的帮助。
此致、
卡洛
在 SPI 主器件中、必须向 TXBUF 馈送某个数据、才能使 SPI 时钟运行。 该代码提供一个字节、因此时钟仅运行一个字节。
对于 SPI+DMA,通常使用第二个 DMA 通道为 Tx 侧供电-- DMASZ 相同,但 SRCINCR=0重复发送相同(虚拟)字节。
遗憾的是、在 FR5994中、UCB1-3对 Tx 和 Rx 使用相同的 DMA 通道、因此存在冲突[参考数据表(SLASE54C)表6-11]。 如果可以改用 UCB0或 UCA0-3之一、这将是最简单的解决方案。 此处概述了另一种使用计时器的解决方案:
https://e2e.ti.com/support/microcontrollers/msp430/f/166/p/971225/3588909
我不想指出(原谅我的不满)这里需要修复的所有问题、而是建议您从另一个线程中的代码中大量借用。 尽管使用异常、但它主要是标准 SPI+DMA 设置;唯一不寻常的是触发。
对于本例中的触发:除了 DMACTL0设置外、还必须处理 TXIFG。 有两种方法:
1) 1)使用 DMALEVEL=1。 其效果是在(Tx 侧) DMAEN 被置位时启动 DMA、因为 TXIFG=1已经被置位。
2) 2)使用 DMALEVEL=0、并发送第一个字节、直接写入 TXBUF。 为了实现这一目的、您需要(a)在 Tx 侧 DMAEN 被设定后只执行一次(b)同时将(初始) Tx 侧 DMASZ 递减一(并根据需要使 Tx 侧 SA 递增)、以考虑直接写入的字节。
----------
另一个线程使用旋转环路来完成、主要是为了简化演示。 上述 ISR 大部分都可以正常运行、但以下情况除外:
> IF (DMAIV 和 DMAIV_DMA0IFG)
DMAIV 包含一个小整数、而不是一个位掩码。 尝试:
>IF (DMAIV == DMAIV_DMA0IFG)
和:
>_BIC_SR_REGISTER_ON_EXIT (LPM0_Bits | GIE);
这会为中断禁用(GIE=0) main、这可能不是您想要的。 尝试:
>_BIC_SR_REGISTER_ON_EXIT (LPM0_Bits);