注册 登录
汽车工程师之家 返回首页

zxgcan的个人空间 http://www.cartech8.com/?748231 [收藏] [复制] [分享] [RSS]

日志

CAN 帧ID 与J1939 PGN总结

热度 1已有 958 次阅读10-1-2018 16:19 |个人分类:CAN与J1939

对于CAN ID的理解

在接触CAN之前,应该接触过IIC通信,在IIC通信中,在同一条IIC通信总线上每个device有唯一的ID,后续对于device的操作都是通过唯一的ID号来区分。而CAN ID虽然也叫ID,但是意义却不一样,每个CAN device可以接收和发送多条不同的ID报文。

比如在一条CAN总线上有三个device,叫做A,B,C吧。

A device有接收ID202302;发送ID101102

B device有接收ID101303;发送ID201202

C device有接收ID101102201;发送ID302303

如果A device发送了ID101的一条报文,因为B deviceC device都有接收为101ID,那么B deviceC device都可以接收到这条报文。

如果A device发送了ID102的一条报文,因为只有C device都有接收为102ID,那么只有C device可以接收到这条报文。

如果B device发送了ID202的一条报文,因为只有A device都有接收为202ID,那么只有A device可以接收到这条报文。

可以看出,CAN ID其实是个报文过滤器,当总线上报文的ID和自己接收的ID有相匹配的时候,就可以接收相应的报文。

CAN中的ID是为了定义相应的报文的含义,每个ID对应有自己的具体含义。

比如,101为电压信号,201为电流信号,这样当A device要发送电压信号时候,就用101 ID的报文,BC 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)PFPDU格式场)和PS(群扩展场)等要素。

SPN(SPN:Suspect Parameter Number)PG(参数组)下面的具体参数的一个编号,而PGN是参数组编号,可以理解为一个PGN包含了按一定方法分类的一组参数,而每个具体参数又有它自己的编号(就是SPN)。
    SAE J1939的应用层以PGNSPN的方式具体规定了车辆使用的每个参数的数据长度,数据类型,分辨率和数据范围等。

2.    参数组编号(PGN
在识别 CAN 数据帧的数据域属于哪个参数组时,需要一个 24 位的值。这个 24 位的值首先发送最低字节(见表 2,最低字节先发送,其次是中间字节,最后是最高字节)。 PGN 是一个 24 位的值,包括以下部分:保留位、数据页位、 PDU 格式域(8 位)和组扩展域(8 位)。若 PF 值小于 240(F016)PGN 的低字节置 0。否则,将其值设为组扩展域的值。

 

if (PDUF < 240)     //PDUFPF , PDUSPS
PGN = PDUF*256; // PDU1

else
    PGN = PDUF*256 + PDUS; // PDU2


PF用来确定PDU格式:

0——239表示PDU1格式,PDU1格式报文表示向特定或全局地址发送。

240——255表示格式2PDU2格式报文表示向全局地址发送。

PSPF决定其含义


DA表示报文要发送的目标地址

GE表示PSPDU2中与PF4个最低有效位能够共同确定4096PDU2格式参数组

数据场

数据场包含了参数组中的数据内容,通常控制类参数组数据长度等于8;其中未定义的字节以0xFF填充,已备将来分配;如果参数组数据长度超过8,要使用传输协议。

参数组与PGN

参数组数目=[240(PDU1)+16*256(PDU2)]*2(DP)=8672

PGN计算

PDU1格式

PGN=PF*256

PDU2格式

PGN=PF*256+GE

3.    CANIDJ1939PGN转换例子

PGN是参数组编号,对于制定CAN协议来说十分重要,很多ECU在接受报文时识别的就是PGN而不是报文的ID,报文ID作为报文的名字,是没一条报文专有的名字,而一个PGN不仅仅对应一条报文。CAN的扩展帧使用29位标识符,报文ID共有四个字节32位,PGN共有3个字节24位,两者有重合但是PGN并不是ID的一部分。

PGN24位分别是:6bits0,一个扩展数据页(EDP)、数据页(DP)、PFGE。当PF<240的时候,GE=0,否则GE正常取值。下面是两个例子:

报文ID18FECA17

第一个字节是18,转换为二进制是0001 1000 ,可以看到优先级是110(十进制的6),DP=0R=0

第二个字节是PF=FE(十进制是254>240)

第三个字节是GE

第四个字节是17

这里因为PF>240,所以GE=CA,所以PGN=FECA

报文ID0CDAEE17

第一个字节是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)

 

发表评论 评论 (2 个评论)

回复 llm5271 12-1-2018 16:30
很好  收藏了。
回复 llm5271 12-1-2018 16:31
我正在找J1939的DBC

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

渝公网安备 50010802001066号

手机版|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.

返回顶部