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.

[参考译文] TMS570LS0714:将 DMA 用于 CAN1 Tx

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1001542/tms570ls0714-using-dma-for-can1-tx

器件型号:TMS570LS0714

我想我是否以及如何使用 DMA 在 CAN1上进行多缓冲区自动发送。  我不确定如何设置它、如果可能(以及它是否会加快速度)。

我不理解的第一件事是 、可以设置一个 DMA 通道、以便在单个或多个 CAN 消息框/不同消息 ID 上发送。 ...? 目视:

[包含具有不同 CAN ID 的消息的缓冲器]-->   DMA 单通道-->  CAN1。

即使使用相同的消息框, 我也不知道如何在这里使用 DMA,因为我需要根据 DCAN API 更新消息 ID _evas_单个消息,这种方式使目的无法实现。
而且、如果我必须将每条消息传递到不同的消息框、似乎是相同/或更糟糕的。 与该 CAN 接口进行交互感到尴尬、或者我不了解如何将其与 DMA 配合使用。
(这里是否有一个带有 DMA 的直接 CAN RAM 模式、它可以直接传输到 DCAN1存储器而无需使用命令寄存器...?)

如何设置它、这样您就不必中断缓冲区中的每个 CAN 消息、而只需在所有消息都发送时中断一次?

请输入任何良好的示例代码。

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

    您好、v01d、

    我建议使用 IF3进行 DMA 传输。  IF3寄存器组可以用接收到的报文对象自动更新、而无需由 CPU 启动从报文 RAM 的传输。 IF3的这个特性的目的是为 DMA 提供一个接口来高效读取数据包。

    我稍后将为您组织一个示例。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="45190" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1001542/tms570ls0714-using-dma-for-can1-tx/3700242 #3700242"]可以使用收到的消息自动更新

    请注意、 我请求的是 TX、_sending、not receiving。  

    当然,任何例子都是值得赞赏的。

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

    好的、IF3不能用于将数据传输到报文对象中。

    随附的示例是 DCAN 使用 DMA 接收数据。 根据消息 ID、接收到的数据被传输到 RAM 中的不同位置。 您可以将此示例用作参考。

    e2e.ti.com/.../TMS570LS0914PZ_5F00_DCAN_5F00_IF3_5F00_DMA.zip

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

    感谢您再次与我讨论此内容,我非常感谢您的讲解以及示例代码。

    那么、您的答复是否意味着、原则上不可能使用 DMA 来进行 Tx/将数据自动(磁力)传输到消息对象中。?

    (我似乎不明白,我想,这种设置没有什么好处,或者。 ?)

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

    只有 IF3 可以用接收到的报文对象自动更新、而无需 CPU 启动从报文 RAM 的传输。  

    要发送数据、应使用 IF1或 IF2、并且从 IF1/2寄存器到消息 RAM 的传输由 CPU 启动。

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

    好的、所以这是不可能 的(奇数)。

    您能否澄清此注释(与 DMA 无关):

    这在 CAN 消息传输中。 部分。

    那么、是否可以为 比如说10个 TX 对象填入数据、 并触发它们的传输_once、那么 DCAN 随后按顺序传输它们呢? (较高到较低的优先级/较低到较高的数字)。

    和、仅生成一个 Tx 完成中断。   

    似乎也不能设置它。 我可以预填充所有对象、但 传输首先停止 、然后我设置为传输。  

    编辑:实际上这一点也不清楚:

    这是否意味着,您可以通过某种方式将多条消息配置为一个消息对象。 ?

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

    2.如果多个发送报文应分配给一个报文对象、则在请求发送该报文之前必须配置整个报文对象。

    您可以使用一个消息对象或一个邮箱来传输具有不同数据长度和不同消息 ID 的消息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="426815" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1001542/tms570ls0714-using-dma-for-can1-tx/3704437 #3704437"]那么,是否可以为 10个 TX 对象填入数据 ,并触发其传输_once,以便 DCAN 按顺序传输所有数据?

    是的、这是可能的。 当 CAN 总线处于忙状态时、您可以通过 IF1或 IF2将10条消息传输到消息 RAM 中的10个消息对象、并且 所有消息的 TxRqst 都已置位。 在 CAN 总线空闲前、所有10条消息都将处于待处理状态。 CAN 总线变为空闲状态后、优先级最高的报文(最低的报文编号)将被首先发送。 编号最小的报文对象具有最高的优先级。  

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

    我现在已经详细检查了您的示例。  

    好的、很抱歉、但必须根据手册提出以下问题:

    。 数据表:

    所以... 我也应该能够使用 IF1/2 。 ? 我是说有通道、甚至 CNTRL 通道也允许我选择 IF1/2来触发 DMA

    我不明白,这些只是为了乐趣吗?  为什么我仅限于用于接收 (CAN 上的 RX)的 IF3 _and_。 ?

    现在已尝试在发送时设置 IF2 DMA 中断、我没有收到任何内容-无 DMA 中断...   

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

    这是我尝试设置在 DCAN1 IF2上获取 DMA 中断-用于传输通道、即 从 IF2到对象。

         g_dmaCTRL g_dmaCTRLPKT;
        
        dmaReqAssign(DMA_CH8, 8);
    
        g_dmaCTRLPKT.SADD      = (uint32)(&dumm_msg.data);              /* source address             */
        g_dmaCTRLPKT.DADD      = (uint32)(&canREG1->IF1DATx[0]);              /* destination  address       */
        g_dmaCTRLPKT.CHCTRL    = 0;                 /* channel control            */
        g_dmaCTRLPKT.FRCNT     = 1;                 /* frame count                */
        g_dmaCTRLPKT.ELCNT     = 1;             /* element count              */
        g_dmaCTRLPKT.ELDOFFSET = 0;                 /* element destination offset */
        g_dmaCTRLPKT.ELSOFFSET = 0;                 /* element source offset      */
        g_dmaCTRLPKT.FRDOFFSET = 0;                 /* frame destination offset   */
        g_dmaCTRLPKT.FRSOFFSET = 0;                 /* frame source offset        */
        g_dmaCTRLPKT.PORTASGN  = 4;                 /* port b                     */
        g_dmaCTRLPKT.RDSIZE    = ACCESS_64_BIT;     /* read size                  */
        g_dmaCTRLPKT.WRSIZE    = ACCESS_64_BIT;     /* write size                 */
        g_dmaCTRLPKT.TTYPE     = FRAME_TRANSFER ;   /* transfer type              */
        g_dmaCTRLPKT.ADDMODERD = ADDR_FIXED;        /* address mode read          */
        g_dmaCTRLPKT.ADDMODEWR = ADDR_FIXED;        /* address mode write         */
        g_dmaCTRLPKT.AUTOINIT  = AUTOINIT_OFF;      /* autoinit                   */
    
    
        /* - setting dma control packets for transmit */
        dmaSetCtrlPacket(DMA_CH8,g_dmaCTRLPKT);
    
        dmaSetChEnable(DMA_CH8, DMA_HW);    // <--- If i just use DMA_SW trigger, then I get one interrupt in,  but that's of no use
    
        /* Just set them all .. I want to get _ANY at this stage .. */
        dmaEnableInterrupt(DMA_CH8, FTC);
        dmaEnableInterrupt(DMA_CH8, BTC);
        dmaEnableInterrupt(DMA_CH8, LFS);
        dmaEnableInterrupt(DMA_CH8, HBC);
    
        dmaEnable();
    
        canREG1->CTL |= 0x41U;
        canREG1->CTL |= (1 << 18U);
        canREG1->CTL &= ~(uint32)(0x41U);
    
        while(1)
        {
           canTransmit(canREG1, 1U, &dummy_msg);
           vTaskDelay(10);
        }
        

    当消息被发送时,我确实会得到 canMessageNotification()回调,但如果我使用上述硬件触发器,我不会得到任何 dmaGroupANotification()。  (如果我使用一次软件触发器进行测试、我确实会获得该 ISR)。

    有什么想法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="45190" url="~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1001542/tms570ls0714-using-dma-for-can1-tx/3704590 #3704590">是的,这是可能的。 当 CAN 总线处于忙状态时、您可以通过 IF1或 IF2将10条消息传输到消息 RAM 中的10个消息对象、并且 所有消息的 TxRqst 都已置位。 在 CAN 总线空闲前、所有10条消息都将处于待处理状态。 CAN 总线变为空闲状态后、优先级最高的报文(最低的报文编号)将被首先发送。 编号最小的报文对象具有最高的优先级。  [/报价]

    也就是说,似乎不是我所要求的。  您在上面所描述的基本上就是 ,您只需按顺序将 canTransmit()传送到一系列 mbox。  

    我想知道您是否可以预先填充它们、然后只使用_One_call 触发、将它们全部发送出去 (不使用 IF1/2 N 次来触发 SEND!)  

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

    您好!

    我们可以通过 IF1或 IF2预先填充消息框、而无需设置 TxRqst。  要开始传输、 应用必须通过 IF1或 IF2设置 TxRqst。

    我不知道如何触发多个消息框以仅通过一个呼叫进行传输。  

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

    您好 

    非常感谢您再次回复。   

    我认为我几乎都很喜欢使用外设、至少我认为我主要了解外设的设计方式。

    我能不能再问您、作为这个线程的最后一个问题、再次帮助我解决 DMA 问题。

    如果您在上面看到、我在手册中看到、所有 IFx - 1、2和3 -可被用作 DMA 的触发器。 至少器件系列的手册中有说明。 特定器件的数据表也是如此- 07x、09x、122x 我有所有列表 IF1、2、3具有 DMA 通道触发器的选项。  

    但我无法使 IF2作为发送(不接收、注释)的设置来触发 DMA 设置(请参阅上一篇文章)。

    缺少什么?   

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

    您发布的代码是针对 IF1而不是 IF2

      G_dmaCTRLPKT.DADD   =(uint32)(&canREG1->IF1DATx[0]);   

    对于 CAN1 IF2、使用 DMA 请求线路6 (DMAREQ[6]): dmaReqAssign (DMA_CH8、6);

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

    这是因为没有工作、所以我尝试了 IF1和 IF2。 我什么都没有、任何地方都没有 DAM 中断。

    我将仔细检查并再次检查。

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

    您好!

    您是否解决了 CAN DMA 问题?

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

    不抱歉、仍需要使用 DMA 重试

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

    好的、那么您的示例是 IF3、现在这是可以的、因为我将设置_ANI_ CAN DMA 以使其正常工作。

    我已经下载了您的项目、它会编译、但它绝对不会勾选-不会生成中断、CPU 只停留在  

      /* Wait for the DMA interrupt ISR to set the Flag */
        while(DMA_Comp_Flag != 0x5555AAAA);

    无 CAN、无 DMA 通知... 因此、您可能忘记添加一些内容。  Havn'et 对此进行了调试

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

    我已经修改了您的示例、使其在不回送和使用 IF3的情况下工作。

    现在、我让 DMA 只通过 IF3工作、而对于 Rx -这是它的设计初衷。

    关闭主题、如果我需要 IF1/2、我将打开新主题。

    谢谢你