J1939协议定义了三种通信方式——广播(BAM, Broadcast Announce Message)、基于连接的数据传输(Connection Mode Data Transfer)、直接数据传输(DIRECT)。如果数据多余8字节,则会通过BAM或者CMDT来发送,而小于等于8字节时,直接发送。
SAEJ1939网络协议规范定义的数据帧中,数据场的长度不能超过8个字节。
发动机信息及诊断报文等信号需要传输的数据长度会达到几十个字节甚至上百字节。这些长度大于8个字节的消息是无法用单个CAN数据帧来装载。需要使用SAEJ1939-21多包数据传输协议。
一个多包传输报文最多可传送255包数据(每包7个数据字节),一个多包报文最多传输1785个字节的数据。255*7=1785
SAEJ1939-21 中 TP (transport protocol)部分,主要功能:对数据长度大于8个字节的参数组进行打包、重组、连接、管理、数据传输,用来实现多包传输。
传输协议报文的优先级与单包报文的优先级的保持一致。
SAEJ1939-21协议中定的连接管理有两种类型
(1)点对点会话。多包消息需要发送到指定目标地址时使用的一种连接管理.这种类型的连接管理用于处理节点间虚拟连接的打开、使用、关闭。
(2)广播会话。如果消息是发送到多个节点或者是全局。则不需要数据流控制和关闭的管理功能。只需要通过广播消息来通知信息的发送即可。BAM只有发送者向接收者的交互过程
TP.CM 数据传输首先在节点之间建立连接。连接管理主要是对节点之间连接的建立和关闭、数据的传送过程进行管理。
BAM
广播公告报文 TP.CM_BAM (connection management)用于广播发送一个多包参数组。BAM消息中,包括:即将广播的长消息的参数组编号、消息大小、被拆包的数据包的数目。
发送完 TP.CM_BAM以后,直接发送包含打包数据的 TP.DT(data transmission) 报文。
TP.CM只能由发送节点发送,并且不必等待接收节点的响应。TP.DT发送完毕后也不需要关闭连接的操作。
TP.CM下表所示
TP.CM_BAM | 全部目标地址都能收 |
---|---|
byte1 | 控制字节=32 |
byte2、3 | 报文总长度,字节数 |
byte4 | 数据包总数 |
byte5 | SAE保留,0XFF |
byte6 | 打包参数组PGN的LSB |
byte7 | 打包参数组PGN中间字节 |
byte8 | 打包参数组PGN的MSB |
第1帧数据是告诉接收者准备好开始接收,后面会逐个发送数据。
第1帧包含PDU字节长度,数据帧个数,PGN(PGN1到3,分别是8位,PGN共24位)的信息。其作用是预先告诉接收者准备存储空间(有上界,具体见COM配置说明),防止接收者存储空间不足。
BAM通信过程
PGN
SAEJ1939-21协议定义了一个专用的PGN参数组(60160(OOEB00))来传输拆分后的数据。
参数组编码(PGN )PGN 是一个 24 位的数值,用于定义 CAN 数据帧中数据场的一个参数组。
这 24 位数值组成部分为:
第一个字节最高 6 位全置 0,其后依次是 保留位(R),数据页(DP);
第二个字节为 PDU格式(PF);
最后一个字节如果为 PDU1 格式则设置为 0x00,如果为 PDU2 格式,这字节的值为组扩展场GE 的值,见下图 。
如果PF<240,则PS是目标地址(Destination Addr),GE等于0,为 PDU1 格式。
如果PF>=240,则PS是群拓展GE(Group Extension, 也就是说PGN可以更多),为 PDU2 格式。
对于PF<240的情况,指定了目标地址,但是可以传输的PG(也可以说是PGN)变少了。
PG参数群概念:PG是可以放在一起发送的一些数据,这些数据可以是在一帧数据中传完,也可以通过J1939的多帧传输协议来通过多次传输实现,取决于数据的长度。
比如参数群中共有2个信号——车胎压力(8字节)、轮速(16字节),总共3字节数据,而J1939协议对于小于等于8字节的数据可以直接传输(DIRECT传输方式)。
比如参数群中共有6个信号——PWM占空比1(16字节)、PWM占空比2(16字节)、PWM占空比3(16字节)、PWM占空比4(16字节)、PWM占空比5(16字节)、PWM占空比6(16字节),总共12字节数据,此时J1939协议可以通过2个数据帧来发送数据(CMDT传输方式,具体见下方),也可以通过广播(BAM传输方式,具体见下方)的形式发送。
PGN个数计算:(240 + (16 * 256) * 2) = 8672。
其中,240是每个数据页(DP, Data Page)中的
PF<240时,GE恒等于0,所以数目是240。
16是每个数据页(DP, Data Page)中的
PF>240时,数值从240到255之间,共16个数。
256是指GE(等于PS)的取值个数,具体是从0到255之间。
2表示数据页,分为页0和页1。
数据页位选择参数群(PG, Parameter Group)描述的辅助页,在分配页1的参数群编号(PGN, Parameter Group Number)之前,先分配页0的可用PGN。
DA(目的地址)和SA(源地址)相同的所有PDU。
数据传送报文 TP.DT 用于发送参数组的打包数据,TP.DT 用于 传送多包报文的单个数据包。数据传送报文TP.DT的参数组结构如下表所示
在数据传送报文中,数据域的第一个字节用作消息帧的序号,后7个字节用来存放有效数据,单次可以发送255×7=1785个字节的数据(255表示最大能够发送的包数,7表示每包消息帧的字节数)数据包按照包编号顺序逐个发送,最后一个数据包中未用的字节按规定进行填充。
simulink支持的
Matlab/Simulink下CAN信号打包解包
一般CAN解包/打包体式格局相对简朴
用Simulink自带的CAN pack/CAN unpack加dbc,然后生成代码
一一学习下官方模块
不知道是不是我理解有问题 这样设置 报错
原来是 心不细
概述
- CAN-FD:可以理解成CAN协议的升级版,只升级了协议,物理层未改变。
- CAN与CAN-FD主要区别:传输速率不同、数据长度不同、帧格式不同、ID长度不同。
- 由传统CAN转移到CANFD比较方便
传输速率不同
CAN:最大传输速率1Mbps。
CAN-FD:速率可变,仲裁比特率最高1Mbps(与CAN相同),数据比特率最高8Mbps
数据域长度不同
CAN:一帧数据最长8字节
CAN-FD:一帧数据最长64字节。
协议内容改变—取消远程帧
CANFD报文具体结构—红色缩写为增加部
CAN报文与CANFD报文结构对比
CANFD不存在远程帧,CAN报文中的RTR(用于区别标准帧与远程帧)被替换为RRS(远程请求替代位,默认值为0)
FDF用于传统CAN报文和CANFD报文,FDF位为0时为传统报文,FDF为1时为CANFD报文
BRS位速率切换为,BRS位为0时CANFD速率保持恒定速率、BRS位为1时CANFD的数据段会被切换到高速率。
ESI错误状态指示位:CAN报文中发送节点的错误状态只有该节点自己知道,CANFD报文中可以通过ESI标志位来告诉其他节点该节点的错误状态,当ESI为1时表示发送节点处于被动错误状态、当ESI为0时表示发送节点处于主动错误状态
CRC-stuff count:填充位计数(计算从SOF开始到Data Field最后一位的填充位的个数)
CRC场之前和CRC场之后位填充是不一样的
SOF到Data Field最后一位的位填充跟CAN报文一样:每五个相同位之后填充一个相反位
CRC场采用固定位填充
Stuff Count由以下两个元素组成:
格雷码计算(前3位):CRC区域之前的填充位数除以8,得到的余数(Stuff bit count modulo 8)进行格雷码计算得到的值(Bit0-2)
奇偶校验(最后1位):通过格雷码计算后的值的奇偶校验(偶校验)
CRC:随着数据场的扩大,为了保证信息发送的质量,CAN FD的CRC计算不仅要包括数据段的位,还包括来自SOF的Stuff Count和填充位。通过比较CRC的计算结果,可以判断接收节点是否能够正常接收。
在CAN中,CRC的位数是15位,而在CAN FD中,CRC场扩展到了21位,详见以下:
ID长度不同
CAN标准帧ID长度最长11bit
CANFD标准帧ID长度可扩展到12bit。
j1939CAN模块
老天啊 我做不出来 求大神联系我 15114837684(微信) 教我一个问题