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.

[FAQ] [参考译文] [常见问题解答] TMS570LS3137:具有 DMA 的 TMS570LS3137 MibSPI5 Tx 和 Rx

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/922498/faq-tms570ls3137-tms570ls3137-mibspi5-tx-and-rx-with-dma

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

您好!

我正在尝试配置 MibSPI、它可以与 DMA 配合使用、从而实现内部回送以简化调试。  我修改了 HALCoGen 示例'example_mibspidma.c'通过设置 MibSPI5、我还添加了用于 SPI 接收的 DMA 通道(DMA_CH1)、以便将接收到的消息直接从 DMA 复制到 RX_DATA 缓冲器中以减少 CPU 开销、但它不起作用。

从 TX_DATA 到 mibspiRAM5->TX[](由 DMA_CH0提供)的传输缓冲区是正确的、但接收错误、只有第一个值(uint16)是从 mibspiRAM5->rx[]编译到 RX_DATA 缓冲区。

为 Tx 和 Rx 配置 DMA 控制数据包堆栈似乎正确、 我还尝试启用中断以进行调试、并且它工作正常。

在下面、我附加测试项目的源代码和屏幕截图、其中我突出显示了 RX_DATA 缓冲器。  

谢谢、Davide Battistoli

e2e.ti.com/.../3617.testDMA.zip

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

    您好 Davide、

    RXDMA_MapX:是连接到 MibSPI DMA 通道的 RX 路径的物理 DMA 请求线路的编号->下面表6-41中以蓝色圆圈表示的编号

    TXDMA_MapX:是连接到 MibSPI DMA 通道 TX 路径的物理 DMA 请求线路的编号->下面表6-41中以蓝色圆圈表示的编号

    TMS570LC43x 上的 DMA 模块有48个硬件 DMA 请求(上表6-41中的最后一列)

    例如、在 DMA 配置中、请将 DMA 请求分配给 DMA 通道0和通道1

     dmaReqAssign (DMA_CH0、DMA_REQ6);  //DMA 硬件请求行6 -- RX  (最后一个列、表6-41)

    dmaReqAssign (DMA_CH1、DMA_REQ7);  //DMA 硬件请求行7 -- RX  (最后一个列、表6-41)

    请在   mibspiDmaConfig()函数中使用 TXDMA_MapX、RXDMA_MapX:例如:

    mibspiDmaConfig (mibspiREG5、TG0、3、2);

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

    您好 、QJ Wang、  

    我使用的是 TMS570LS3137而不是 TMS570LC43x,但我认为 DMA 模块与 MibSPI 的工作方式相同。

    我按照您的说明修改了我的测试程序、 但相同的 RX_DATA 缓冲器仅接收第一个值。  

    此外、我不清楚 MibSPI5的 TX 和 Rx 通道(读取用户手册)是什么、值2还是3? 还是漠不关心? 在缓冲模式下使用 SPI 时、因为在标准 SPI 模式下、它不是真实的、如手册中所述。

    测试项目是否存在其他问题?

    我附加修改后的代码源。

    e2e.ti.com/.../2783.2_2D00_testDMA.zip

    感谢您的支持

    Davide

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

    mibspiDmaConfig (mibspi_t * mibspi、uint32通道、uint32 txchannel、uint32 rxchannel)

    mibspiDmaConfig (mibspiREG5、TG0、3、2);

    3 (txChannel)为 TXDMA_MapX

    2 (rxChannel)是 RXDMA_MapX

    每个 MibSPI 有16个 DMA 请求线路、您可以为 TX 和 RX 选择任意一个。 这个 DMA 请求线路的数量是 MibSPI5[x]后括号内的数字。  

    如果您为 TX 选择 MibSPI5[10]、则必须将 DMAREQ[22](最后一列)分配给这个 DMA 通道(代码中使用了 DMA_CH0)

    如果您为 RX 选择 MibSPI5[15]、则必须将 DMAREQ[29]分配给这个 DMA 通道(您的示例中使用了 DMA_CH1)

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

    我绘制了一个简单的图来显示这些映射:

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

    您好 QJ、
    我了解如何映射 DMA 通道、正确的 DMA 配置为:

    dmaReqAssign (DMA_CH0、DMA_REQ6);
    dmaReqAssign (DMA_CH1、DMA_REQ7);
    mibspiDmaConfig (mibspiREG5、TG_0、2、3);

    dmaReqAssign (DMA_CH0、DMA_REQ7);
    dmaReqAssign (DMA_CH1、DMA_REQ6);
    mibspiDmaConfig (mibspiREG5、TG_0、3、2);

    通过按以下方式配置 Contro 数据包:

    txDmaConfigCtrlPacket ((UINT32)(&TX_DATA)、(INT32U)(&(mibSpiRAM->TX[0].data))、16);//大小 TX_DATA[16]
    /*-设置 DMA 控制数据包*/
    setCtrlPacket (dma_ch0、g_dmaCTRLPKT);
    rxDmaConfigCtrlPacket ((uint32)(&(mibSpiRAM->Rx[0].data))、(uint32)(&RX_DATA)、16);//大小 RX_DATA[16]
    /*-设置 DMA 控制数据包*/
    setCtrlPacket (dma_ch1、g_dmaCTRLPKT);

    另一个重要的事情是,我没有正确地将'bufid'值设置到 mibspiDmaConfig()函数中

    uint32 bufid =(16-1); //缓冲区大小-1

    此外、我使用 FTC 中断来捕获最后一帧的结束。

    现在、DMA 使用缓冲模式与 MibSPI5正确工作。 我使用的是评估板
    其中 MibSPI5上连接了4个 ADC、每250微秒(由中断定时器管理)就会定期从4个 ADC 正确接收数据。

    我大大降低了 CPU 开销。


    谢谢、此致、
    Davide