硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5823|回复: 2
收起左侧

[CAN/FDCAN] STM32H7的CAN FD外设接收RAM区:Rx FIFO 0,Rx FIFO 1和Rx buffer

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107050
QQ
发表于 2021-3-17 09:10:37 | 显示全部楼层 |阅读模式

整体分配:




Rx FIFO 0和Rx FIFO 1
可以在CAN消息RAM中配置两个Rx FIFO。 每个Rx FIFO部分最多可存储64个元素。每个元素存储在一个Rx FIFO元素中。可以通过FDCAN_RXESC寄存器分别为每个Rx FIFO配置Rx FIFO元素的大小。
Rx FIFO元素大小定义了可以存储一个接收元素的数据字段字节数。 一个大小Rx FIFO元素由前面RAM管理中指定的公式定义。

标头信息包含标识符,DLC字段,控制位和位字段(过滤器索引,可接受的不匹配帧,Rx时间戳)。通过FDCAN_RXESC寄存器中的F1DS [2:0]字段配置元素大小后,Rx FIFO 1的元素个数和起始地址必须分别通过FDCAN_RXF1C寄存器中的F1S [6:0]和F1SA [13:0]进行配置。下图显示了CAN消息RAM上的Rx FIFO部分,其中包含可以支持和每个部分的开始地址。



Rx FIFO的起始地址是第一个Rx FIFO元素的第一个字的地址。收到的元素通过匹配过滤的数据将根据匹配的过滤器元素存储在适当的Rx FIFO中。如果Rx FIFO已满,则可以根据两种不同模式来处理新到达的元素:

(1)阻塞模式:这是Rx FIFO的默认操作模式,没有其他元素写入RxFIFO,直到至少一个元素已被读出。
(2)覆盖模式:Rx FIFO中接受的新元素将覆盖Rx FIFO中最旧(最先接收的数据)的元素并且FIFO的put和get索引加1。

要从Rx FIFO读取元素,CPU必须执行以下步骤:

(1)读取寄存器FDCAN_RXF1S以了解Rx FIFO的状态。
(2)按照以下公式计算RAM中最旧的元素的地址:

Oldest element address = CAN_message_RAM_base_address + FDCAN_RXF1C.F1SA (start address) + FDCAN_RXF1S.F1GI (get Index) x Rx FIFO_element_size.

(3)从计算出的地址中读取元素。

CPU从Rx FIFO读取一个元素或一系列元素后,它必须确认读取。确认后,FDCAN可以将相应的Rx FIFO缓冲区重新用于新元素。为了确认一个或多个元素,则CPU必须将从Rx FIFO读取的最后一个元素的缓冲区索引写入FDCAN_RXF1A寄存器。结果,FDCAN更新了FIFO填充级别和get索引。

RX FIFO流程:



Rx FIFO 0和Rx FIFO 1具有相同的寄存器,它们的名称有意义,方法是更改每次的FIFO数量。

专用的Rx buffer

FDCAN支持多达64个专用Rx buffers。 每个专用的Rx buffers可以存储一个元素。专用Rx buffers的大小可以通过FDCAN_RXESC寄存器进行配置。 Rx buffers大小定义可以存储多少个接收元素的数据字段字节。 专用Rx buffers的大小由前面RAM组织中描述的公式定义。

通过FDCAN_RXESC寄存器中的RBDS [2:0]字段配置元素大小后,启动必须通过FDCAN_RXBC寄存器中的RBSA [13:0]字段配置地址。下图显示了CAN消息RAM上的Rx buffers部分,其中有可以支持的最大数量的Rx buffers元素和起始地址。



当将元素存储在专用Rx缓冲区中时,FDCAN通过FDCAN_IR寄存器的DRX位设置中断标志以及新数据标志FDCAN_NDAT1或FDCAN_NDAT2寄存器中的相应位。当FDCAN_NDAT1 / 2中的位置1时,相应的Rx缓冲区将被锁定(不会被新元素覆盖),并且相应的过滤器不匹配。 读取元素后,CPU必须将相应的位复位FDCAN_NDAT1 / 2,以解锁相应的Rx缓冲区。

要从专用Rx缓冲区读取元素,CPU必须执行以下步骤:
(1)检查FDCAN_NDAT1 / 2中的位,以了解是否有新元素到达专用Rx缓冲区。
(2)计算CAN消息RAM中元素的地址,如以下公式所示:

Reference Rx buffer address = CAN_message_RAM_base_address + FDCAN_RXBC.RBSA (startaddress) + dedicated Rx buffer index x Rx_Buffer_element_size.

(3)从计算出的地址中读取消息。

过滤器元素可以引用Rx缓冲区索引(0到63)作为接收元素的目的地。如果相应的过滤器匹配,则FDCAN仅执行对引用的Rx缓冲区位置的写操作。 换一种说法,FDCAN不会写入未引用的Rx缓冲区位置。


举例 :Rx缓冲区编号与Rx缓冲区索引的相关配置示例

为了配置过滤器元素以引用Rx缓冲区索引60,必须至少配置61个Rx缓冲区。注意:用户必须选择最佳配置,以避免浪费RAM。下图显示了简化Rx缓冲区操作的流程图



Rx FIFO和专用Rx buffer的不同

如前面所述,FDCAN具有两种机制:专用Rx buffer或Rx FIFO 0/1可以将配置为存储接收到的元素。下表描述了专用Rx缓冲区和Rx FIFO之间的差异。




回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
发表于 2023-11-29 09:44:44 | 显示全部楼层
硬汉哥,您好!想请问一下,一个CAN通讯接收端是否可以配置FIFO0和FIFO1同时进行接收数据
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107050
QQ
 楼主| 发表于 2023-11-29 10:40:54 | 显示全部楼层
如来德lz 发表于 2023-11-29 09:44
硬汉哥,您好!想请问一下,一个CAN通讯接收端是否可以配置FIFO0和FIFO1同时进行接收数据

可以,通过ID过滤设置到不同FIFO里面
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 08:40 , Processed in 0.203948 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表