1、概述
CanTp位于CanIf与PDUR之间,主要目的是对大于8字节的CAN I-PDU,大于64字节的CANFD I-PDU进行分段与重组。
对单帧、多帧的接收发送,从规范里面给出来了很详细的解读,每一个步骤需要干什么,需要执行什么功能函数,返回的E_OK状态有什么指示等都有明确的步骤。
2、时序图解读
前提条件:
序列图只演示了CAN_Tp模块的工作。然而,如果在接收过程中考虑整个系统,则涉及更多模块。因为这种接收可以在can ISR上下文中触发,所以CAN_Tp操作应该尽可能短。
2.1、无缓存区接收单帧N-SDU
执行步骤如下:
执行顺序 | 功能函数 | 描述 |
1 | CanTp_RxIndication | 当底层接收到一个帧(这里是单个帧)时,它通过CanTp_RxIndication回调通知CanTp。CanTpRxPduld表示收到的L-PDU的ID, CanTpRxPduPtr表示L-PDU的有效载荷和LPDU数据长度。 |
2 | PduR_CanTpStartOfReception ( ) | CAN传输层执行ID转换,并从N-PDU有效载荷中提取有用的数据长度。然后,它要求其上层使用PduR_CanTpStartOfReception回调为传入数据提供可用的缓冲区。tpsdullength设置为SF_DL(从N-PCI字段中提取)。它指示要接收的总字节数。 |
3 | BUFREQ_E_NOT_OK | 上层不能提供任何可用的缓冲区,因此返回bufreqe_not_ok值。CanTp在不复制任何数据的情况下结束CanTp_RxIndication函数。 |
2.2、有缓存区接收单帧N-SDU
1、Canlf调用CanTp接口(CanTp_RxIndication)通知数据接收;
2、CanTp调用PduR接口(PduR_CanTpStartOfReception)通知数据开始接收;
3、CanTp将PDU数据从CanlfCopy到CanTp
4、CanTp将PDU数据去除包头后从CanTp Copy到PduR;
执行步骤如下:
执行顺序 | 功能函数 | 描述 |
1 | CanTp_RxIndication | 当底层接收到一个帧(这里是单个帧)时,它通过CanTp_RxIndication回调通知CanTp。CanTpRxPduld表示收到的L-PDU的ID, CanTpRxPduPtr表示L-PDU的有效载荷和LPDU数据长度。 |
2 | PduR_CanTpStartOfReception ( ) | CAN传输层执行ID转换,并从N-PDU有效载荷中提取有用的数据长度。然后,它要求其上层使用PduR_CanTpStartOfReception回调为传入数据提供可用的缓冲区。tpsdullength设置为SF_DL(从N-PCI字段中提取)。它指示要接收的总字节数。 |
3 | BUFREQ_E_OK | 上层分配并锁定所需的Rx缓冲区。然后返回BUFREO OK。 |
4 | PduR_CanTpCopyRxData ( ) | 上层将接收到的N-PDU负载复制到缓冲区中。 |
5 | PduR_CanTpRxIndication ( ) | 当复制完成时,Rx指示被发送到上层。结果设置为E_OK。 |
2.3、多帧N-SDU接收
1、Canlf调用CanTp接口(CanTp_RxIndication)通知数据接收;
2、CanTp调用PduR接口(PduR_CanTpStartOfReception)通知数据开始接收;
3、CanTp将首帧PDU数据从CanlfCopy到CanTp;
4、CanTp将首帧PDU数据去除包头后从CanTp Copy到PduR;
5、CanTp将连续帧PDU数据从CanlfCopy到CanTp;
6、CanTp将连续帧PDU数据去除包头后从CanTp Copy到PduR;、
执行步骤如下:
执行顺序 | 功能函数 | 描述 |
1 | CanTp_RxIndication | 当底层接收到一个帧(这里是首帧)时,它通过CanTp_RxIndication回调通知CanTp。CanTpRxPduld表示收到的L-PDU的ID, CanTpRxPduPtr表示L-PDU的有效载荷和LPDU数据长度。 |
2 | PduR_CanTpStartOfReception ( ) | 可以请求PDU路由器为传入的数据回调提供一个缓冲区。与PduR_CanTpStartOfReception |
3 | 检查连接,准备接收流控帧参数 | |
4 | CanTp激活一个任务发送一帧流控帧,流控状态是持续发送。 | |
5 | PduR_CanTpRxIndication ( ) | 当CANIf接收到一个帧(这里指连续帧),CANIf通过CanTp_RxIndication回调通知CanTp。CanTpRxPduld表示接收到的CAN帧ID, CanTpRxPduPtr表示发送到LSDU的有效载荷。 |
6 | CanTp应该校验连续帧的连续性,当确保是连续的,复制数据到PduR | |
7 | PduR_CanTpCopyRxData ( ) PduR_CanTpRxIndication ( | 三种情况可以适用:
|
8 | 当需要发送流量控制时,CanTp循环任务应该使用Canlf_Transmit调用CAN接口,并等待CAN接口的确认。流控状态可以是ContinueToSend或Wait,这取决于上层的可用缓冲区。 |
2.4、单帧发送N-SDU
1、PduR调用CanTp接口,请求进行单帧数据传输;
2、CanTp调用PduR接口Copy数据,并调用Canlf接口发送数据
执行步骤如下:
执行顺序 | 功能函数 | 描述 |
1 | CanTp_Transmit ( ) | PDU路由器需要发送一个需要传输协议功能的I-PDU,并且该I-PDU的数据可以被传输,因此PduR会对I-PDU标识符进行转换,以确定是哪个I-PDU指与数据结构有关的信息CanTpTxInfoPtr(参见类型的定义:Std_PdulnfoType)。传输层使用(CanTp, LinTp或FrTp),以及什么关联N-SDU标识符为(标识符转换)。然后PduR调用CanTp的原语CanTp_Transmit。该函数将执行以下步骤:-验证输入参数和资源的可用性-在CanTp标识符、N_TA值等的配置集中搜索处理传输请求的有用信息)实体(如SF/FF/CF N-PDU标识符,FC N-PDU)-启动带有参数的内部传输任务:CanTpTxSduld和CanTpTxInfoPtr。注意:只分析CanTpTxinfoPtr结构体中的长度信息。指向有效载荷数据的指针将被丢弃。 |
2 | E _OK | 返回E_OK值,表示上层接受发送请求。上层锁定所需的Tx缓冲区。 |
3 | PduR_CanTpCopyTxdata ( ) | 调用PduR_CanTpCopyTxData来复制段数据。 |
4 | BUFREQ_OK | 上层开始复制数据 |
5 | CanIf_Transmit ( ) | CanTp执行从CanTpTxSduld到CanTxPduld的转换。在扩展寻址格式的情况下,它将N- sdu有效载荷与N TA值连接起来,在Canlf模块上执行传输请求。 |
6 | E _OK | 进入此状态CanIf模块开始传输数据 |
7 | CanTp_TxConfirmation ( | N-PDU成功传输出来到CANIf了。 |
8 | PduR_CanTpTxConfirmation ( | 假设结果设置为E_OK。通知PDU路由器N-SDU发送成功。此时需要解锁PdulnfoType结构。 |
2.5、多帧N-SDU发送
1、PduR调用CanTp接口,请求进行多帧数据传输;.
2、CanTp调用PduR接口Copy数据,并调用Canlf接口发送首帧数据
3、CanTp再次调用PduR接口Copy数据,并调用Canlf接口发送连续帧数据,直到全部数据发送结束。
执行步骤如下:
执行顺序 | 功能函数 | 描述 |
1 | CanTp_Transmit ( ) | PDU路由器需要发送一个需要传输协议功能的I-PDU,并且该I-PDU的数据可以被传输,因此PduR会对I-PDU标识符进行转换,以确定是哪个I-PDU指与数据结构有关的信息CanTpTxInfoPtr(参见类型的定义:Std_PdulnfoType)。传输层使用(CanTp, LinTp或FrTp),以及什么关联N-SDU标识符为(标识符转换)。然后PduR调用CanTp的原语CanTp_Transmit。该函数将执行以下步骤:-验证输入参数和资源的可用性-在CanTp标识符、N_TA值等的配置集中搜索处理传输请求的有用信息)实体(如SF/FF/CF N-PDU标识符,FC N-PDU)-启动带有参数的内部传输任务:CanTpTxSduld和CanTpTxInfoPtr。注意:只分析CanTpTxinfoPtr结构体中的长度信息。指向有效载荷数据的指针将被丢弃。 |
2 | E _OK | 返回E_OK值,表示上层接受发送请求。上层锁定所需的Tx缓冲区。 |
3 | PduR_CanTpCopyTxdata ( ) | 调用PduR_CanTpCopyTxData。上层将段数据复制到目标缓冲区。 |
4 | CanIf_Transmit ( ) | CanTp执行从CanTpTxSduld到CanTxPduld的转换。在扩展寻址格式的情况下,它将N- sdu有效载荷与N TA值连接起来,在Canlf模块上执行传输请求。 |
5 | CanTp_TxConfirmation ( | N-PDU成功传输出来到CANIf了。 |
6 | PduR_CanTpCopyTxdata ( ) | 对于每个连续的帧,CanTp请求PDU路由器提供要发送的新数据。 |
7 | PduR_CanTpTxConfirmation ( | 当所有数据发送完毕,或者发生错误时,CanTp通知PDU路由器PduR_CanTpTxConfirmation。CanTpTxPduld标识已确认传输的N-SDU,结果显示传输是否完成。 |
提醒以下:CanTp属于BSW的基础服务模块中的一个,并不存在往上RTE的任何接口的,当然接口调用的时候注意以下规范里面的第8节即可。