工具与软件:
RX FIFO 和 RX 缓冲区之间的区别以及如何从它们读取 MCAN 消息。
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.
工具与软件:
RX FIFO 和 RX 缓冲区之间的区别以及如何从它们读取 MCAN 消息。
Rx FIFO 0/1:
Rx FIFO 为用户提供2个独立的 FIFO。 我们可以选择它们来放置传入的 CAN 消息。 例如、设计人员可能希望所有11位 ID 消息都进入 Rx FIFO 0、但所有29位 ID 消息都进入 Rx FIFO 1。 另一个示例是所有低优先级的消息都发送到 Rx FIFO 1、所有高优先级消息发送到 Rx FIFO 0。 对如何使用这些 FIFO 没有限制、也没有必须对两者进行配置的要求。 只有 Rx FIFO 0或 Rx FIFO 1是可以接受的。
每个 Rx FIFO 元素都包含一个8字节标头、其中包含接收到的 ID、数据长度代码(DLC)和许多诊断标志(例如是否使用了 CAN FD 或是否启用了比特率切换)。 此标头中还包含一个时间戳、使设计人员能够知道数据包的接收时间。 在8字节标头之后、有来自传入消息的数据、最高可达 Rx FIFO 配置寄存器中所述的最大允许数据大小。 如果 DLC 大于配置寄存器中描述的最大数据大小、则数据将被截断、并且超过最大数据大小的内容将丢失。 如果 DLC 小于允许的最大数据大小、则设计人员不得假定 DLC 所述大小之后的任何数据都有效。 MCAN 控制器不清除数据字段。 例如、如果 Rx FIFO 配置为允许最多8个字节、但 DLC 为7个字节、则存储器中数据的最后一个字节不会自动清除、不应使用。 它将包含由前一个 CAN 消息写入的最后一个值。
2.从 Rx FIFO 读取 CAN 报文
要从 MCAN FIFO 读取消息、可将该过程分解为以下步骤
1.确定新消息的位置(Rx FIFO 0、Rx FIFO 1或 Rx 缓冲器)
2.根据新消息的缓冲区位置、确定缓冲区索引以及要从 MCAN RAM 中读取的起始地址
3.阅读 MCAN RAM 以检索消息
4.确认读取新消息以释放新消息的 FIFO 元素
由于新消息是在 Rx 缓冲区中还是在 Rx FIFO 中、处理过程会略有不同。 FIFO 要求 CPU 读取 FIFO 状态寄存器、该寄存器指示 FIFO 中有多少条新消息以及开始读取的索引。 缓冲区要求 CPU 读取新消息寄存器、该寄存器告诉 CPU 哪些缓冲区中有未读消息。 在每次读取结束时、CPU 必须让 MCAN 控制器 知道已收到新消息以释放 FIFO 元素。
Rx 缓冲器
Rx 缓冲区使设计人员能够将某些 CAN 消息放入缓冲区中。 这些缓冲区包含 Rx FIFO 的相同8字节标头、数据位于标头之后。 唯一的区别是这些缓冲器的运行方式与 FIFO 不同。 SID 或 XID 过滤器元素必须明确告知 MCAN 控制器传入的消息必须发送到 Rx 缓冲区的哪个目标。 这也意味着如果一个新数据包匹配并且过滤器指示它被移动到 Rx 缓冲区中、该缓冲区中已经有未读数据、则缓冲区中的数据会被覆盖。
4.从 Rx 缓冲器读取 CAN 消息
从 Rx 缓冲器读取消息的过程与从 Rx FIFO 读取消息的过程类似。 区别在于、用于地址计算的 Rx 缓冲区索引来自新数据1/2寄存器、而不是 Rx FIFO 0/1状态寄存器。