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:具有 DMA 的发送 DCAN

Guru**** 2390755 points
Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1421839/tms570lc4357-transmit-dcan-with-dma

器件型号:TMS570LC4357

工具与软件:

您好!

我设法借助 TMS570LC4357微控制器上的 DMA 通过 IF3接收 CAN 数据。

但我正在尝试使用 DMA 通过 CAN 上的 IF1/IF2传输数据。 在本例中、我看到 DMA 无法正常工作。

我在您的一些论坛资源中看到有评论说、IF1/IF2寄存器处于"特权模式"、而 DMA 处于"用户模式"、因此它们不适合发送数据。

您能回答以下问题吗:
1 -我在附件中提供的参考文档中、寄存器中是否有用于将 IF1/IF2位与 DMA 配合使用的相应位? 当我设置它们时会出现什么行为?
此外、从​​附件中给出的表达式"高速邮箱访问- DMA 对消息 RAM 的访问"我应该理解什么?
数据不是使用 DMA 通过 CAN 传输吗?
如果未执行数据传输、"CAN 控制器寄存器中的 DE1/DE2位"有什么作用?
5-什么是 IF1/IF2 CMD 寄存器上的"DMA 激活"的用法?
CAN IF1/IF2数据寄存器有特权模式注释、但当我检查寄存器时、发现它只显示"受 BUSY 位保护"。 在这种情况下、当它为零时、我是否不能将 IF1/IF2繁忙位与 DMA 一起使用?

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

    如果通过 DCAN CTL 寄存器中的 DE1位启用了 DCAN1 IF1 DMA 请求、则会触发 DCAN1 IF1 DMA 请求;另外、在 DCAN IF1CMD 寄存器中、需要设置 DMA 激活位。 然后需要触发来自/到 IF1和消息 RAM 的传输。 传输完成后、将会触发 DMA 请求。  

    通过将消息编号写入 IF1CMD 寄存器来手动触发 DCAN1 IF1与消息 RAM 之间的传输。

    Unknown 说:
    2-另外、我应该从​​附件中给出的"高速邮箱访问- DMA 对消息 RAM"的表述中理解什么?

    否、在正常操作模式下、CPU 和 DMA 无法访问消息 RAM。  

    但可以由 CPU 和 DMA 直接在测试模式下访问。

    Unknown 说:
    3-数据不是通过 CAN 和 DMA 传输?

    从器件 TRM 中、DMA 支持用于器件存储器和 IFx 数据寄存器之间的数据传输。 但我还没有针对 IF1和 IF2尝试过 DMA。

    [报价 userid="571459" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1421839/tms570lc4357-transmit-dcan-with-dma "]在 IF1/IF2 CMD 寄存器中"DMA 激活"的用法是什么?[/QUOT]

    它用于在 IFx 和消息 RAM 之间的传输完成后启用 DMA 请求。

    [报价 userid="571459" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1421839/tms570lc4357-transmit-dcan-with-dma ]6-对 CAN IF1/IF2数据寄存器有特权模式注释、但是当我检查寄存器时、发现它只显示"受忙位保护"。 在这种情况下、当 IF1/IF2繁忙位为零时、我是否不能将它与 DMA 一起使用?[/QUOT]

    您是否尝试过在用户模式和 BUSY=0下使用 SW 触发将数据传输到 IFx 数据寄存器?

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

    我尝试了你说的,然后问你的问题。 但我没有得到任何结果。

    我在你回答后再次尝试。 步骤按以下顺序进行:
    我在 CAN 1上为 IF1 DMA 请求设置"DE1"位。
    2 -我执行了 DMA 设置。
    我检查了 IF1忙位。
    4 -我将 IF1 CMD 设置为写入数据寄存器(0x87)。
    5 -我在您回答后使用了 DMA 软件触发器。
    6-我在 CAN1上设置 IF1 CMD 寄存器中的"DMA 运行"位。
    我在 IF1 CMD 中输入了消息编号。

    当我执行上述步骤时、我可以将系统存储器中的数据作为1帧写入 IF1DATAx 寄存器。 例如、当我想在单个触发条件下连续发送4-5帧时、我每次都必须重复步骤3至7。 因此我需要在 IF1 CMD 上重新输入消息编号。

    但是、根据我对 TRM 的理解、当我在 IF1和消息 RAM 之间手动触发1并设置"DMA Active"位时、由于 DMA 硬件、我预计具有相同消息编号的其余帧将无需任何触发即可完成(当我想同时发送4个帧时)。

    此外、我可以使用 DMA 软件触发将数据写入 IF1DATAx 记录、但使用 DMA 硬件触发时甚至无法写入1个帧。 我是否能够通过硬件触发来写入可以在软件上访问的记录?

    当我通过在 IF1和消息 RAM 之间以1个帧传输数据来触发 DMA 时、我应该怎么做才能使用 DMA 发送我想要发送的剩余帧(我想一次发送4个帧)?

    你能为我创建一个算法吗?

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

    我只是尝试了同样的方法。 我也不能使 DMA 在 IF1x 上工作。  

    /*启用 CTL 寄存器中的 DE1位以在 IF1接收到数据时触发 DMA */
    canREG1->CTL |=(1U << 18U);

    /*-将 DMA 通道设置为在 h/w 请求时触发*/
    dmaSetChEnable (DMA_CH0、DMA_HW);

    dmaReqAssign (DMA_CH0、DMA_REQ8);//DMA 请求 DCAN1 IF1

    dmaEnable();

    /*等待 IF1准备好使用*/
    while ((canREG1->IF1STAT & 0x80U)=0x80U)

    }/*等待*/

    /**-为配置 IF1
    *-消息方向-写入
    *-数据更新
    *-开始传输
    */
    canREG1->IF1CMD = 0x87U;

    canREG1->IF1DATx[0]= 0xa8;//手动写入第一个数据


    /*设置 DMA 活动位*/
    canREG1->IF1STAT =(1 << 6);  

    /*将 TX 数据复制到消息框1 */
    canREG1->IF1NO =(uint8) 0x1; //DMA 活动位清零

    /*设置 DMA 活动位*/
    canREG1->IF1STAT =(1 << 6);

    /*将 TX 数据复制到消息框1 */
    canREG1->IF1NO =(uint8) 0x1;

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

    为 DCAN IF1/IF2使用 DMA 没有太大好处、因为您必须手动将消息编号编程到 IFCMD 寄存器以触发从 IF1/IF2寄存器到消息 RAM 的消息复制、并在每个 DMA 周期手动设置 DMA 活动位。

    请使用 CPU 而不是 DMA 向 IFxDAT 寄存器写入数据。 很抱歉 DMA 在 IF1/IF2上不工作。

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

    我理解。 感谢您的回答。

    嗯、我看到 DMA 是由您共享的示例代码中的硬件触发的。
    您是否通过硬件触发它?

    我无法由硬件触发它。 我仅通过软件触发 DMA。

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

    是的、DMA 通道0配置为由硬件触发。 DMA 通道0被映射到请求线路8、即 DCAN1 IF1 (在数据表中定义)。  

    我无法使 DMA 使用共享代码。  

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

    您好!

    我尝试了我们在 TRM 和论坛上讨论的所有内容。

    因此、在通过 CAN 在 IF1/IF2上使用 DMA 执行数据传输时、我借助 DMA 软件得以通过软件触发 DMA。 我设法将数据作为8个字节写入 IF1/IF2数据寄存器。

    但我无法使用 DMA 硬件触发。 如果我通过 CCS 上的 REGISTER 选项卡设置 IF1/IF2 CMD 寄存器上的"DMA Active"位、则会触发 DMA 硬件并将数据写入 DMA IF1/IF2数据寄存器。 当我在软件上设置"DMA Active"位时、不会发生 DMA 硬件触发。 "DMA 活动"位保持置位状态、直到我再次访问 IF1/IF2寄存器。

    我的问题:
    如果我通过 CCS 的"Registers"选项卡设置用于 DMA 硬件触发的"DMA Active"位、为什么在软件中设置"DMA Active"位时不会发生 DMA 硬件触发?

    我正在对此进行调查以得出结论。 如有必要、您能否共享包括 DMA 板在内的详细代码示例? 我需要详细说明。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="571459" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1421839/tms570lc4357-transmit-dcan-with-dma/5464397 #5464397"]如果我通过 CCS 的"register"选项卡在 IF1/IF2 CMD 寄存器上设置"DMA Active"位、则触发 DMA 硬件并将数据写入 DMA IF1/IF2数据寄存器。[/QUOT]

    请注意、您可以通过 CCS 寄存器面板使 DMA_HW 触发有效。  

    您能否分享包括 DMA 板在内的详细代码示例?

    我没有任何工作代码。

    我期待再次收到您的好消息!