CanTp
CAN接口模块(下文简“CanIf”)位于底层CAN驱动(CanDrv)、CAN收发器(CanTrcv)和上层通信服务层(CanSm、CanNm)、CAN传输协议(CanTp)、PDU路由器(PduR)之间。它表示上层通信层的CAN驱动程序服务接口。
CanTp是PduR和CANIf模块之间的模块,如图1所示。CANTp模块的主要作用是对CAN I-PDU进行分段和重新组装,使得I-PDU的长度不大于8个字节,对CAN FD而言,CAN I-PDU不大于64个字节。
PduR模块将AUTOSAR COM和 DCM的I-PDU部署到不同的通信协议上。通过I-PDU标识符路由到不同的网络系统类型(例如CAN、LIN和FlexRay)。PduR还决定是否必须使用传输协议。最后,在没有速率转换的情况下,实现网关功能。
CanIf提供了平等的机制来访问CAN总线通道,不管控制器芯片存在于内部还是外部。从CAN控制器的位置,提取ECU的硬件布局和CAN驱动器的数量。因为CanTp只处理传输协议帧(即SF、FF、CF和FC PDU),根据N-PDU ID, CANIf必须将I-PDU转发给CanTp或PduR,图1中也展示得也很清晰。根据AUTOSAR BSW架构,CanTp提供以下服务:
- 数据在传输方向的分割;
- 按接收方向重新组装数据;
- 控制数据流;
- 检测错误分割会议。
- 传输取消
- 接受取消
AUTOSAR决定将BSW模块规范建立在现有标准的基础上,所以,AUTOSAR CAN传输层规范是基于汽车领域最常用的国际标准ISO15765。ISO 15765描述了两个适用的CAN传输层规范:OEM增强型诊断:采用ISO 15765-2;OBD诊断:采用ISO15765-4。
虽然CAN传输协议主要用于车辆诊断系统,但它也被开发用于处理来自其他基于CAN的需要传输层协议系统的需求。
CanTp模块提供用于分割、流控传输和消息重新组装的服务。它的主要目的是发送和接收可能适合也可能不适合一个CAN帧的消息。不适合一个CAN帧的消息被分割成多个部分,这样每个部分都可以在一个CAN帧中传输。
连接和相互关系
在AUTOSAR架构中,传输协议将用于传输诊断(例如OBD和UDS协议)和AUTOSAR COMI-PDU。因此,CanTp模块能够同时处理多个连接,即多个分段并行会话。同时连接的最大数量通过静态配置实现。这种配置对生成的代码的复杂性和资源消耗(CPU、ROM和RAM)有重要的影响,因为资源必须为并发访问保留,例如Rx和Tx状态机,用于处理N-PCI数据的变量等。
为了可以同时接收或发送I-PDU,每个N-SDU标识符将通过配置好的CanTp”连接通道“进行内部路由。由于“连接通道”不能从外部访问,所有传输N-SDU所需的信息都将链接到的N-SDU标识符,比如“连接通道”号、超时、寻址格式等。根据元数据配置,N-SDU可以作为定义N_AI的特定连接,也可以作为通用连接,其中N_TA、N_SA和N_AE在运行时不同,而N_TAtype、MType和寻址格式是静态定义的。AUTOSAR通信栈支持周期模式和事件触发模式。因此,每个通信层都可以通过不同的机制接收来自下层的信息,并将信息传播到上层。
对于CANTp层,只支持事件触发模式。
为了优化通信栈,AUTOSAR限制了CANTp的缓冲能力。因此,CanTp将N-SDU有效载荷直接从上层(DCM、COM或PDUR在1:1 TP路由的情况下)复制到CAN驱动程序,反之亦然。为了保证数据的一致性,上层会遵循以下规则:
- 在传输时,从发送请求到收到发送确认,N-SDU数据的有效载荷将保持不变;
- 在接收时,从接收开始到接收指示被接收,N-SDU数据访问将被锁定。
在运行时,CAN传输模块必须具有管理传输连接所需的所有信息。因此,应该静态配置以下属性:
- CAN N-SDU的数目
- 每个CAN N-SDU的唯一标识符
- 每个CAN的通信方向N-SDU (Tx或Rx)
- 每个连接的寻址格式(普通、扩展、混合11位、普通固定或混合29位),根据寻址格式,另外:对于使用带有元数据的N-SDU的通用连接,可以省略静态寻址信息。
- Normal:none
- Extended:N_TA
- Mixed 11 bit:N_AE
- Normal fixed:N_TA, N_SA
- Mixed 29 bit:N_TA, N_SA, N_AE
- 每个连接的寻址格式(普通、扩展或混合),如果是扩展寻址格式,则为N_TA值,如果是混合寻址格式,则为N_AE值。
关联的CAN L-SDU标识符,每个CAN N-SDU标识符,如果需要(多帧分割会话),CAN L-SDU标识符用于传输CAN FC N-PDU经典CAN帧和CAN FD帧
帧类型
CanTp提供四种帧类型对网络层数据进行解析。分别是单帧(Signle Frame),首帧(Frist Frame),连续帧(Consecutive Frame),流控帧(Flow Control)。
为上层提供的服务
CAN传输层使用PDUR的回调函数来复制传输数据,确认传输,发起接收,复制接收到的数据,指示接收到的消息,关键函数如下:
PduR_CanTpRxIndication()
PduR_CanTpStartOfReception ()
PduR_CanTpCopyRxData ()
PduR_CanTpCopyTxData ()
PduR_CanTpTxConfirmation()
CanTp模块的服务接口主要分为两大类:
初始化和关机
通信服务
CANTp模块有两个内部状态:CANTP_OFF和CANTP_ON。
如图6中,下电后CANTp为CANTP_OFF状态,在该状态下,允许更新CANTp的配置。CANTp通过CanTp_Init()成功初始化后,状态切换到CANTP_ON。只有在CANTP_ON的状态下,可以对CAN I-PDU进行分段和重新组装。CanTp_Init()将对模块的所有全局变量进行初始化,并将所有传输协议连接设置为CANTP_ON的子状态,在这个子状态(状态为CANTP_RX_WAIT和CANTP_TX_WAIT)中,分段传输和分段接收都处于进行中。
如果启用了CanTp模块的开发故障检测,则在调用CanTp_Init函数之前,当PDUR或CAN接口层尝试使用任何函数(CanTp_GetVersionInfo除外)时,CanTp模块将引发一个错误(CANTP_E_UNINIT)。如果全局状态是CANTP_ON,CanTp模块会被调用,CanTp_Init会返回默认状态(状态= CANTP_ON,但是传输和接收正在进行中)。如果在CanTp模块处于全局状态CANTP_ON时调用CanTp_Init,则CanTp模块将释放所有当前连接。函数CanTp_Shutdown将正常停止CanTp模块。
为上层提供的服务
CAN传输层使用PDUR的回调函数来复制传输数据,确认传输,发起接收,复制接收到的数据,指示接收到的消息,关键函数如下:
PduR_CanTpRxIndication()
PduR_CanTpStartOfReception ()
PduR_CanTpCopyRxData ()
PduR_CanTpCopyTxData ()
PduR_CanTpTxConfirmation()
CanTp模块的服务接口主要分为两大类:
初始化和关机
通信服务
CANTp模块有两个内部状态:CANTP_OFF和CANTP_ON。
如图6中,下电后CANTp为CANTP_OFF状态,在该状态下,允许更新CANTp的配置。CANTp通过CanTp_Init()成功初始化后,状态切换到CANTP_ON。只有在CANTP_ON的状态下,可以对CAN I-PDU进行分段和重新组装。CanTp_Init()将对模块的所有全局变量进行初始化,并将所有传输协议连接设置为CANTP_ON的子状态,在这个子状态(状态为CANTP_RX_WAIT和CANTP_TX_WAIT)中,分段传输和分段接收都处于进行中。
如果启用了CanTp模块的开发故障检测,则在调用CanTp_Init函数之前,当PDUR或CAN接口层尝试使用任何函数(CanTp_GetVersionInfo除外)时,CanTp模块将引发一个错误(CANTP_E_UNINIT)。如果全局状态是CANTP_ON,CanTp模块会被调用,CanTp_Init会返回默认状态(状态= CANTP_ON,但是传输和接收正在进行中)。如果在CanTp模块处于全局状态CANTP_ON时调用CanTp_Init,则CanTp模块将释放所有当前连接。函数CanTp_Shutdown将正常停止CanTp模块。
传输操作cantp_transmission()将允许上层使用CAN传输协议(分段、扩展地址格式等)请求数据传输。函数cantp_transmission()是异步的。接收到发送请求后,如果N-SDU传输完成(成功或失败),CanTp模块会通知到上层。
当然,CANTp允许上层取消正在进行的传输。比如,由于要接收其他更高优先级的诊断协议,CANTp可以取消诊断传输。这一特性通过静态配置参数CanTpTc来**。发送取消通过调用cantp_canceltransmission()函数来触发。在调用服务cantp_canceltransmission()之后,该连接上的传输将被中止。需要注意的是,PduR_CanTpTxConfirmation()函数在E_NOT_OK值时,传输将被取消。
为下层提供的服务
CAN传输层使用CAN接口的以下服务来传输CAN N-PDUs:
CanIf_Transmit ()
根据通信栈的AUTOSAR规范,CAN传输层向CAN接口提供以下两个回调函数:CanTp_TxConfirmation()和CanTp_RxIndication()。
发送确认
CanIf模块调用传输确认函数,通知CAN传输层CanTp请求的CAN帧传输是否成功执行。L-PDU标识符与调用相关联,以便识别相应的传输。当超过最大时间(等于N_As)没有收到发送确认时,CanTp模块将中止相应的会话。在收到TxConfirmation之前,N-PDU对于其他并发会话仍然不可用,不管成功与否。对于确认调用,CanTp模块应提供函数CanTp_TxConfirmation()。当使用结果E_NOT_OK调用CanTp_TxConfirmation()时,CanTp将中止corrensponding会话。
接收指示
CanIf模块调用接收指示函数,通知CanTp模块接收到新的CAN N-PDU帧(即传输协议帧)。接收指示可以根据CanIf配置在中断服务(ISR)中执行。对于接收指示,CanTp模块应提供cantp_rxspecification()。
CAN传输层的内部操作,为了实现”在单个CAN帧或多个CAN帧中传输消息“的目标,提供了基本的机制来执行。CAN传输层的整个行为将被事件触发,这样CanTp就可以直接处理来自PDUR N-SDU的传输。当接收到SF或FF N-PDU时,CanTp模块使用PduR_CanTpStartOfReception函数通知上层PDUR接收。上层将预留并锁定一个缓冲区来接收N-SDU。CanTp使用PduR_CanTpStartOfReception()的参数TpSduInfoPtr向PduR提供FF/SF的内容。接收到的数据链路层数据长度(RX_DL)由CAN帧PDU(CAN_DL)的第一个有效载荷长度派生而来,具体:
- 对于小于或等于8字节的CAN_DL值,RX_DL值应该是8。
- 对于大于8字节的CAN_DL值,RX_DL值等于CAN_DL值。
总结:CanTp是AUTOSAR通信栈中负责网络解析的模块。从上到下,CANTp负责对CAN I-PDU进行分段和重新组装;从下到上,负责接收CanIf层传输的N-PDU数据解析成I-PDU数据,并传递给PDUR模块。CanTp只处理传输协议帧,即单帧,首帧,连续帧,流控帧。同时,CANTp层,只支持事件触发模式。
CanIf
CanIf提供了独特的接口来管理不同CAN硬件,如CAN控制器和CAN收发器。同时,基于物理CAN通道相关的CAN状态管理器模块(CanSm)可以控制多个底层内部和外部的CAN控制器或CAN收发器。CanIf由与CAN硬件无关的任务组成,属于ECU CAN通信驱动程序。CanIf满足PduR和AUTOSAR COM栈上层通信模块的控制流和数据流要求:发送请求处理、发送确认、接收指示、错误通知和CAN控制器的启动/停止,从而唤醒或参与网络。它的数据处理和通知API基于CAN L-SDU,用于控制和模式处理的API提供了CAN控制器相关的视图。
在发送请求时,CanIf用相应的参数完成L-PDU的传输,并通过对应CanDrv将CAN L-PDU转发给CAN控制器。在接收端,CanIf将接收到的I-PDU作为I-SDU分发到上层模块。接收L-SDU和上层之间的分配是静态配置的。在传输确认时,CanIf负责向上层发送传输成功的信息。CanIf提供对CAN驱动程序的通信抽象访问和CAN收发驱动程序服务,用于对CAN网络的控制和监视。CAN接口将CAN状态管理器的状态向下转发到底层CAN驱动程序,向上CAN接口模块将CAN驱动程序或CAN收发器驱动程序传递到相应的NM模块。
上层
AUTOSAR BSW分层架构中,CanIf的上层可以是PduR,可以是CanNm,可以CanTp,可以CanSm,EcuM或复杂的驱动模块CDD,普遍标定协议模块XCP,全局时间同步模块CanTSyn,J1939传输层模块J1939Tp和J1939网络管理模块J1939Nm。CanIf使用的API由通知服务组成,它们将CAN相关数据传输到目标上层。这些服务的调用参数指向CanDrv中的缓冲信息,或者直接指向CAN硬件。另外,CanIf支持对总线镜像模块的调出,来报告接收和传输帧的内容。EcuM会初始化CanIf。
下层
CanIf的下层模块主要是CAN驱动程序CanDrv。由于CanIf在AUTOSAR BSW架构中的地位,它与CanDrv有着密切的关系。CanDrv只提供对CAN控制器的硬件抽象访问,但是CanDrv会检测和处理CAN控制器的事件,并将这些事件通知到CanIf。CanIf将CanSm的操作模式请求传递给相应的底层CAN控制器。
CanDrv提供了标准化的L-PDU,以确保CanIf的硬件独立性。指向这个规范化的L-PDU的指针要么指向一个临时缓冲区,要么指向依赖于CAN硬件的CanDrv。CanDrv调用的回调服务是在CanIf中声明和实现的。由CanIf调用的回调服务被声明并放置在对应的上层通信服务层中,如PduR、CanNm、CanTp。配置的CAN控制器的数量不一定是使用的CAN收发器的数量。如果多个不同类型的CAN控制器在同一个CAN网络上运行,一个CAN收发器是足够的,但是根据CAN控制器设备的类型,需要一个或两个不同的CanDrv。第二个可用的底层CAN设备驱动程序是CAN收发器CanTrcv。每个CanTrcv对CAN收发器进行操作模式的控制。CanIf只是将几个底层CanTrcv的API映射到一个惟一的API,因此,CanSm能够触发相应CAN收发模式的转换。CanIf中不执行属于CanTrcv所控制的功能。CanIf将所有底层CanTrcv的下列服务映射到一个惟一的接口:
- 唯一的CanTrcv模式请求和读取服务来管理每个底层CAN收发设备的操作模式;
- 为CAN收发器读取服务,唤醒原因支持;
- 模式请求服务启用、禁用、清除唤醒事件状态使用的每个CAN收发器(CanIf_SetTrcvMode)。