热度 1|
在接触CAN之前,应该接触过IIC通信,在IIC通信中,在同一条IIC通信总线上每个device有唯一的ID,后续对于device的操作都是通过唯一的ID号来区分。而CAN ID虽然也叫ID,但是意义却不一样,每个CAN device可以接收和发送多条不同的ID报文。
比如在一条CAN总线上有三个device,叫做A,B,C吧。
A device有接收ID:202,302;发送ID:101,102;
B device有接收ID:101,303;发送ID:201,202;
C device有接收ID:101,102,201;发送ID:302,303;
如果A device发送了ID为101的一条报文,因为B device和C device都有接收为101的ID,那么B device和C device都可以接收到这条报文。
如果A device发送了ID为102的一条报文,因为只有C device都有接收为102的ID,那么只有C device可以接收到这条报文。
如果B device发送了ID为202的一条报文,因为只有A device都有接收为202的ID,那么只有A device可以接收到这条报文。
可以看出,CAN ID其实是个报文过滤器,当总线上报文的ID和自己接收的ID有相匹配的时候,就可以接收相应的报文。
CAN中的ID是为了定义相应的报文的含义,每个ID对应有自己的具体含义。
比如,101为电压信号,201为电流信号,这样当A device要发送电压信号时候,就用101 ID的报文,B和C device接收到101 ID的报文之后,知道这是电压信号。
CAN总线ID是包含在报文帧中的。
1、主要用作CAN总线的仲裁使用,所以一般来说网络上的每个节点(向总线上发送)的ID应该有所不同。ID值越低,报文优先级越高,在两组不同ID报文同时上线时候,仲裁机制使得ID值低的占用总线,ID值高的退出。
2、ID域可以是11位和29位,其值和含义可以由用户自定义,可以用作高层协议的管理,比如CANopen等协议中把ID的部分做为“源地址”,部分作为“目的地址”,这样CAN报文从哪来到哪去都清晰了。
3、ID的另一个作用是配合接收方滤波使用,就是说一般接收的滤波器可以设定接收ID的范围等,用于过滤掉不需要接收的信息,减轻CPU的处理负担。
ID是赋给帧的,不是直接给节点的,只是某节点知道自己要接收某个ID的帧。总线上的节点来说它只管取总线上他应该取的ID的帧,并不管是谁发的。
即使是远程帧,发出请求的节点在获得相应时也仅仅是根据帧ID判定,并不影响其他节点的接收。
我们要从总线的角度去看待CAN,不要从节点的角度出发
CAN 帧ID 与J1939 PGN 转换
1. J1939应用层协议详细描述了用于J1939网络的每个参数,包括其数据长度、数据类型、分辨率、范围及参考标签,并为每个参数分配了一个编号(SPN)。由于J1939协议是以协议数据单元(PDU)的形式进行传输,而一个PDU包含8个字节数据,因此,需要对这些参数进行组合。在J1939应用层协议中还详细定义了参数组,包括每组参数的更新率、有效数据长度、数据页、PDU格式、PDU细节、默认优先权及参数组的内容,并为每个参数组分配一个参数组编号(PGN)。
PGN(parameter group number)是一个24位的值,包括保留位(R)、数据页位(DP)、PF(PDU格式场)和PS(群扩展场)等要素。
SPN(SPN:Suspect Parameter
Number)是PG(参数组)下面的具体参数的一个编号,而PGN是参数组编号,可以理解为一个PGN包含了按一定方法分类的一组参数,而每个具体参数又有它自己的编号(就是SPN)。
SAE J1939的应用层以PGN和SPN的方式具体规定了车辆使用的每个参数的数据长度,数据类型,分辨率和数据范围等。
2.
参数组编号(PGN)
在识别 CAN 数据帧的数据域属于哪个参数组时,需要一个 24 位的值。这个 24 位的值首先发送最低字节(见表 2,最低字节先发送,其次是中间字节,最后是最高字节)。
PGN 是一个 24 位的值,包括以下部分:保留位、数据页位、 PDU 格式域(8 位)和组扩展域(8 位)。若 PF 值小于 240(F016), PGN 的低字节置 0。否则,将其值设为组扩展域的值。
if (PDUF < 240) //PDUF即PF , PDUS即PS
PGN = PDUF*256; // PDU1
else
PGN = PDUF*256 + PDUS; // PDU2
PF用来确定PDU格式:
0——239表示PDU1格式,PDU1格式报文表示向特定或全局地址发送。
240——255表示格式2,PDU2格式报文表示向全局地址发送。
PS由PF决定其含义
DA表示报文要发送的目标地址
GE表示PS在PDU2中与PF的4个最低有效位能够共同确定4096个PDU2格式参数组
数据场
数据场包含了参数组中的数据内容,通常控制类参数组数据长度等于8;其中未定义的字节以0xFF填充,已备将来分配;如果参数组数据长度超过8,要使用传输协议。
参数组与PGN
参数组数目=[240(PDU1)+16*256(PDU2)]*2(DP)=8672
PGN计算
PDU1格式
PGN=PF*256
PDU2格式
PGN=PF*256+GE
3. CAN帧ID与J1939PGN转换例子
PGN是参数组编号,对于制定CAN协议来说十分重要,很多ECU在接受报文时识别的就是PGN而不是报文的ID,报文ID作为报文的名字,是没一条报文专有的名字,而一个PGN不仅仅对应一条报文。CAN的扩展帧使用29位标识符,报文ID共有四个字节32位,PGN共有3个字节24位,两者有重合但是PGN并不是ID的一部分。
PGN的24位分别是:6个bits的0,一个扩展数据页(EDP)、数据页(DP)、PF、GE。当PF<240的时候,GE=0,否则GE正常取值。下面是两个例子:
报文ID:18FECA17
第一个字节是18,转换为二进制是0001 1000 ,可以看到优先级是110(十进制的6),DP=0,R=0
第二个字节是PF=FE(十进制是254>240),
第三个字节是GE,
第四个字节是17
这里因为PF>240,所以GE=CA,所以PGN=FECA
报文ID:0CDAEE17
第一个字节是0C,转换为二进制为 0000 1100,优先级011(十进制的3),DP=0,R=0
第二个字节是PF=DA(十进制是218<240)
第三个字节是GE
第四个字节是17
这里因为PF<240,所以GE=0,所以PGN=DA00
例如:0x18 FE DF 00 = 110 | 0 0 | 11111110 | 11011111| 00000000
P R DP PF PS SA
具体参数即为数据段(0-64).
优先级为 P = 110(2)或6(10)
PF>240则参数组(PGN)编号为 FEDF(16)或65247(10)
注意:PF<240 , PGN低字节置零.
如0x18E8FF00 PGN=E800(16) 59392(10) (PF<240)
手机版|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )
GMT+8, 27-4-2024 09:08 , Processed in 1.049656 second(s), 28 queries .
Powered by Discuz! X3.5
© 2001-2012 Comsenz Inc.