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:针对 DCAN RX over DMA 的错误处理

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1102710/rm48l952-error-handling-for-dcan-rx-over-dma

器件型号:RM48L952

您好!

当 IF1/IF2寄存器与 CAN 中断一起使用时 、会检查 CANREG1->INT 寄存 器的值是否为0x8000U。  

相反、当带有 DMA 中断的 IF3寄存器为 uDES 时、如何正确检查错误。  我只有 IF3MSK、IF3ARB、IF3MCTL 和 IF3DATx 寄存器中的值由 DMA 存储。

此致、Eduard

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

    IF3x 产生的错误也将触发错误中断、ES 寄存器中的标志位将被置位、并且 int0ID 将被置位为0x8000。

    IF3x 读取的状态由 IF3OBS 寄存器中的状态标志观察。

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

    如何将 DMA 配置为将  ES 寄存 器和 int0ID 与 IF3MSK、IF3ARB、IF3MCTL 和 IF3DATx 寄存器一起存储?

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

    您好、Eduard、

    为什么要通过 DMA 将数据从 IF3ARB、IF3MSK 和 IF3MCTL 以及 ES 寄存器传输到系统存储器? 通常、我们使用 DMA 将数据从 IF3DATx 传输到系统存储器、状态寄存器由 CPU 检查。  

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

    我必须将消息 ID 或错误传输到更高级别的软件。 我想使用 DMA 而不是 CAN 中断的原因是接收报文的顺序有问题。 如此处所述: e2e.ti.com/.../dcan-fifo-reading-while-receiving

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

    因此、我想通过 DMA 将消息传输到缓冲器、并从计时器中断中的缓冲器中读取它们

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

    我是否遗漏了重要的内容?

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

    好的、很高兴了解您的想法。  您可以为 IF3ARB、IF3MSK、IF3MCTL、DCAN ES 和 DCAN INT 使用单独的 DMA 通道。

     DCAN ES 和 DCAN INT 的 DMA 传输必须由软件触发。  

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

    使用 单独 的 DMA 通道有哪些优势?  

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

    DCAN ES 为0x4 (偏移量)、DCAN INT 为0x10、IF3xMSK/ARM/MCTL/DATA/DataB 为0x144、0x148、0x14C、0x150、0x154。 如果使用一个 DMA 通道、如何将这些寄存器地址映射到 DMA 配置(源地址、偏移量等)?

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

    也许我理解 RM57微控制器的勘误表错误、但我认为为了避免接收消息顺序问题、应该使用 DMA 而不是 CAN 中断。所以我禁用了 CAN 中断、只启用了 IF3寄存器的 DMA 传输。  您能否向我发送一个示例代码来解决 接收消息订单问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521653" URL"~μ C/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum1102710/rm48l952-error-handling for-dca-rx-over-dma/4099815#4099815"]您是否可以发送 报价单代码来解决问题[?]

    "消息顺序问题"是什么意思? RM48L952是一款小端字节序器件、不存在字节序问题。  

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

    RM57也 是一个小端字节序器件、它有 一个针对芯片修订版本 B 的勘误表条目: DCAN FIFO 模式期间、接收到的消息可能会在 FIFO 缓冲器中按顺序放置

    我在使用 RM48时遇到同样的问题。 我收到100条 ID 相同的消息、有时消息顺序 不正确。 通常、两条后续消息按相反顺序放置在存储器中。 当我使用 IF1和 IF2寄存器时会发生这种情况。  

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

    您好、Eduard、

    勘误表仅适用于在 DCAN FIFO 模式下运行的 RM57。 是否使用 FIFO 模式?

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

    是的

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

    我看不到将 FIFO 模式用于 IF3x 接口的优势。 如前所述、当一个报文对象在接收到一个 CAN 报文后被更新时、IF3x 可以自动接收来自报文 RAM 的控制数据和用户数据、并且自动产生 DMA 请求来将数据从设置为 SRAM 中缓冲区的 IF3x 寄存器传输到该缓冲区。  CPU 不需要启动从消息 RAM 到 IF3寄存器组的传输。

    对于 FIFO 模式、CPU 必须启动从消息 RAM 中的 FIFO 到 IF3寄存器组的传输、并手动触发 DMA 以将数据从 IF3x 寄存器传输到 SRAM 中的缓冲区。  

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

    关于 FIFO 模式、让我添加更多注释:

    FIFO 可用于 RX 数据帧和 TX 数据帧。 由于远程帧不包含数据字段、因此 FIFO 不用于远程帧、但用于远程帧的接收对象可以使用 FIFO 缓冲区。

    FIFO 模式允许您接收一组 ID 相同(或在过滤后 ID 相同)的帧、并且仅在最后一个帧进入时向 CPU 生成中断。 设置具有相同标识符和掩码的邮箱块。 例如、如果在此组中需要接收的最大字节为64、则使用相同的标识符和掩码配置8个邮箱。 例如、让我们使用邮箱1-8。 前7个(1-7)将 EOB (缓冲区末尾)设置为0、并将 RxIE (接收中断使能)设置为0。 在第八个邮箱中、将 EOB 设置为1、将 RxIE 设置为1。

    现在、假设其中一个节点需要发送24个字节。 它发送前两个帧 EOB=0、第三个帧 EOB=1。 前两个帧结束在邮箱1和2中、第三个帧结束在邮箱8中并生成一个中断。 在邮箱8的中断例程中、由于您知道它是 FIFO 的末尾、因此您开始从邮箱1读取。 在读取每个邮箱时、必须检查 NewDat 位。 当您单击邮箱3时、NewDat = 0、因此您现在可以跳到邮箱8并从组中读取最后一个帧。

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

    当其中一个节点需要发送24个字节时、它如何在消息中指示 EOB 标志的值?  

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

    通常情况下、FIFO 缓冲区用于存储接收到的具有特定 ID 的消息。 为什么要将 FIFO 用于 TX 消息?

    每个报文对象可以存储8个字节的数据。 24字节数据需要3个消息对象、因此应设置第3个对象的 EOB。

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

    接收、而不是发送时出现问题。 我使用  FIFO 发送 RX 消息。 不适用于 特定 ID、而适用于任何 ID。  我事先不知道 ID。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="521653" URL"μ C/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum1102710/rm48l952-error-handling-for-dCAN-Rx-over-dma/410644#41064644]'当其中一个节点需要发送 EOB 24字节的消息时、它会指示该节点的值是如何发送 EOB?  [/报价]

    我认为您正在使用 FIFO 进行传输。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521653" url="~/support/microcontrollers/arm-based microcontrollers-group/arm-based microcontrollers/f/arm-based microcontrollers-forum/1102710/rm48l952-error-handling for-dcan-rx-over-dma/4107753#4107753"]不适用于 特定 ID/ID[,但引用任何 ID。]

    如前所述 、FIFO 模式允许您接收一组具有相同 ID 的帧、并且仅在最后一个帧进入时向 CPU 生成中断。 FIFO 或报文对象不接受具有不同报文 ID 的帧。