当前位置: 首页 > news >正文

CanTp概述

1.功能介绍

CanTp是基于 ISO 15765-2 标准、用于在 CAN 总线上实现大数据可靠传输的传输层协议,核心是数据分段 / 重组、流控、超时与错误管理、多连接支持,解决 CAN 单帧 8 字节(CAN FD 64 字节)的长度限制。

简言之,CanTp本质就是构建一套规则,使得大量的数据可以通过数据域短小的CAN线传递。

CanTp的这套规则我简要归纳为以下3类:

1)寻址类型:通过物理寻址和功能寻址来实现单播和广播,即通过物理寻址实现1对1的通话, 功能寻址实现一对多的通话。

2)帧类型: 单帧用于发送一帧CAN报文能解决的数据; 首帧+流控帧+连续帧 解决一帧CAN报文无法解决的数据。

3)超时监控:通过A,B,C 3类超时参数从接收端和发送端两端事实监控。

2.寻址类型

注意: 功能寻址只支持单帧传输

3.帧类型

帧类型通过PCI(ProtocolControlInformation)来区分。分为4种帧:

--SF单帧

--FF首帧

--CF连续帧

--FC流控帧

不同的帧类型其PCI参数也不一样,CANFD因为其数据域长度原因其部分PCI参数的长度做了适当的扩大来兼容。

注意:本文中所有的PCI 都是基于11bit的标准帧,不考虑29bit的扩展帧和混合模式

3.1 单帧SF

单帧即可以用一帧CAN报文发送所有信息的诊断报文格式,考虑到CANFD 其有2中格式:

CAN_DL <= 8:

比如: 02 10 02 00 00 00 00 00

这里 02 中 高4bit = 0 表示帧类型为SF, 2表示这个SF有2byte的Data 即 10 02, 剩余的0为填充值。

CAN_DL > 8:

比如: 00 02 10 02 00 00 00 00 00 00 00 00 (这里假定CAN_DL = 12)

这里 00 中 高4bit = 0 表示帧类型为SF, 02 表示这个SF有2byte的Data 即 10 02, 剩余的0为填充值。

3.2 多帧传输

当一帧CAN报文无法传输完整的诊断数据则需要借助多帧传输,多帧传输涉及3种帧类型:FF,CF和FC。

其中FF和CF负责传输数据,FC则是起控制作用。

其传输步骤如下图所示:

3.2.1 首帧 FF

当数据过大则需要分段传输,首帧顾名思义就是分段传输的第一帧。

首帧的帧类型即byte0 的高4bit = 1;

CAN_DL <= 8:

比如: 10 0D 2E F1 8A 01 02 03

这里0 0D 12Bit的FF_DL表示整个诊断数据有0xD 13个byte, 后面的全是数据。

针对首帧其数据长度一定要大于单帧的最大数据长度,所以FF_DL大于7

CAN_DL > 8:

比如: 10 00 00 00 00 0D 2E F1 8A 01 02 03 (这里假定CAN_DL = 12)

这里 00 00 00 0D 4byte的FF_DL表示整个诊断数据有0xD 13个byte, 后面的全是数据。

3.2.2 流控 FC

接收端接收到首帧后就知晓了后续还有多大的数据量,接收端评估自身的接收能力后发送流控给发送端来控制后续的连续帧发送。

流控帧本身没有诊断数据,所以于CAN_DL 长度无关,其帧类型即byte0 的高4bit = 3;

流控制帧有3个参数:FS,BS 和STmin

FlowStatus (FS)

用于告知发送端接下来的操作

0 = CTS: 告知发送端可以发送连续帧

1 = WAIT: 希望发送端暂停发送,暂停到发送CTS或者因为超时终止发送

2 = OVFLW: 接收端没有空间接收数据,发送端立刻终止发送。

Q&A
1. 收到FS = Wait 后要等待多久?

根据ISO 15765-2 的 【9.3.4 Wait frame error handling】

The sender of the message is informed about the aborted message reception via an N_USData.confirm with <N_Result> set to N_TIMEOUT_Bs. (Because of the missing FlowControl N_PDU from the receiver, an N_Bs timeout occurs in the sender.)

简言之,当受到FS = WAIT后,会执行以下操作:

1. 不会发送CF.

2. 重置N_Bs Timer.

3. 内部WAIT Frame Counter加1

4. 当WAIT Frame Counter达到N_WFTmax ,终止当前会话,上报N_WFT_OVRN

当N_Bs Timeout 时间内未收到FS = CTS或FS = WAIT ,也会终止当前会话,如果收到FS = CTS则会发送CF.

