硬汉嵌入式论坛

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

[CAN/FDCAN] STM32H7的CAN FD外设发送RAM区:Tx event FIFO,Tx buffers,Tx Fifo和Tx queue

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2021-3-17 09:13:11 | 显示全部楼层 |阅读模式
整体框图:



通过使用Tx event  FIFO,CPU获得有关已发送元素的以下信息:
(1)元素传输的顺序.
(2)每个元素传输帧的本地时间。

FDCAN提供发送event FIFO。 该Tx event FIFO的使用是可选的。 FDCAN在CAN总线上传输了一个元素成功后,它可以将消息ID和时间戳存储在Tx event FIFO中元素。 Tx event  FIFO元素是一种数据结构,用于存储已传输消息。 Tx可以通过FDCAN_TXEFC寄存器配置事件FIFO(Tx事件FIFO配置)。 FIFO可以存储最多32个元素。下图显示了存储Tx事件FIFO元素的CAN消息RAM的示例EFSA [13:0]字段包含起始地址。



CAN消息RAM中的Tx事件FIFO元素的地址由以下公式确定:

Tx event FIFO element address = CAN_message_RAM_base_address + FDCAN_TXEFC.EFSA (startaddress) + FDCAN_TXEFS.EFGI (get index) x Tx_event_FIFO_element_size

为了将 Tx event链接到Tx event FIFO元素,将来自已发送Tx buffer的消息标记复制到Tx event FIFO 元素。

仅当Tx buffer元素中的EFC位(存储Tx事件)等于1时,事件才存储在Tx event FIFO中。当Tx event FIFO已满时,不会再有其他元素写入Tx event FIFO,直到至少有一个元素被写入为止。读出后,Tx event FIFO获取索引增加。如果在Tx event FIFO已满时发生Tx event,则这事件被丢弃。为避免Tx event FIFO溢出,可以使用Tx event FIFO水印。CPU从Tx event FIFO读取一个元素或元素序列后,CPU必须确认阅读。因此,它会通过FDCAN_TXEFA寄存器EFAI [4:0]字段写入从Tx event FIFO读取的最后一个元素的索引。

Tx buffer section

为了使外设传输元素,该元素在定义的存储空间内,并且传输开始。 传输的元素存储在Tx buffer中,用户可以选择使用的机制:专用的Tx buffer或Tx queue或Tx FIFO。FDCAN最多支持32个元素。 每个元素存储标识符,DLC,控制位(ESI,XTD,RTR,BRS,FDF),数据字段,位字段消息标记和事件FIFO控制位,仅一条消息。

在RAM上的分配按以下顺序进行:如果应用程序使用了专用的Tx buffer,则它们在Tx FIFO和Tx queue.之前分配。 用户只能在同一队列中选择Tx queue或Tx FIFO应用程序:FDCAN不支持它们的组合。

如下图所示,Tx buffer的起始地址是通过FDCAN_TXBC寄存器的TBSA [13:0]字段配置



如前一节所述,RAM中的分配是以动态且连续的方式进行的,因此,如果用户未配置Dedicated Tx buffer。 Tx buffer部分仅包含配置的Tx queue 或 Tx FIFO,并将其存储在起始段地址中。

Dedicated Tx buffers

专用Tx buffer的数量是通过FDCAN_TXBC寄存器中的NTDB [5:0]字段配置的。每个专用Tx buffer配置有特定的标识符,以仅存储一个元素。 传输是通过FDCAN_TXBAR寄存器的添加请求。 所请求的消息在外部进行仲裁的CAN总线上,并根据最低标识符(最高优先级)发送出去。专用Tx buffer的内存要求取决于Tx buffer元素的大小。Tx buffer元素大小定义了属于Tx buffer的数据字节数。使用以下公式计算CAN消息RAM中专用Tx缓冲区的地址:

Dedicated Tx buffer address = CAN_message_RAM_base_address + FDCAN_TXBC[TBSA] (start address)+ Tx_buffer_index x Tx_buffer_element_size

Tx buffer操作机制



如果多个专用Tx buffer配置了相同的ID,则具有第一个传输请求的Tx buffer首先发送。

Tx FIFO

通过将0写入FDCAN_TXBC中的TFQM位来配置Tx FIFO操作。元素存储在通过get索引中FDCAN_TXFQS的TFG1 [4:0]字段,从get索引引用的元素开始发送Tx FIFO。每次发送后,get索引都会循环递增,直到Tx FIFO缓冲区为空。Tx FIFO可以按照已将元素写入Tx FIFO的顺序传输元素。传输与各个标识符的优先级无关,因为FIFO首先发送出去。

FDCAN通过FDCAN_TXFQS中的TFFL [5:0]字段计算Tx FIFO缓冲区的空闲级别,作为get和put索引之间的差值(get和set索引之间有两种机制递增每个事务以指示下一个事务RAM上要读取或写入元素的缓冲区位置)。该值指示可用(空闲)Tx FIFO的数量元素。

必须从放置索引引用的Tx缓冲区开始,将新的发送元素通过FDCAN_TXFQS中的TFAQPI [4:0]字段指示写入Tx FIFO。CAN消息RAM中的下一个空闲Tx FIFO缓冲区的地址是使用以下公式计算的:

Next free Tx FIFO buffer address = CAN_message_RAM_base_address + FDCAN_TXBC.TBSA (startaddress) + FDCAN_TXFQS.TFQPI (put Index) x Tx_FIFO_element_size

Tx FIFO机制



Tx queue

