目录
关键词
嵌入式、C语言、autosar、OS、BSW
平台说明
项目 | Value |
---|---|
OS | autosar OS |
autosar厂商 | vector , EB |
芯片厂商 | TI 英飞凌 |
编程语言 | C,C++ |
编译器 | HighTec (GCC) |
autosar版本 | 4.3.1 |
一、知识储备
1.ISO 14229
2.ISO15765
3.CAN 协议
1.1 交互接口
二、缩写对照表
PDU SDU PCI 见 [AutoSar]BSW_Com02 PDU详解
项目 | 描述 |
---|---|
CAN N-SDU Info Structure | 这是一个CAN传输层内部常量结构,包含特定的CAN传输层信息,用于处理相关CAN N-SDU的传输、接收、分段和重组 |
CAN NSduId | 在CAN传输层中唯一的SDU标识符。用来引用N-SDU的路由属性。因此,为了通过其API与CAN传输层交互,上层使用CAN NSduId来引用CAN N-SDU信息结构。 |
BS | Block Size |
Can | CAN Driver module |
CAN CF | CAN Consecutive Frame N-PDU |
CAN FC | CAN Flow Control N-PDU |
CAN FF | CAN First Frame N-PDU |
CAN SF | CAN Single Frame N-PDU |
DLC | Data Length Code (part of CAN PDU that describes the SDU length) |
FIM | Function Inhibition Manager |
Mtype | Message Type (possible value: diagnostics, remote diagnostics) |
N_AI | Network Address Information (see ISO 15765-2). |
N_Ar | Time for transmission of the CAN frame (any N-PDU) on the receiver side (see ISO 15765-2). |
N_As | Time for transmission of the CAN frame (any N-PDU) on the sender side (see ISO 15765-2). |
N_Br | Time until transmission of the next flow control N-PDU (see ISO 15765-2). |
N_Bs | Time until reception of the next flow control N-PDU (see ISO 15765-2). |
N_Cr | Time until reception of the next consecutive frame N-PDU (see ISO 15765-2). |
N_Cs | Time until transmission of the next consecutive frame N-PDU (see ISO 15765-2). |
N_Data | Data information of the transport layer |
N_PCI | Protocol Control Information of the transport layer |
N_SA | Network Source Address (see ISO 15765-2). |
N_TA | Network Target Address (see ISO 15765-2). It might already contain the N_TAtype(physical/function) in case of ExtendedAddressing. |
N_AE | Network address extend |
N_TAtype | Network Target Address type (see ISO 15765-2). |
FS | Flow Status |
CAN FD | CAN flexible data rate |
CAN_DL | CAN frame data length |
TX_DL | Transmit data link layer data length |
RX_DL | Received data link layer data length |
SF_DL | SingleFrame data length in bytes |
CTS | ClearToSend status (FC(CTS)) |
三、CAN TP 所在架构位置
服务层
四、CAN TP 的主要作用
CANTp模块的主要作用是对CAN I-PDU进行分段和重新组装,使得I-PDU的长度不大于8个字节,对CAN FD而言,CAN I-PDU不大于64个字节。
CanTp只处理传输协议帧(即SF, FF, CF和FC pdu),根据N-PDU ID, CAN接口必须将I-PDU转发给CanTp或PduR。
根据AUTOSAR BSW架构,CanTp提供以下服务:
1.发送数据的时候把长帧拆分。
2.接收数据的时候组帧。
3.控制数据流;
4.检查组帧拆帧错误。
5.取消发送。
6.取消接收。
五、CAN TP 在 autosar 架构中的基本概念
在AUTOSAR架构的最终版本中,传输协议设施将用于传输诊断(例如OBD和UDS协议)和AUTOSAR COM i - 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和寻址格式是静态定义的。
5.1、CAN TP 的处理模式
AUTOSAR通信栈支持轮询和事件触发模式。因此,每个通信层都可以从其下层接收信息,并通过不同的机制向其上层传播信息。
但是:对于CAN传输层(CAN TP),只支持事件触发模式。
5.2 数据一致性
为了优化通信栈,AUTOSAR限制了CAN传输层缓冲容量。因此,CanTp将N-SDU负载直接从上层(DCM、COM或PDU路由器——在1:1 TP路由的情况下)复制到CAN驱动程序,反之亦然。因此,为了保证数据的一致性,上层将遵循以下规则:
在传输的时候,N-SDU数据payload将保持不变,直到发送请求到收到发送确认。
在接收的时候,N-SDU将被锁定无法访问,直到 RX indication 被收到
5.3 静态配置
在运行时,CAN传输模块必须具有管理传输连接所需的所有信息。因此,应该静态配置以下属性:
1.CAN N-SDU个数。
2.每个CAN N-SDU的唯一标识符。
3.每个CAN N-SDU的通信方向(Tx或Rx)。
4.每个通道的通信类型:半双工或全双工。
5.每个连接的寻址格式(普通、扩展、混合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
6.每个连接的寻址格式(普通、扩展或混合),如果是扩展寻址格式,则为N_TA值,如果是混合寻址格式,则为N_AE值。
7.每个CAN N-SDU标识符的关联CAN L-SDU标识符,必要时(多帧分段会话)用于传输CAN FC N-PDU的CAN L-SDU标识符.
8.Classic CAN frames and CAN FD frames
六、功能规范
CanTp模块提供了分段、流控制传输和消息重组的服务。它的主要目的是发送和接收可能适合或不适合单个CAN帧的消息。不能装入单个CAN帧的消息被分割成多个部分,这样每个部分都可以在单个CAN帧中传输。
6.1 Services provided to upper layer
主要提供两类服务:
1.Initialization and shutdown
2.Communication services
6.1.1 Initialization and shutdown
1.CAN TP 状态机有两种状态 – CANTP_OFF和CANTP_ON。
2.在CANTP_ON 中包含 RX(TX)_WAIT 和 RX(TX)_PROCESSING两种子状态。
3.在上电后,CAN TP 会默认在CANTP_OFF状态,当通过调用CanTp_Init() 初始化成功后会进入CANTP_ON状态。
4.只有当CAN TP 在CANTP_ON的时候CAN TP才会执行它自身的功能。
5.当其中既不进行分段发送也不进行分段接收的时候,处于RX(TX)_WAIT子状态。
6.当CAN TP 未初始化的时候,上层调用TP服务会产生CANTP_E_UNINIT 错误。
7.当CanTp模块处于全局状态CANTP_ON时,如果调用CanTp_Init, CanTp模块将丢失所有当前连接。
6.1.2 Transmit request
传输操作异步调用CanTp_Transmit(),允许上层请求使用CAN传输协议设施(分段、扩展寻址格式等)进行数据传输。在传输请求被接受,N-PDU被处理完成后canTP会通知上层。
6.1.3 Transmit cancellation
通过静态配置CanTpTc可以实现取消传输,调用CanTp_CancelTransmit()。例如当由于接收到另一个具有更高优先级的诊断协议的时候,当前正在进行的诊断传输会被取消。
6.2 Services provided to the lower layer
根据AUTOSAR通信栈规范,CAN传输层为CAN接口提供以下两个回调函数:CanTp_TxConfirmation()和CanTp_RxIndication()。
6.2.1 Transmit confirmation
CanIf模块应调用发送确认函数,通知CAN传输层CanTp请求的CAN帧传输是否成功。L-PDU标识符与呼叫相关联,以便识别相应的传输。
当超过最大时间(等于n_a)仍未收到发送确认时,CanTp模块将终止相应的会话。N-PDU对其他并发会话保持不可用状态,直到收到TxConfirmation,不管是否成功。
当CanTp_TxConfirmation()返回否定相应的时候,CANTP放弃相应的会话。
6.2.2 Reception indication
CanIf模块调用接收指示函数CanTp_RxIndication()通知CanTp模块一个新的CAN N-PDU帧(即传输协议帧)已经收到。接收指示可以根据CanIf配置在ISR上下文中执行。
6.3 Internal behavior
CAN TP 提供传输单帧和多帧的内部机制,由于CAN TP 为事件触发,所以它可以处理来自 can if 的L-PDU 和来自PDUR 的 N-PDU。
6.3.1 N-SDU Reception
当CAN TP 收到单帧或者首帧的时候应该调用PduR_CanTpStartOfReception()通知并将帧内容传递到上层的PDUR。
接收到的数据链路层数据长度(RX_DL)由CAN帧/PDU的第一个接收到的有效载荷长度(CAN_DL)导出,如下所示:
对于小于等于8字节的CAN_DL值,RX_DL值为8。
对于大于8字节的CAN_DL值,RX_DL值等于CAN_DL值。
6.3.2 N-SDU Transmission
上层通过调用CanTp_Transmit()请求传输N-SDU。CanTp_Transmit()的参数描述了CAN NSduId和要发送的完整Tx N-SDU长度。
6.3.3 Buffer strategy
因为CanTp没有缓冲能力,所以要发送的N-SDU负载不会在内部复制,收到的N-PDU也不会在内部重新组装。
CAN传输层直接作用于上层(例如PduR、DCM或COM)的内存区域。为了访问这些内存区域,CAN传输层使用PduR_CanTpCopyTxData()或PduR_CanTpCopyRxData()函数。
因此,为了保证数据一致性,上层应该锁定该内存区域,直到出现指示.
当发送缓冲区被锁定时,上层不能在缓冲区内写入数据。
当接收缓冲区被锁定时,CAN传输层不能保证缓冲区的数据一致性。上层既不能读也不能写缓冲区中的数据。
假定上层模块在向PduR_CanTpStartOfReception()调用返回状态BUFREQ_OK时锁定了缓冲区,CanTp_Transmit()返回E_OK,并保持缓冲区锁定,直到确认或指示(PduR_CanTpTxConfirmation()或PduR_CanTpRxIndication()调用)发生。
上图描述了用CAN 2.0 传输长度为50 byte 的数据流程:
1.PduR要求传输50个数据字节。
2.CanTp向PduR请求有效负载数据;可以发送第一帧。
3.CanTp将剩余的有效载荷数据作为连续帧的序列发送;上层在每个CF上复制6或7个有效载荷数据字节;
4.CanTp确认有效载荷数据的传输。
上图描述了以25个字节作为可用的Rx缓冲区,接受49 byte 数据的流程:
1.CanIf用CanTp_RxIndication()通知新的接收。CanTp将此通知转发给PduR;
2: PduR返回可用缓冲区大小为25字节,CanTp向发起者发送FlowControl CTS;
3: CanTp向PduR提供接收到的每一帧的数据,并监控剩余的缓冲区大小。在连续第二帧之后,剩余的缓冲区大小不够下一个块(两个连续帧);
4.CanTp通过调用PduR_CanTpCopyRxData()以0作为数据长度和NULL_PTR作为数据,向PduR请求剩余的缓冲区大小,并向发起者发送FlowControl Wait。直到下一个块有足够的缓冲区可用为止;
5.当缓冲区大小最终足够下一个块时,CanTp将发送一个FlowControl CTS给发起者,并继续接收下一个连续帧块;
6.在复制完块的最后一个连续帧后,剩余的缓冲区对于下一个块来说太低了,因此CanTp再次发送等待帧并监视剩余的缓冲区大小。
7.当最后一个区块的缓冲区可用时,CanTp将继续接收;
8. CanTp通过调用PduR_CanTpRxIndication()通知PduR接收结束。
6.4 Relationship between CAN NSduId and CAN LSduId
如下图所示,CAN TP 将L-SDU 根据不同的帧类型,提取出来填入 TA AE SA 后生成N-SDU。
七、帧类型定义
CanTp提供四种帧类型对网络层数据进行解析。分别是单帧(Signle Frame),首帧(Frist Frame),连续帧(Consecutive Frame),流控帧(Flow Control)。
7.1 单帧
DLC小于8,可以被一帧发完。
7.2 首帧
首帧是需要多帧才能传输完成数据的第一帧,接收方接收到首帧后,应返回流控帧告知接收能力,同时做好接收多帧的准备。
7.3 连续帧
连续帧应在首帧之后发送,接收节点一旦收到连续帧,应将全部数据组装完成。
7.4 流控帧
流控帧的作用是调节连续帧的发送速率,流控帧应包含帧的控制信息:FS,BS,STmin。在收到首帧后就
应返回流控帧,告知发送方当前接收状态以及接收能力。
其中,BS(Block Size):发送的数据量。
STmin(Separation Time Min):多帧间的最小间隔时间。
FS(Flow Status)有三种状态:
FC.CTS:continue to send, the authorization to continue
FC.WAIT:the request to continue to wait
FC.OVFLW:buffer overflow