CAN-TP 与 UDS 诊断通信报文格式及时间参数详解及autosar 源码分析

目录

1.寻址方式

2.网络报文格式

2.1 单帧 SF

2.2 首帧 FF

2.3 连续帧 CF

2.3.1 SN(Sequence Number):

2.4 流控帧 FC

2.4.1 FS(flow sequence)

2.4.2.BS 定义

2.4.3 STmin

3.网络层时间参数定义

4.应用层诊断时间参数定义

5.发送部分时间管理实际代码分析

1.N_As时间

2.N_Bs时间

第一种情况

第二种情况:

第三种情况:

3.N_Cs时间

第一种情况:

第二种情况:

6.接收部分

1.N_Ar:

2.N_Br:

第一种情况:

第二种情况

第三种情况

3.N_Cr

第一种情况

第二种情况


1.寻址方式

ECU 必须支持两种诊断报文格式: 物理寻址及功能寻址。 FF FC CF 仅支持物理寻址不支持功能寻址,只有SF支持物理寻址和功能寻址。

2.网络报文格式

2.1 单帧 SF

SF_DL+7Byte Data
高4bit为0。SF_DL(1-7)

2.2 首帧 FF

FF_DL + 6Byte Data
高4bit 为1,后12bit(1-4095)

2.3 连续帧 CF

高4bit为2,低4bit(SN) + 7ByteData

2.3.1 SN(Sequence Number):

连续的序号,一次多帧传输过程中的第一个连续帧的序号为1,逐一增加,当序号增加到15后,重新从0开始,如此循环(范围0-15)

2.4 流控帧 FC

FS + BS +STmin + 5 ByteData

2.4.1 FS(flow sequence)

0:允许发送方继续发送连续帧
1:表示发送方需要等待下一条流控帧并 重启N_Bs 计时器,接收方启动N_Br,在这个时间段内得 发送一次FC,该流控帧携带的参数BS 和STmin 被忽略,
多帧传输过程中连续出现 WAIT 类型流控帧的最大次数为 N_WFTmax
2.:发送方需中止多帧报文的发送,该状态只能在收到首帧FF之后的第一帧流控帧出现,只有FF的帧长度超过了接收方的缓存使用。

2.4.2.BS 定义

0:表示允许发送方无需等待新的流控帧可直接发送完所有连续帧
1~255:允许发送方在收到新的流控帧之前可持续发送连续帧的数量

2.4.3 STmin

发送下一个连续帧(CF, Consecutive Frame)之前,发送节点需要等待的最短时间间隔
00~7f:0~127 毫秒(ms),直接表示等待时间
0x80~0xf0 :保留
0xF1~0xF9: 间隔时间范围100us~900us
0xFA~0xFF:保留

3.网络层时间参数定义

网络层错误主要有数据帧格式错误,超时错误和非预期帧错误等
  • .req : 帧发送开始请求
  • .con : 帧发送完成确认
  • .ind : 帧接收完成指示
1.N_As/N_Ar:
N_As :发送方请求任意帧类型从发送请求到发送完成的时间间隔
N_Ar:接收方请求任意帧类型从发送请求到发送完成的时间间隔
2.N_Bs
第一种情况:
N_Bs:发送方发送首帧确认之后等待接收发送流控帧的时间间隔
第二种情况:
N_Bs:发送方发送完流控帧之后等待接收方发送流控帧的时间间隔
第三种情况:
N_Bs:发送方收到接收方发送的流控帧(状态为wait)到收到下一流控帧时间
3.N_Cs
第一种情况:
发送方收到流控帧到请求发送连续帧的时间
第二种情况:
发送方发送完连续帧到下一包请求发送连续帧的时间
4.N_Br
第一种情况:
接收方收到发送方的首帧到请求发送流控帧时间
第2种情况:
Receiver 从 收到连续帧(CF)到 请求发送流控帧 的时间
第三种情况
Receiver 从 发送完流控帧(FC)(状态为Wait) 到 请求发送下一个流控帧 的时间
5.N_Cr:
第一种情况:
接收方发送完流控帧之后等待发送方发连续帧的时间
第二种情况:
接收方收到连续帧之后等待发送方继续发送连续帧的时间

4.应用层诊断时间参数定义

补充: P3 CAN Client Phys: 诊断工具成功发送 物理寻址诊断请求之后,且无需ECU 回复继续发送下次物理寻址诊断请求的最小时间间隔
P3 CAN Client Func: 诊断工具成功发送功能寻址之后再次发送功能寻址的最小时间间隔

5.发送部分时间管理实际代码分析

1.N_As时间

开启时间
CanTp_TxHandleSFStart
can tp 将通过can if 传输数据之后开启N_As 时间
关闭时间
CanTp_TxConfirmation
发送发成之后会有发送完成回调,根据if 层向上通知tp,查询当前如果是单帧的话就初始化TP 通道,如果非单帧的话就开启N_Bs或N_Cs时间

2.N_Bs时间

开启时间

第一种情况

