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.
您好!
当 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 传输。 您能否向我发送一个示例代码来解决 接收消息订单问题?
"消息顺序问题"是什么意思? 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。
我认为您正在使用 FIFO 进行传输。
如前所述 、FIFO 模式允许您接收一组具有相同 ID 的帧、并且仅在最后一个帧进入时向 CPU 生成中断。 FIFO 或报文对象不接受具有不同报文 ID 的帧。