通过将1写入FDCAN_TXBC中的TFQM位来配置Tx队列操作。 Tx中存储的元素从具有最低标识符(最高优先级)的Tx队列缓冲区开始传输队列。与专用Tx缓冲区相比,RAM上的位置是自动动态管理的,因此消息标识符不固定为预定义的Tx缓冲区索引。

新消息必须写入到放置索引引用的Tx队列缓冲区中。周期性添加请求将put索引递增到下一个空闲Tx队列缓冲区。FDCAN_TXFQS中的TFQF位设置为1表示Tx队列已满。在至少一个以下元素之前,不得将其他元素写入Tx队列中。发送请求的元素或取消挂起的传输请求。Tx队列缓冲区的内存要求取决于属于Tx队列的数据字节数元素。CAN消息RAM中下一个可用的空闲Tx队列缓冲区的地址可以通过以下方式计算:

Next free Tx queue buffer address = CAN_message_RAM_base_address + FDCAN_TXBC.TBSA (startaddress) + FDCAN_TXFQS.TFQPI (put index) x Tx_Buffer_element_size

Tx queue机制



dedicated Tx buffer, Tx FIFO and Tx queue的区别



灵活的传输配置

高效的FDCAN支持混合配置,以实现更大的传输灵活性并采取最佳措施,每种机制都有好处。 支持的混合配置是专用的Tx缓冲区+ Tx FIFO以及专用的Tx缓冲区+ Tx队列。

dedicated Tx buffers and Tx FIFO混合配置

可以使用混合配置来配置CAN消息RAM的Tx缓冲区部分,其中CAN消息RAM中的Tx缓冲区部分可细分为一组专用Tx缓冲区和一个Tx FIFO。专用Tx缓冲区的数量是通过FDCAN_TXBC中的NDTB [5:0]配置的。 Tx缓冲区的数量通过FDCAN_TXBC中的TFQS [5:0]配置分配给Tx FIFO的地址。

Tx处理程序使用activated transmission request 和the oldest pending扫描所有专用Tx缓冲区get索引引用的Tx FIFO缓冲区。 具有最低标识符的缓冲区将获得最高优先级,并且是接下来传送。下图说明了使用混合专用Tx缓冲区和Tx FIFO的用例



在此示例中,元素按以下顺序发送(假设所有专用Tx缓冲区请求已启用):

1. Tx buffer 3 (identifier = 1: it is the highest priority between all other dedicated Tx buffers and it has a higher priority than the oldest pending Tx FIFO: Tx buffer 7)
2. Tx buffer 0 (identifier = 3: it is the highest priority between all other dedicated Tx buffers and it has higher priority than the oldest pending Tx FIFO: Tx buffer 7)
3. Tx buffer 7 (because it is the oldest pending Tx FIFO with identifier =4 and has higher priority between all dedicated Tx buffers)
4. Tx buffer 8 (because it is the oldest pending Tx FIFO with identifier =2 and has the highest priority between all dedicated Tx buffers)
5. Tx buffer 4 (identifier = 8: it has the highest priority between all other dedicated Tx buffers and the Tx FIFO is empty)
6. Tx buffer 2 (identifier = 12: it has the highest priority between all other dedicated Tx buffers and the Tx FIFO is empty)
7. Tx buffer 1 (identifier = 15: it has the highest priority between all other dedicated Tx buffers and the Tx FIFO is empty)
8. Tx buffer 5 (because it is the only pending dedicated Tx buffer)

dedicated Tx buffers and Tx queue混合配置

可以使用混合配置来配置CAN消息RAM的Tx buffer,其中CAN消息RAM中的“ Tx缓冲区”部分可细分为一组专用Tx buffer和一个Tx queue。通过FDCAN_TXBC中的NDTB [5:0]配置专用Tx buffer的数量和Tx queue的数量缓冲区是通过FDCAN_TXBC中的TFQS [5:0]配置的。Tx处理程序扫描具有激活的传输请求的所有专用Tx缓冲区和Tx队列缓冲区。标识符最低的缓冲区获得最高优先级,然后发送。下图说明了使用混合专用Tx缓冲区和Tx队列的用例。



在此示例中,元素按以下顺序发送(假设所有专用Tx缓冲区请求已启用):
1. Tx buffer 3 (identifier = 1: it is the highest priority between all other dedicated Tx buffers and it has a higher priority than the oldest pending Tx FIFO: Tx buffer 7)
2. Tx buffer 0 (identifier = 3: it is the highest priority between all other dedicated Tx buffers and it has higher priority than the oldest pending Tx FIFO: Tx buffer 7)
3. Tx buffer 7 (because it is the oldest pending Tx FIFO with identifier =4 and has higher priority between all dedicated Tx buffers)
4. Tx buffer 8 (because it is the oldest pending Tx FIFO with identifier =2 and has the highest priority between all dedicated Tx buffers)
5. Tx buffer 4 (identifier = 8: it has the highest priority between all other dedicated Tx buffers and the Tx FIFO is empty)
6. Tx buffer 2 (identifier = 12: it has the highest priority between all other dedicated Tx buffers and the Tx FIFO is empty)
7. Tx buffer 1 (identifier = 15: it has the highest priority between all other dedicated Tx buffers and the Tx FIFO is empty)
8. Tx buffer 5 (because it is the only pending dedicated Tx buffer)


不支持带有Tx FIFO和Tx队列的混合配置。

dedicated buffer + Tx FIFO 和 Tx buffer + Tx queue的区别如下:



在Tx FIFO + Tx队列中,元素在“添加到RAM”操作之后立即变为挂起状态。



回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 10:52 , Processed in 0.155256 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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