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.

[参考译文] TMS320F28379D:使用 EPWM 触发 DMA 的 SPI 传输

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1599851/tms320f28379d-spi-transmission-using-epwm-triggered-dma

部件号: TMS320F28379D

您好:

我尝试使用 ePWM 触发的 DMA 来驱动外部 DAC、以便从 24 点正弦波表写入 SPI 发送缓冲区。 我已经将 ePWM 映射到 GPIO 以监控其输出。 我看到 SPI 外设发送 16 个时钟脉冲并在每个 EPWM 脉冲的上升沿将芯片选择驱动为低电平、但是、不会通过 MOSI 传输任何数据(请参阅图,前几次 SPI 写入是手动进行的)。

image.png

这向我表明 DMA 由我的 ePWM 触发、但出于某种原因、数据在 DMA 和 SPI 之间无法正确传输。 我也感到困惑、因为我在调试中监控了一些 DMA 标志、我看到以下标志在运行时保持不变:

  • DMA_getTransferStatusFlag = DMA_getRunStatusFlag = 1
  • DMA_getTriggerFlagStatus = 0

我不确定是否确实触发了 DMA。

我想知道是否有人可以查看我的 DMA 配置、并指出是否缺少一些明显的信息。 我怀疑我的问题与该主题中描述的非常相似、但遗憾的是、此用户不详细说明他们所做的更改(使用 ePWM、DMA 和 DAC 生成 Sinewave)。 以下是我的配置:

extern uint16_t waveformDATA[24];
#define mySPI0_TX_DMA_ADDRESS (SPIA_BASE + SPI_O_TXBUF)
void DMA_init(){
    DMA_initController();
	myDMA0_init();
}

void myDMA0_init(){
    DMA_setEmulationMode(DMA_EMULATION_STOP);
    DMA_configAddresses(myDMA0_BASE, (const void *)mySPI0_TX_DMA_ADDRESS, (const void *)waveformDATA);
    DMA_configBurst(myDMA0_BASE, 1U, 1, 0);
    DMA_configTransfer(myDMA0_BASE, 24U, 1, 0);
    DMA_configWrap(myDMA0_BASE, 24U, -24, 65535U, 0);
    DMA_configMode(myDMA0_BASE, DMA_TRIGGER_EPWM6SOCA, DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_ENABLE | DMA_CFG_SIZE_16BIT);
    //DMA_stopChannel(myDMA0_BASE);
	DMA_enableInterrupt(myDMA0_BASE);
    DMA_setInterruptMode(myDMA0_BASE, DMA_INT_AT_END);
	//DMA_clearTriggerFlag(myDMA0_BASE);
	DMA_enableTrigger(myDMA0_BASE);
}

此致、

Malcolm

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

    您好 Malcolm、  

    对延迟的回复表示歉意。 以下几点:

    • 您的 WaveformData 缓冲区是否放置在 GSRAM 中? DMA 只能访问存储器的 GSRAM 区域。
    • 为 WaveformData 缓冲区定义的数据类型是什么? 我建议使用 uint16_t 您能否分享您对 waveformDATA 阵列的定义、并推荐所需的 DMA 设置(突发,传输和环绕设置)?
    • 如果使用 ePWM 触发 DMA、SPI TX 缓冲区可能会出现溢出。 我建议切换到 SPI TX 触发器或使用 ePWM ISR、在软件触发 DMA 之前检查 SPI TX 缓冲器状态。 我认为这不是您当前问题的原因、但可能会在稍后引起问题。

    此致、

    Delaney

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

    尊敬的 Delaney:

    感谢你的帮助。 我将 waveformDATA 的声明更改为以下内容、这得到了从 DMA 正确传输的数据。 我想知道这是否是您通常如何将缓冲区放置在存储器的特定部分,或者是否有更好的方法来做到这一点:

    #pragma DATA_SECTION(waveformDATA, "ramgs0")
    extern uint16_t waveformDATA[WAVEFORM_SIZE];

    下面是我现在的输出:

    对于 ePWM 与 SPI 触发器、对于我的应用来说、我希望动态更改采样率是可行的、因此我可能会研究 ePWM ISR 方法。

    此致、

    Malcolm

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

    您好 Malcolm、

    很高兴听到您的 DMA 传输现在正在运行。 是的、这是将缓冲区分配给 GSRAM 的最佳方法。 我将关闭此主题、但如果您有任何其他问题、请随时创建另一个主题。

    此致、

    Delaney