BlockSize (BS)

用于限制发送端一次最多发送多少个连续帧。

SeparationTime minimum (STmin)

•STmin:接收方给出的连续帧最小发送间隔

• 发送过快 → 接收方可能处理失败

• 同时用于减轻 CAN 总线负载

其中0 表示能发多快就多快。

注意: 当发送端收到的STmin > N_As + N_Cs 时, 发送端不会遵守这个STmin, 因为遵守意味着A,C 时间参数超时。

4. 超时监控

ISO-15765-2 定义了3类时间参数(A,B,C)来确保通信的效率。

名称

含义

代码层级理解

N_As

Time for transmission of Frame,Send Side

Sender端调用CanTpTransmit 到CanTpTxConfirmation 被触发间的时间。

N_Bs

Time until reception of next flow control

Sender端从FF的CanTpTxConfirmation到FC的CanTpRxIndication

N_Cs

Time until next transmission of consecutive Frame

Sender端从CF的CanTpRxIndication到调用CanTpTransmit发送CF的间隔时间

N_Ar

Time for transmission of Frame,Receiver Side

同As, 只是换成Receiver端发送报文

N_Br

Time until transmition of next flow control

Receiver端接收到FF的Indication到调用CanTpTransmit发送FC的间隔时间

N_Cr

Time until next reception of consecutive Frame

Receiver端接收到CF的Indication到下一个CF的Indication的间隔时间

注:1)CanTpRxIndication 表示成功接收诊断报文,并且代码上已经传递到CanTp

2)CanTpTxConfirmation 表示诊断报文已经成功发送到了总线上,即收到对端节点的ACK应答。

3)这里的Sender 和 Receiver 指的是首帧的发送方和接收方,所以Sender可以发送报文也可也接收报文,Receiver亦然。

http://www.jsqmd.com/news/625949/

相关文章:

  • 告别手动编译!用Jenkins Pipeline自动化你的C/C++项目(保姆级配置流程)
  • 从理论到实践:深入剖析RoPE旋转位置编码及其在LLaMA等大模型中的应用
  • 1 2.1 使用“记事本”编辑文本文档
  • Bootstrap 折叠组件详解
  • Excel VBA 入门到精通(二):变量、数据类型与运算符
  • 系统扩展方案
  • 001项目总结
  • 避坑指南:PVE显卡直通后,Ubuntu安装N卡驱动和vLLM多卡部署的常见错误与修复
  • 暗黑破坏神2终极生存指南:PlugY插件如何彻底改变你的单机游戏体验
  • Win10/Win11下 LaTeX 环境安装教程——TeX Live 2026 + TeXstudio 配置步骤详解
  • 备件断供时代:中短波发射机国产化替代的真实进展
  • 别再只写ChatGPT提示词了!用LangChain和AutoGen给AI装上‘手和脚’的保姆级教程
  • 5个维度解锁开源工具PlugY的暗黑破坏神2增强潜力
  • 从FFmpeg到FFMedia:解锁RK3588硬件编解码的实战路径
  • RT-Thread 第 8 课时:LwIP 网络基础 + MQTT 软件包上云
  • 从‘乐学小鹅’到‘com.tencent.k12gy’:一次Frida注入失败带给我的Android应用‘身份证’认知升级
  • DrissionPage实战:从零构建高效网页自动化工具
  • 作业2:6位数码管相关练习
  • 从Flannel迁移到Calico:Kubernetes网络插件实战切换指南
  • 双唾液酸神经节苷脂GD3
  • 强化学习部署相关概念区分: parameters.pkl、Checkpoint 与 TorchScript
  • Lychee多模态重排序模型效果展示:T→T纯文本检索中长尾query高分匹配案例
  • PlugY颠覆式体验完全指南:暗黑破坏神2单机限制的终极解决方案
  • 用R包sommer做基因组选择:从单性状到多性状GBLUP,一份给育种新手的保姆级代码指南
  • 别再为加工发愁!手把手教你将HFSS的3D模型变成Altium可用的PCB封装(以定向耦合器为例)
  • **发散创新:基于Rust的内存安全加固技术实战与深度剖析**在现代软件开发中,**内存
  • ESP32-S3玩转RGB屏幕:解决画面漂移的5个实战技巧(附配置代码)
  • 学Simulink——基于Simulink的重复控制抑制周期性负载转矩扰动
  • 2024年企业服务器CPU怎么选?从Intel至强Silver 4410Y到Gold 6248R的实战性能分析与避坑指南
  • 【实战指南】利用再生龙(Clonezilla)实现Linux服务器整盘灾备