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.

[参考译文] RM48L952:DMA 通道连接问题

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1158853/rm48l952-dma-channel-chaining-issues

器件型号:RM48L952

大家好、感谢大家始终回答我的问题。
今天、我想问您一个与 DMA 通道链接相关的问题。 由于 DMA 中的帧位数限制、我的代码尝试使用2个 DMA 通道接收71K 字节的 CAN 数据。 但是、如果没有 DMA 通道链接、当第一个 DMA 的 BTC 中断触发第二个 DMA 时、最后复制的数据也会复制到第二个 DMA。 因此我编写了代码、以便第二个 DMA 可以在使用 DMA 通道链接的第一个 DMA 副本之后复制。 然而、尽管使用了 DMA 通道链接、当我运行代码时、我看到第一个 DMA 和第二个 DMA 同时从第一个数据触发。 我想问我是否使用了 DMA 通道链接错误、或者我的代码是否错误。
谢谢阅读。 祝你度过美好的一天!
下面的第一个文件是发送代码。 第二个文件是接收代码。

e2e.ti.com/.../20220921_5F00_CPU_5F00_HMI_5F00_CAN1.zip

e2e.ti.com/.../20220922_5F00_CPU_5F00_HMI_5F00_CAN2.zip

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

    您好!

    我收到了您的问题、我正在处理另一个紧急请求、并将尽快为您调查此问题。  

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

    您好!

    在代码中、DMA_CH0用于将数据从 IF3x 数据寄存器传输到 SRAM 中的 buffer0、而 DMA_CH1用于将数据从 IF3x 数据寄存器传输到 SRAM 中的 buffer1。 当 IF3x 更新完成时、CH0和 CH1的 DMA 请求自动生成。

    在代码中、CH1链接到 CH0、并在 CH0传输完成时触发。

    DMA_CH1是否使用两个触发器?

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

    一项建议:

    可以使用64位来表示读取/写入数据大小:

    G_dmaCTRLPKT_RX1.RDSIZE = ACCESS_64_BIT;//读取 크기
    G_dmaCTRPKT_RX1.WRSIZE = ACCESS_64_BIT;//写入 크기

    G_dmaCTRLPKT_RX1.ELCNT = 1;//요소 수
    G_dmaCTRLPKT_RX1.ELDOFFSET = 0;//목적지 요소 오프셋 μ s
    G_dmaCTRLPKT_RX1.ELSOFFSET = 0;//시작 요소 오프셋
    G_dmaCTRLPPKT_RX1.FRDOFFSET = 0;//목적지 프레임 오프셋
    G_dmaCTRLPKT_RX1.FRSOFFSET = 0;//시작 프레임 오프셋 μ s
    G_dmaCTRLPKT_RX1.PORTASGN = 4;//端口 B 编号

    G_dmaCTRLPKT_RX1.tType = FRAME_TRANSFSION;//전송 타입
    G_dmaCTRPKT_RX1.ADDMODERD = ADDR_FIXED;//读取 오프셋
    G_dmaCTRPKT_RX1.ADDMODEWR = ADDR_INC1;//写入 오프셋

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

    大家好、我上面发布的代码用于使用通道链接触发 CH1。 在上一个测试中、当 CH1由 CH0的 BTC 中断触发而没有通道链接时、最后一个 IF3 DAT 中剩余的数据与触发同时被复制。 但这不是我想要的行为、因此我尝试使用通道链接。 不过、我认为 CH1会在 CH0之后通过通道链接触发、但当 IF3 DAT 更新时、CH0和 CH1会同时触发、因此它不会按我的需要工作。 我不确定我使用的是频道链接错误还是我编写了错误的代码、因此我不知道如何修复、所以我在论坛上发布了一个问题。

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

    如果 IF3更新完成、则会生成 DMA 请求。 如果 DMA 通道1未分配给 DMA 请求线路#4,则不会触发 DMA 传输。

    我注意到了这一点

    dmaReqAssign (DMA_CH1、4);已在代码中注释掉

    因此、DMA_CH1不应由 IF3x DMA 请求触发。  

    我没有机会测试它。

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

    在 TI 提供的示例中、当执行 DMA 通道链接时、只有第一个链的 DMA 与请求线链接、而其他链不与请求线链接。
    我需要的操作是 CH0结束该操作、然后 CH1操作下一个传入数据。 但是、如果执行上述代码、当接收到数据时、CH0和 CH1会同时复制相同的数据。
    我想问在 CH0完成复制后如何从下一个数据复制 CH1。

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

    我将在今天晚些时候进行测试

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

    您好!

    我遇到了相同的问题。 DMA CH1和 CH0同时被触发。 我将执行更多测试来确定问题的原因。

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

    您好!

    在 DMA 通道链中、链通道根据第一个 DMA 通道的类型进行触发。

    如果第一个 DMA 通道是帧类型、那么在每个帧完成后、它将触发对链接的 DMA 通道的请求。  

    如果第一个 DMA 通道是块类型、则链通道将在 第一个通道的一个块传输完成后被触发。

    我认为使用 DMA 通道链接不是解决您的问题的办法。

    您可以启动 DMA CH1传输、也可以在 DMA BTC ISR 中触发 DMA CH2传输。

    void dmaGroupA 通知(dmaInterrupt_t inttype、uint32通道)

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

    您好!
    如文章所述、如果通道2由通道1的 BTC 中断触发、则 IF3 Datx 的其余数据会立即复制到通道2。 我希望在触发通道2后复制下一个接收到的数据。 有什么解决方案?

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

    您好!

    我想提出一个建议,我没有测试的设置,但尝试一下下面的东西  

     请勿在初始化后立即调用 CH1的 dmaSetChEnable、请注释该行

    在 CH0的 BTC 中断中调用该行、如下所示

    如果我们这样做、CH1将仅在 CH-0完成后激活、它是块传输。

    --

    谢谢、此致、

    Jagadish。

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

    实际上、它是帧传输、而不是块传输。 对于块传输、每个块只有一个 DMA 请求。