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.

[参考译文] TMS570LC4357:[TMS570LC4357/TMDX570LC443HDK]兼容性 SPI + DMA(半‑μ s 双工):除非等待 RXINTFLG/TXINTFLG、否则不会发送所有半‑μ s 字。 如何正确调整 DMA 速度?

Guru**** 2782445 points

Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1612366/tms570lc4357-tms570lc4357-tmdx570lc43hdk-compatibility-spi-dma-half-duplex-not-all-half-words-transmitted-unless-wait-for-rxintflg-txintflg-how-to-pace-dma-correctly

器件型号: TMS570LC4357
主题中讨论的其他器件: HALCOGEN

目标:
使用 DMA 在半‑双工模式下通过 SPI2(兼容模式)发送 8 个半‑字、且无中断。 DMA 由软件‑触发。

我使用的 DMA 控制数据包 (Tx 到 SPI2/DAT1)
G_dmaCTRL s_dmaCTRLPKTSPITx ={0};

/*-配置 DMA 控制数据包*/
S_dmaCTRLPKTSPITx.Sadd     =(Uint32) au16_txData2;   /*源地址            */
S_dmaCTRLPKTSPITX.DADD     =((uint32_t)(&spiREG2->DAT1))+ 2);   /*目标地址 (SPI2)*/
S_dmaCTRLPKTSPITX.CHCTRL   = 0;               /*通道控制           */
S_dmaCTRLPKTSPITX.FRCNT    = 1;               /*帧计数               */
S_dmaCTRLPKTSPITX.ELCNT    = 8;               /*元素计数             */
S_dmaCTRLPKTSPITX.ELDOFFSET = 0;               /*元素目标偏移*/
S_dmaCTRLPKTSPITX.ELSOFFSET = 0;               /*元素源偏移     */
S_dmaCTRLPKTSPITX.FRDOFFSET = 0;               /*帧目标偏移  */
S_dmaCTRLPKTSPITX.FRSOFFSET = 0;               /*帧源偏移       */
S_dmaCTRLPKTSPITx.PORTASGN = PORTA_READ_PORTB_WRITE;
S_dmaCTRLPKTSPITX.RDSIZE   = ACCESS_16_BIT;   /*读取大小                 */
S_dmaCTRLPKTSPITx.WRSIZE   = ACCESS_16_BIT;   /*写入大小                */
S_dmaCTRLPKTSPITx.tType    = FRAME_TRANSFER;  /*传输类型             */
S_dmaCTRLPKTSPITX.ADDMODRED = ADDR_INC1;       /*地址模式读取         */
S_dmaCTRLPKTSPITx.ADMODEWR = ADDR_FIXED;      /*地址模式写入        */
S_dmaCTRLPKTSPITx.AUTOINIT = AUTOINIT_OFF;    /* autoinit *                  /

/*设置 DMA 控制数据包*/
dmaSetCtrlPacket (DMA_CH0、s_dmaCTRLPKTSPITx);

/*-通过软件触发*/
dmaSetChEnable (DMA_CH0、DMA_SW);

目的地为 spiREG2->DAT1 。 对 DAT1 的寻址基于 hl_reg_spi.h 中显示的 SPI 寄存器映射 周期性 TX DMA 软件触发使用 HALCoGen DMA API (dmaSetCtrlPacket、dmaSetChEnable)。

一些行为
‑我不使用 DMA 并且在没有内部等待的情况下调用 HALCoGen spiTransmitData ()(我在 SPIFLG.RXINTFLG/TXINTFLG 上注释掉了 while ),我只在总线上观察到两个半 μ s 的字;其余的从不出去。
如果我恢复原始 spiTransmitData (),使它等待每个字的 RXINTFLG(或 TXINTFLG ),那么所有 8 个半‑字都正确传输。
‑DMA、我看到了同样的模式:如果让 DMA 在没有起搏的情况下将多个元素推送到 DAT1、则只会显示几个半‑字而不是 8 个半字、而当我软件 起搏一次一个元素(在 RXINTFLG 之后触发)时、所有字都能正确传输。 (我‑的是,Hercules DMA 没有“每个 μ s 元件延迟“寄存器、可以像外设/总线接受它们的速度一样快地流式传输元素。 请确认。)

问题:
‑、在 兼容模式下写入 SPIDAT1 时、LC4357 DMA 中是否有任何寄存器‑级机制来强制执行每 μ s 元素等待?
‑我在 g_dmaCTRL(ELCNT/FRCNT/tType/ADDRMODE*/WRSIZE 等)中所看到的、没有“‑μ s 之间的元素延迟“、因此块/弹性流将输出 μ s 来运行 SPI 移位器、除非我从外部调整移位器的速度(SPIFLG 的软件轮询或慢速周期性触发器)。 这种理解是正确的吗?

2.观察到的“不等待时、只有两个半‑字传输“是否正常?
‑HALCoGen 的传输例程特意等待 RXINTFLG 以确保前一个字完全完成、我假设两个 字的症状是“过早“写入 DAT1 的预期结果。 TI 能否确认这是兼容模式下的已知/预期行为?


提前感谢!
Tushar

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

    我已经浏览过这些示例、他们在回答这些问题时没有帮助

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

    感谢您的答复!

    将 MibSPI (FIFO 模式 SPI) 与配合使用 软件触发 DMA 、我是否还必须配置 MibSPI->DMACTRL 寄存器和 DMA 请求行号?

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

    尊敬的 Tushar:

    对延迟的回复表示歉意:

    MibSPI->DMACTRL 寄存器

    是的、您仍应配置 DMACTRL 寄存器。 即使使用软件触发的 DMA、此寄存器也:

    • 为 MibSPI 模块启用 DMA 功能
    • 指定通常会触发 DMA 请求的 FIFO 级别

    DMA 请求行编号

    对于软件触发的 DMA:

    • 由于您不使用硬件触发、因此无需连接 DMA 请求线路
    • DMA 传输将由软件命令而不是硬件事件启动
    • 在 DMA 通道配置中、您将触发模式设置为“SOFTWARE TRIGGER“(软件触发器)、而不是使用硬件触发线路

    --
    此致、
    Jagadish。

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

    感谢您的支持。