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] [参考译文] [常见问题解答] TMS570LC4357:如何将 DMA 用于 CAN 消息发送和接收?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1137909/faq-tms570lc4357-how-to-use-dma-for-can-message-transmit-and-receive

器件型号:TMS570LC4357

CAN 模块有三个报文接口寄存器:IF1、IF2和 IF3。 如何使 DMA 能够将消息传输到 IF2数据寄存器的 IF1和 IF3x 数据寄存器?

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

    CAN 模块有三个报文接口寄存器:IF1、IF2和 IF3。

    第一。 使用 IF3x 和 DMA 接收消息

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

    邮箱可被启用以实现自动 IF3更新。 如果使用消息 box1和 box2、则应设置 DCAN IF3UPD12的位0和位1。

    //消息框1,2配置为自动更新
    CANREG1->IF3UEy[0]= 0x00000003;

    应设置 IF3观察寄存器中的观察标志:
    CANREG1->IF3OBS = 0x18;  //读取数据 A & B - 8字节  

    DMA 数据包的源地址为: canREG1->IF3DATx[0]

    DMA 数据包的目的地址为:SRAM 中的存储器位置。  

    2。 使用 IF1x、IF2x 和 DMA 进行消息传输

    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 可以。