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.

[参考译文] MSP432P401R:具有 DMA 和 SPI 的 MSP432

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/706572/msp432p401r-msp432-with-dma-and-spi

器件型号:MSP432P401R

您好!

我想将一些数据从 RAM 传输到连接到 DAC 的 SPI 接口之一。

DAC 需要16位、但不会将两者之间的 CS 线路置为有效。 目前、我使用 GPIO 引脚手动生成 CS 线路。

为了加快整个过程、我想使用 DMA 传输。

我的问题(在开始深入研究 DMA 文档之前):

-是否可以将16位字(2字节序列)传输到具有 DMA 的 SPI 接口并自动创建正确的 CS 信号(在2字节传输之前/之后生效/失效)?

-是否可以使用第二个 DMA 通道生成 CS 信号?

欢迎您提供任何提示和帮助!

BR、Andreas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我找不到答案、多年来一直在寻找。 当时、我只在一个 SPI 单元(来自[其他人])上运行、该单元可识别 SPI "事务"的概念。 我提出了一些(相当巴洛克式)计划、但所有计划都"部署起来太危险"。

    第二个 DMA (或计时器)的问题与这两个 DMA 的协调一致。 对于纯 Tx 应用(如 DAC)、请记住、在事务完成之前、Tx DMA 完成两个字节的时间。

    16位有点特殊情况。 此 SPI 单元不提供16位"字节"(-> 16位事务)、但它在 Tx 侧有2个字节的缓冲、因此、如果您动态生成信号、则可以使用已编程的 I/O 填充两个字节、并在双切换/CS 后让其回写。

    有时会有一些技巧。 您使用的是哪种 DAC? 通常、对于 DAC、您需要固定速率输出、因此 MCU 需要以某种方式对事务进行定速、例如计时器和/或外部"负载"引脚。 也许您可以对该机制进行回扫?

    但我不想这么悲观。 也许其他人已经解决了这个问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bruce、您好!

    感谢您的回复! 我使用的是 TI DAC8311 (BOOSTXL 音频上的 DAC8311)。 是的、我希望具有44.1kHz 的固定速率输出。 也许我可以设置两个 DMA 通道、这两个通道都由同一个计时器触发。 一个将数据从 RAM 传输到 SPI、另一个将通过向 GPIO 端口写入数据来生成 CS。 但是、正如您所说的、问题是协调整个过程(确保 CS 在第一个 SPI 位之前生效)。
    遗憾的是、硬件 STE-LINes (当您在4线制 SPI 模式下运行时)仅为单字节声明 CS。 如果有某种类型的配置寄存器来说明单个 SPI 事务的位/字节数量、则会更容易。 但没有...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不建议使用第二个 DMA,而是建议使用定时器本身的 CCR 输出之一(例如 TA0.1)作为/SYNC 信号,另一个(TA0CCR2,例如--从数据表 SLAS826G 表6-36中选择)来触发 DMA。 我认为您需要两个 CCR 来使边缘感测(DMA 上升、/SYNC 下降)正确、但可以将它们设置为与不同的 OUTMOD 同时转换。

    一个棘手的问题是、您希望 DMA 在每个输出周期中触发两次(两个字节)、但/SYNC 仅触发一次。 我认为有一种解决方案、方法是以两倍的速率运行计时器(将周期减半)、同时针对/SYNC 使用 Toggle (OUTMOD=4)、并针对 DMA 触发器使用其中一种"正常"PWM 模式(例如设置/复位)。 不过、您可能应该在相信我之前用纸张解决它。

    TXIFG 的作用也很快,但 SPI 的一个优点是它完全可以预测——启动一个字节,等待8位时间,然后完成。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andreas:

    1.研究 ARM 的 DMA 理论。 至少是 TI 的"slla356"文档第11节。

    2.在以下步骤中使用 DMA 的散聚模式:

    a.使用位带将 CS 置为甜点。

    b.发送字的第一个字节

    c.发送第二个字字节

    正如您可以猜测的那样、同步过程不需要 CPU 干预、这很好。

    此致、

    Alexey

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Alexey、很高兴听到有解决此问题的方法。 我已经阅读了大多数 slau356、但 DMA 一章没有我想象的那么直观。 这就是我到目前为止没有使用 DMA 的原因。 对于研究 ARM PL230的文档、您是否有任何好的建议、最好是使用 MSP432示例?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    安德烈亚斯

    尝试调试 TI 首先提供的 driverlib DMA 样本。 还有一些 TI 示例利用 DMA 进行实时 ADC 数据传输。
    然后尝试根据您的需求更改 DMA 代码。

    此致、
    Alexey
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    安德烈亚斯
    希望这些示例对您有所帮助:

    dev.ti.com/.../

    e2e.ti.com/.../2578528

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

    @Alexey 和 Chris:非常有帮助的提示,非常感谢。 当 PCM 输出与 DMA 配合使用时(与 MP3解码器[libmad]配合使用、它已经与中断驱动的 PCM 输出配合使用)、我将发布另一条回复。

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

    还有一个简短的问题:当写入某些 GPIO 端口的输出寄存器时、DMA 工作正常。

    当我尝试写入相应的位带别名地址时、不会发生任何情况。 当通过 DMA 写入位带区时、有什么特别的考虑?

    此外、CCS 不提供手动更改位带区域。 当我在内存浏览器中显示地址0x42000000时、不会显示任何内容...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只是为了确认 DMA 不能访问位带区。

    e2e.ti.com/.../2613617

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

    您好!

    使用散聚 DMA 序列、我现在能够通过 SPI 写入16位半字并生成正确的 CS 信号。 我的程序仍然有一个 IRQ 例程、每秒调用44100次(最初我希望我可以通过 DMA 写入整个数据块)、 但该例程当然要快得多、因为我只需触发 DMA 传输、而不是通过 SPI "手动"发送2个字节。

    再次感谢您的大力支持!

    BR、Andreas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    安德烈亚斯
    感谢您的结束和反馈。

    Chris