目 录CONTENT

文章目录

AUTOSAR - CANTP - 学习三 :规范时序图解读

moke
2024-07-26 / 0 评论 / 0 点赞 / 89 阅读 / 0 字

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
(
  CanTpRxPduId,
  CanTpRxPduPtr
)

当底层接收到一个帧(这里是单个帧)时,它通过CanTp_RxIndication回调通知CanTp。CanTpRxPduld表示收到的L-PDU的ID, CanTpRxPduPtr表示L-PDU的有效载荷和LPDU数据长度。

2

PduR_CanTpStartOfReception

(
CanTpRxSduId,
TpSduLength,
PduInfoPtr

)

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
(
  CanTpRxPduId,
  CanTpRxPduPtr
)

当底层接收到一个帧(这里是单个帧)时,它通过CanTp_RxIndication回调通知CanTp。CanTpRxPduld表示收到的L-PDU的ID, CanTpRxPduPtr表示L-PDU的有效载荷和LPDU数据长度。

2

PduR_CanTpStartOfReception

(
CanTpRxSduId,
TpSduLength,
PduInfoPtr

)

CAN传输层执行ID转换,并从N-PDU有效载荷中提取有用的数据长度。然后,它要求其上层使用PduR_CanTpStartOfReception回调为传入数据提供可用的缓冲区。tpsdullength设置为SF_DL(从N-PCI字段中提取)。它指示要接收的总字节数。

3

BUFREQ_E_OK

上层分配并锁定所需的Rx缓冲区。然后返回BUFREO OK。

4

PduR_CanTpCopyRxData

(
PduIdType,
PduInfoType*,
PduLengthType

)

 上层将接收到的N-PDU负载复制到缓冲区中。

5

PduR_CanTpRxIndication

(
CanTpRxSduId,
Result

)

当复制完成时,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
(
  CanTpRxPduId,
  CanTpRxPduPtr
)

当底层接收到一个帧(这里是首帧)时,它通过CanTp_RxIndication回调通知CanTp。CanTpRxPduld表示收到的L-PDU的ID, CanTpRxPduPtr表示L-PDU的有效载荷和LPDU数据长度。

2

PduR_CanTpStartOfReception

(
CanTpRxSduId,
TpSduLength,
PduInfoPtr

)

可以请求PDU路由器为传入的数据回调提供一个缓冲区。与PduR_CanTpStartOfReception

3

检查连接,准备接收流控帧参数

4

CanTp激活一个任务发送一帧流控帧,流控状态是持续发送。

5

PduR_CanTpRxIndication

(
CanTpRxSduId,
Result

)

当CANIf接收到一个帧(这里指连续帧),CANIf通过CanTp_RxIndication回调通知CanTp。CanTpRxPduld表示接收到的CAN帧ID, CanTpRxPduPtr表示发送到LSDU的有效载荷。

6

CanTp应该校验连续帧的连续性,当确保是连续的,复制数据到PduR

7

PduR_CanTpCopyRxData

(
PduIdType,
PduInfoType*,
PduLengthType

)

PduR_CanTpRxIndication

(
CanTpRxSduId,
Result
)

三种情况可以适用:

  1. 正常情况:接收到的连续帧不是最后一个。CanTp将接收到的数据转发给上层。
  2. Buff满了,流控帧发出一个等待标识进行等待。
  3. -Last CF Received:该连续帧是最后一帧(总长度信息作为参数在第一帧中)。CanTp用PduR, CanTpRxIndication回调通知PDU路由器。

8

当需要发送流量控制时,CanTp循环任务应该使用Canlf_Transmit调用CAN接口,并等待CAN接口的确认。流控状态可以是ContinueToSend或Wait,这取决于上层的可用缓冲区。

2.4、单帧发送N-SDU

1、PduR调用CanTp接口,请求进行单帧数据传输;

2、CanTp调用PduR接口Copy数据,并调用Canlf接口发送数据

 执行步骤如下:

执行顺序

功能函数

描述

1

CanTp_Transmit

(
CanTpTxSduId,
CanTpTxInfoPtr

)

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

(
SduId,
PduInfoPtr,
TxState,
TxCntPtr

)

调用PduR_CanTpCopyTxData来复制段数据。

4

BUFREQ_OK

上层开始复制数据

5

CanIf_Transmit

(
CanTxPduId,
PduInfoPtr

)

CanTp执行从CanTpTxSduld到CanTxPduld的转换。在扩展寻址格式的情况下,它将N- sdu有效载荷与N TA值连接起来,在Canlf模块上执行传输请求。

6

E _OK

进入此状态CanIf模块开始传输数据

7

CanTp_TxConfirmation

(
CanTpTxPduId,
)

N-PDU成功传输出来到CANIf了。

8

PduR_CanTpTxConfirmation

(
CanTpTxSduId,
Result
)

假设结果设置为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

(
CanTpTxSduId,
CanTpTxInfoPtr

)

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

(
SduId,
PduInfoPtr,
TxState,
TxCntPtr

)

调用PduR_CanTpCopyTxData。上层将段数据复制到目标缓冲区。

4

CanIf_Transmit

(
CanTxPduId,
PduInfoPtr

)

CanTp执行从CanTpTxSduld到CanTxPduld的转换。在扩展寻址格式的情况下,它将N- sdu有效载荷与N TA值连接起来,在Canlf模块上执行传输请求。

5

CanTp_TxConfirmation

(
CanTpTxPduId,
)

N-PDU成功传输出来到CANIf了。

6

PduR_CanTpCopyTxdata

(
SduId,
PduInfoPtr,
TxState,
TxCntPtr

)

对于每个连续的帧,CanTp请求PDU路由器提供要发送的新数据。

7

PduR_CanTpTxConfirmation

(
CanTpTxSduId,
Result
)

当所有数据发送完毕,或者发生错误时,CanTp通知PDU路由器PduR_CanTpTxConfirmation。CanTpTxPduld标识已确认传输的N-SDU,结果显示传输是否完成。

        提醒以下:CanTp属于BSW的基础服务模块中的一个,并不存在往上RTE的任何接口的,当然接口调用的时候注意以下规范里面的第8节即可。

博主关闭了所有页面的评论