CanTp_TxConfirmation
1.发送完首帧之后会向上通知发送完成,当前是首帧就会 设置CanTp_Channels[ChannelIdx].TxConnection.Substate = CANTP_TX_LARGE_V4FC;
2.开启N_Bs 时间
接收FC计算公式:
   FS: FcInfoPtr->FcFs = CanTp_Channels[ChannelIdx].TxConnection.FcBuf[offset] & CANTP_FC_FS_MASK;
   BS: FcInfoPtr->FcBS = CanTp_Channels[ChannelIdx].TxConnection.FcBuf[offset + 1u];
    STMin:
    stMinRaw = CanTp_Channels[ChannelIdx].TxConnection.FcBuf[offset + 2u];

    if (CANTP_FC_STMIN_MS_LIMIT >= stMinRaw)
    {
        /*ms per bit*/
        stMinUs = (uint32)stMinRaw * CANTP_FC_STMIN_MS_UNIT;
    }
    else if ((CANTP_FC_STMIN_US_LOW <= stMinRaw)
        && (CANTP_FC_STMIN_US_UPPER >= stMinRaw))
    {
        /*F1-F9 100us per step*/
        stMinUs = ((uint32)((uint32)stMinRaw - 0xF0UL)) * CANTP_FC_STMIN_US_UNIT;
    }
    else
    {
        /*invalid value, use 7F*/
        stMinUs = (uint32)CANTP_FC_STMIN_MS_LIMIT * CANTP_FC_STMIN_MS_UNIT;
    }

    /*transit to value in unit tick*/
    把 STmin(单位 µs)转换成“tick 计数”,tick 单位 1ms(1000 µs)。并做四舍五入。
    最终 CanTp 在内部将 STmin = 900 μs 当成 1 个 1ms tick 来处理。
    FcInfoPtr->FcSTMin = (stMinUs + (uint32)((uint32)1000 >> (uint32)1)) / (uint32)1000;
流控帧逻辑:
在收到FC之后会设置标志位
channelPtr->TxConnection.EventFlags |= CANTP_CHANNEL_EVENT_FC_RECEIVED;
周期调度程序cantp_mainFunction()根据标志位执行FC处理
CanTp_TxHandleFCReception
对收到的Fs,Bs,STmin 进行处理,发送连续帧对这些数据进行管控(一帧最小间隔时间,接收多少帧之后开始等待下一个流控帧)

第二种情况:

如果收到流控帧为FC(Wait),激活开启N_Bs

第三种情况:

根据接收到的流控帧的BS 知道最大发送多少条流控帧之后需要继续等待FC。

3.N_Cs时间

开启时间
N_Cs:

第一种情况:

CanTp_TxHandleFCReception(uint8 ChannelIdx)
收到流控帧FS == 0 之后开启N_Cs 时间

第二种情况

在发送完成回调里判断是否是流控帧,发送完成流控帧之后,对时间重新赋N_Cs 时间。并对STMin 赋值,对记录Bs 进行递增。假如数据发送完成,对TP重新初始化

6.接收部分

1.N_Ar:

请求发送任意帧之后都会触发N_Ar时间

2.N_Br:

在接收完成中断种会去执行cantp_rxindicaiton,根据判断帧格式情况设置对应事件Flag 置位,并将数据缓存在LocalBuf中,通过周期CanTP_MainFunction 检查标志位进行处理。
中断处理部分逻辑:

第一种情况:

if ((channelPtr->RxConnection.EventFlags & CANTP_CHANNEL_EVENT_FF_RECEIVED) != 0u) { /*A FF frame received*/ CanTp_RxHandleFFReception(ChannelIdx); }
在周期调度(处理接收事件)接收到首帧开启N_Br时间
计算FC Bs
当Bs 不为0,根据FF 长度去计算需要多少条流控帧
if (CAN20 == rxSduCfgPtr->CanFrameType) { CanTp_Channels[ChannelIdx].RxConnection.CurrentBs = (uint8)((blockDataLen + CANTP_CF_DATALEN_STD - 1u) / CANTP_CF_DATALEN_STD); }
检查当前缓存数据是否可以支持完整的传输。
在周期调度函数后台状态机(根据当前状态为CANTP_RX_FF_START),执行发送FC逻辑,并开启N_Ar 时间,并将状态切到CANTP_RX_LARGE_V4FCCTS_CFM /*wait for confirmation of FC_CTS*/

第二种情况

发送FC(Wait)开启N_Br时间

第三种情况

接收到了BS个流控帧之后,到达了系统要求最大流控帧数量需要重新发送FC,结果当前缓存不够需要发送FC(Wait)开启N_Br 时间需要设置N_Br 时间,如果缓冲区足够,直接发送FC

3.N_Cr

第一种情况

在发送FC之后发送完成回调中,开启N_Cr 时间。

第二种情况

每接收到一次连续帧之后会设置CANTP_CHANNEL_EVENT_CF_RECEIVED 事件flag,重新刷新N_Cr时间
在CanTp_RxHandleCFReception 函数,检查当前数据已经全部接收完毕之后,关闭时间,重新初始化cantp 信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值