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 硬件触发器的 CAN 通信的数据传输问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1136545/rm48l952-faq-data-transmission-problem-of-can-communication-using-dma-hw-trigger

器件型号:RM48L952

大家好、感谢大家始终回答我的问题。
今天、我想再次询问我上次询问的 DMA 硬件触发器。 在我的代码中、我还启用了 IF1 CMD 的 DMA 活动、并启用了 CAN CTL 的 DE1以应用硬件触发器、但 DMA 不起作用。
我不确定如何利用 HW 触发器将传输数据复制到 TX 缓冲区。
感谢你能抽出时间。 以下是我的代码。

e2e.ti.com/.../20220427_5F00_CAN2-_2800_2_2900_.zip

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

    您好!

    在 IF1寄存器和消息 RAM 之间的传输完成后、DMA 被请求。  DMA 请求在第一次读取或写入其中一个 IF1/IF2寄存器之前一直保持有效。  当 DMA 激活为1时、写入报文编号(位[7:0])是一个异常。

    由于 DMA 活动位的自动复位特性、必须为每个后续 DMA 周期单独设置该位。

    在写入函数 UINT32 canTransmit_DMA ()中的 IF1NO 部分之前、您能否尝试设置"DMA Active"位:

    canREG1->IF1NO =(uint8) canMESSAGE_BOX1;//CAN 통신으로 TX 数据 송신
    返回0;

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

    正如您说过的、我修改了代码、但 DMA 没有复制数据。 也许 DMA 活动位不会作为 DMA 触发器将数据从源地址复制到目的地址。 如果这个问题得到解决、数据似乎可以使用硬件触发器进行传输、但是 DMA 不会被触发。

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

    e2e.ti.com/.../20220923_5F00_DMA_5F00_HW_5F00_CAN.zip

    我将使用我再次编写的硬件触发器向您发送 CAN 通信代码。

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

    您好!

    我正在运行测试、明天会回来。

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

    您好!

    我意识到 IF1/IF2不适合 DMA 操作。 也许需要在 TRM 中进行一些澄清来列出将 DMA 与 DCAN 一起使用的限制。

    如果您转到 DCAN IF1DATA 和 IF1DATB 寄存器说明、这些寄存器受写保护、这意味着它们只能在特权模式下写入。 但是、DMA 被设计成始终在用户模式下运行。 因此、DMA 永远不能写入这些 DCAN 寄存器。 当一个写入从 DMA 发生时、DCAN 将只忽略这些写入。

    即使在用户模式下这些寄存器是可写的、使用 DMA 将数据传输到 IF1/2寄存器也没有任何优势。 首先、有效载荷仅为8字节。 您本可以相当快地将存储多个(STM)指令写入 IF1DATA/IF1DATB 寄存器、而不是使用 DMA 来设置通道、并等待 DMA 在传输完成时中断 CPU。 其次、DMA 不知道何时允许它写入寄存器。 在写入 IFX 寄存器之前、您需要轮询 BUSY 位以了解 IFX 和消息 RAM 之间的传输是否正在进行。 DMA 没有此类功能。 只有 CPU 可以。