目录
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 信息。

295

被折叠的 条评论
为什么被折叠?



