目录
3 HOH,HRH,HTH,Hardware Object之间的关系
Mailbox邮箱:
软件和硬件之间传递(接收/发送Message)报文的接口。其包含了所有跟Message报文有关的信息:标识符、数据、控制、状态和时间戳信息。
Hardware Object / HW Object硬件对象:
一个CAN Hardware Object被定义为CAN Hardware Unit / CAN controller的CAN RAM内的PDU buffer。Hardware Object被定义为CAN Hardware Unit的CAN RAM内的L-PDU buffer。一个Hardware Object包含若干个Message Buffer(MB);而Hareware Object与HRH/HTH是一一对应。
HOH:Hardware Object Handle硬件对象句柄:
用于发送 (HTH) 和用于接收 (HRH) 的hardware object handle (HOH) 表示对CAN mailbox(Hardware Object)结构的抽象引用,其中包含CAN相关参数,例如CanId、DLC 和Data。
CanIf使用两种类型的HOH来对Can Driver的访问:hardware transmit handle (HTH) 和hardware receive handle (HRH)。
HRH:Hardware Receive Handle硬件接收句柄:
HRH由CAN Driver定义和提供。每个HRH通常仅代表一个Hardware Object。HRH可用于优化software filter。HRH 应是一个引用CAN controller mailbox的一个logical Hardware Receive Object的Handle。
HTH:Hardware Transmit Handle硬件发送句柄:
HTH由CAN Driver定义和提供。每个HTH通常仅代表一个或多个配置为hardware transmit buffer pool的Hardware Object。HTH 应是一个引用CAN controller mailbox的一个logical Hardware Transmit Object的Handle。
Mailbox、Hardware Object、HOH、HRH、HTH之间的关系如下所示:
图 PDU Id和HOH之间的映射
注意:
Outlet range = 将通过的 Rx L-PDU 范围
Maibox = CAN RAM结构
HW Object = CAN RAM 结构,包含 (CanId,DLC,data)
HRH = 对 CAN RAM 结构的抽象引用
Transmit path为红色。
Receive path为绿色。
Mailbox由一组message buffer(MB)组成,这些Buffer存储配置,以及接收/发送的control data、time stamp时间戳、message ID和data的信息。而一个Hardware Object包含若干个message buffer(MB)。
有时也会Mailbox进行编号,通常和Hardware Object一一对应,当你在工具中配置Hardware Object时,其实就是在配置Mailbox。
在/Can/CanConfigSet/CanHardwareObjects/RX_HOH_FullCAN路径下的参数CanObjectId表示Mailbox Handle(也是HRH或HTH的Handle ID,此参数的值在给定的CAN Driver中是唯一的,它应该从 0开始并继续没有任何间隙)。
在L-PDU接收时,CAN Driver模块将调用CanIf模块的RX指示回调函数CanIf_RxIndication,参数Mailbox中带有ID,Hoh(HRH/参数CanObjectId),ControllerId,参数PduInfoPtr中的Data Length和指向L-SDU buffer的指针。
void CanIf_RxIndication( const Can_HwType* Mailbox, const PduInfoType* PduInfoPtr)
Name: | Can_HwType | ||
Type: | Structure | ||
Element: | Can_IdType | CanId | CAN L-PDU的Standard/Extended CAN ID |
Can_HwHandleType | Hoh | 对应Hardware Object Range的ID | |
uint8 | ControllerId | CanIf提供的ControllerId明确标识对应的controller | |
Description: | 这种类型定义了一个数据结构,它清楚地提供了一个HOH,包括其相应的CAN controller,因此还有CanDrv以及特定的CanId。 |
Name: | Can_HwHandleType | ||
Type: | uint8, uint16 | ||
Range: | Standard | -- | 0..0x0FF |
Extended | -- | 0..0xFFFF | |
Description: | 表示CAN Hardware Unit的HOH。对于具有超过255个Hardware Object的CAN Hardware Unit,使用扩展范围。 |
在L-PDU发送时,CanIf模块通过服务CanIf_Transmit()请求发送,调用CAN Driver模块的服务Can_Write(),将 TxPduId映射到对应的HTH(参数CanObjectId)。
Std_ReturnType Can_Write( Can_HwHandleType Hth, const Can_PduType* PduInfo)
CanIf模块不能直接访问硬件,独立于硬件,这允许从使用HOH实现上层(CanIf模块)与CAN controller进行透明且独立于硬件的访问。
用于发送 (HTH) 和用于接收 (HRH) 的hardware object handle (HOH) 表示对CAN mailbox(Hardware Object)结构的抽象引用(Hareware Object与HRH/HTH是一一对应),其中包含CAN相关参数,例如 CanId、DLC和Data。基于CAN hardware buffer abstraction,在CanIf中引用每个Hardware object,独立于CAN hardware buffer layout。HOH 在 Can Driver的接口服务调用中用作参数,由Can Driver的配置提供,并被Can Driver 用作 CAN mailbox(Hardware Object)的communication buffer的标识符。
将HTH和HRH分配给Hardware Object的示例
使用multiplexed transmission(多路复用发送)将HTH和HRH分配给Hardware Object的示例
将相同的HRH分配给多个Hardware Object的示例
在/CanIf/CanIfInitCfg/CanIfInitHohCfgs/CanIfInitHohCfg路径下的CanIfHrhCfgs和CanIfHthCfgs中,分别通过参数CanIfHrhIdSymRef和CanIfHthIdSymRef引用CanHardwareObjects中的Hardware Object。
注:在容器CanIfHthCfg和CanIfHrhCfg中派生的所有HOH。
而Hardware Object中通过参数CanObjectType指定该HardwareObject是用作Transmit Object还是Receive Object。
以S32K系列芯片为例。FlexCAN模块使用的Message Buffer(MB)结构如下图所示(下图64字节有效负载的示例)。CAN规范(2.0版B部分)中使用的扩展(29位标识符)和标准(11位标识符)帧均被表示。每个单独的MB由16、24、40或72个字节组成,具体取决于为消息有效负载分配的数据字节数:分别为8、16、32或64个数据字节。
Mailbox使用从0x80到0x27F的内存区域(512个Byte)。启用CAN FD时,每个MB的确切地址取决于其有效负载的大小。(有关FlexCAN内存分区,参见“【MCAL_CANDriver】-1.1-收发Hardware Buffer数量的限制以及基本概念梳理https://blog.csdn.net/qfmzhu/article/details/126731168”博文的第2.2章节)。
FlexCAN模块是一个CAN protocol engine,具有非常灵活的Mailbox系统,用于发送和接收CAN帧。对于经典CAN帧,支持通过FIFO和Mailbox同时接收。对于CAN FD帧,仅支持通过Mailbox接收。
获取更多“汽车电子资讯”和“工具链使用”,
请关注“汽车电子助手”,做您的好助手。