汽车CAN、LIN汇总

目录: 
一、准备知识
1、什么是CAN
2、汽车网络发展时间轴
3、如何通信
4、CAN总线结构
1)ISO 11898   2)CAN 和 J1850的比较   3)CAN 和 UART的比较
5、关于节点
1)什么是节点   2)节点:报文传送   3)节点组成   4)节点: CAN控制器   5)节点:CAN收发器
6、CAN协议
1)ISO标准化的CAN协议   2)CAN诊断协议
7、标准规格
二、CAN报文基础
1、CAN报文的特点
2、物理层特征(硬件电路)
3、帧种类介绍
4、各种帧构成
1)数据帧构成    2)遥控帧构成   3)错误帧构成   4)超载帧构成   5)帧间隔构成
5、总线仲裁
6、位时序(波特率)
7、位填充
8、同步如何取得
10、STM32的CAN总线J1939数据格式说明
1)CAN2.0A标准帧   2)CAN2.0B扩展帧   3)CAN读取解析
三、AutoSAR
1、什么是AutoSAR
2、什么是网络管理
3、什么是CAN总线
4、CAN总线的AutoSAR网络管理报文(以下简称NM报文)
5、CAN NM状态介绍
6、定时器及参数介绍
7、状态机
8、CAN矩阵表识读
1)概述    2)报文名称   3)报文类型   4)报文标识符   5)报文发送类型
9、CAN解析方式
10、CAN实际测试
1)概述    2)发送与接收概况   3)报文解析
四、LIN基础
1、Lin的网络拓扑
2、Lin Frame
3、Lin的通信规则
参考

--------------------------------------------------------------------------------------------------------------

一、准备知识

1、什么是CAN


CAN是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。由德国电气商博世公司在1986 年率先提出。 CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。
CAN具有很高的可靠性,广泛应用于:汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。
----------------------------------------------------------

2、汽车网络发展时间轴

汽车CAN、LIN汇总_第1张图片
----------------------------------------------------------

3、如何通信


1)脉宽调制(Pulse Width Moduleated;PWM) 运用2条线路以差动方式进行传输,最高速率为41.6kbps;
可变脉宽调制(Variable Pulse Width;VPW)方式,仅使用1条线路就可传输,最高速率为10.4kbps。 
– Adopted by GM; also known as Class 2.通用的第二代串行数据传输总线。可变脉宽。
– Adopted by Chrysler (known as J1850).
– Some references to VPW mode heard about in regards to Toyota (and Honda ).
--------------------------------
2)J1850 PWM
– Adopted by Ford; also known as Standard Corporate Protocol (SCP).
– Also seen in some Mazda products.
– Some references to PWM mode heard about in regards to Mitsubishi.
– 41.6 kbps, two wire balanced signal.
--------------------------------
3)ISO 9141 and ISO 9141-2 (also known as ISO 9141 CARB)
– Seen in some Chrysler and Mazda products.
– Seems to be more common in Europe.
– 10.4 kbps, single wire.
--------------------------------
4)LIN介绍
低成本,基于通用UART接口。
极少的信号线即可实现国际标准ISO 9141规定;
传输速率最高可达20kbits;
单主控器多从设备模式,无需仲裁机制;
从节点不需晶振就能实现自同步,节省了从设备的硬件成本;
不需要改变LIN从节点的硬件和软件就可以在网络上增加节点;
通常一个LIN网络上节点数目小于12个。
比如:TJA1021

 汽车CAN、LIN汇总_第2张图片


--------------------------------
5)如何进入这个领域
UART : LIN、K Line、Keyword、ISO 9141、J1708;
CAN : 高速双线CAN、单线CAN、低速容错CAN J1939、GMLAN高层协议;
J1850 : GM Class 2 (vpw 3 byte header)、福特SCP (pwm),、and Chrysler J1850 (vpw 1 byte header)‏;
其他:FlexRay, MOST, Ethernet?
--------------------------------
6)LIN ISO9141

汽车CAN、LIN汇总_第3张图片
LIN单线传输,成本低,单主机多从机;
座位、车门与天窗模块、开关面板、汽车方向盘、乘员舒适系统。

 汽车CAN、LIN汇总_第4张图片


--------------------------------
7)为什么需要网络通信
考虑到线束重量以及花费,减少传感器,在线诊断问题,高传输率,抗干扰,减少连接器。
----------------------------------------------------------

4、CAN总线结构


1)ISO 11898


--------------------------------
2)CAN 和 J1850的比较
相似的报文大小,相似的仲裁/优先权设置,CAN 具有更高的速率,CAN 具有更好的仲裁定义,CAN 是更开放的标准,CRC 校验。
--------------------------------
3)CAN 和 UART的比较
有许多不同的UART标准,UART 成本最低,UART 只能低速运行,报文可能很长,无仲裁机制 : 破坏性或主从模式。

 汽车CAN、LIN汇总_第5张图片

----------------------------------------------------------
5、关于节点
1)什么是节点
1个节点是一个ECU(电控单元),1个ECU也可以是多个节点。

汽车CAN、LIN汇总_第6张图片
ECU电控单元:
动力、照明、操作、显示、安全、娱乐等,发动机控、注油控制、加速刹车控制、防抱死系统。
--------------------------------
2)节点:报文传送

 汽车CAN、LIN汇总_第7张图片


所有节点接收总线上的所有报文,节点通过过滤捕获相关报文,总线空闲时任何节点都可以发送报文。

汽车CAN、LIN汇总_第8张图片
--------------------------------
3)节点组成

 汽车CAN、LIN汇总_第9张图片


--------------------------------
4)节点: CAN控制器
(1)NXP SJA1000
执行CAN协议标准或扩展型

汽车CAN、LIN汇总_第10张图片
CAN通讯协议的实现,包括各种通讯帧的组织和发送,均由集成在SJA1000通讯控制器中的电路实现应用层软件的核心部分是CPU与SJA1000通讯控制器之间的数据接收和发送程序,即CPU把待发的数据发给SJA1000通讯控制器,再由SJA1000通讯控制器发到总线上;当SJA1000通讯控制器从总线接受到数据后,CPU再把数据取走。
对于单片机而言,操作SJA1000就象访问外部RAM一样。对SJA1000中的有关控制寄存器写入控制字,进行初始化。之后CPU即可通过SJA1000接收/发送缓冲区向物理总线接收和发送数据。
-----------------
(2 )MicroChip MCP2551

 汽车CAN、LIN汇总_第11张图片


​MCP2515是一款独立CAN协议控制器,完全支持CAN V2.0B技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的报文,因此减少了主单片机MCU的开销。它与MCU的连接是通过标准串行外设接口SPI实现。

MCP2551是MicroChip生产的一款高速CAN收发器。 可作为CAN协议控制器和物理总线接口。MCP2551可为CAN协议控制器提供差分收发能力,它完全符合ISO-11898标准,包括能满足24V电压要求。
-----------------
(3)NXP UJA1169
它是一款微型高速CAN系统基础芯片(System Basic Chip即SBC)。
①在待机和睡眠模式下具有非常低的静止电流,具有完全唤醒能力,本地引脚唤醒或CAN网络远程唤醒,唤醒源识别;
②两路LDO电源输出,V1=5V/3.3V/ 250mA ,V2=5V/ 100mA ;
③ISO 11898-2:2016和SAE J2284-1到SAE J2284-5兼容的高速CAN收发器,支持CAN FD数据场高达5MBit/S的CAN FD有源通信(所有六种变体);
④专用的 Limp (移步:汽车电子知识汇总之 四、汽车LimpHome跛行模式 )输出引脚用来标记系统故障;
⑤无引脚HVSON20封装对焊接有要求,手工焊接困难。

汽车CAN、LIN汇总_第12张图片
-----------------
(4)Infineon TLE9461
它是一款微型高速CAN系统基础芯片(System Basic Chip即SBC)。
①停止和睡眠模式非常低的静态消耗;
②两路LDO电源输出,V1=5V/1 50mA ,V2=5V/ 100mA ;
③高速CAN收发器支持高达5MBit/S的FD通信,符合ISO 11898-2:2016和SAE J2284;完全符合LIN、CAN和FlexRay汽车接口的硬件要求;
④电荷泵-输出N通道MOS反极性保护,集成扩频调制功能,获得最佳EMC性能;
⑤故障安全信号的失败输出,可用于 Limp 功能;
⑥PG-TSDSO-24-1封装,类似于TSSOP封装。

 汽车CAN、LIN汇总_第13张图片


-----------------
(5)8脚CAN控制器+Limp功能
使用NXP SJA1000、MicroChip MCP2551或NXP TJA1044T等,外加分立元件Limp功能。
--------------------------------
5)节点:CAN收发器
标准双线“High Speed”CAN (ISO11898),0~3V不同电压传送:
ΔV > 1.0V 为显性  
ΔV < 0.5V 为隐性
自动瞬时保护,数字 I/O 与 CAN 控制器交互。
CAN分类:高(中)速Dual-Wire CAN、低速Single-Wire CAN、Fault-Tolerance CAN。
(1)单线CAN之SW-CAN
General Motors创建 (J2411 or GMW 3089),普通模式33.3Kb/高速模式83.3Kb,高电压唤醒用于唤醒休眠模式。

汽车CAN、LIN汇总_第14张图片
-----------------
(2)Low Speed Fault Tolerant CAN
低速 : 125 kbits,一定的错误条件下CAN可以单线模式运行,每个节点都必须接终端电阻。

 汽车CAN、LIN汇总_第15张图片


----------------------------------------------------------

6、CAN协议


1)ISO标准化的CAN协议

汽车CAN、LIN汇总_第16张图片
【注】
LLC:Logical Link Control逻辑链路控制;MAC:MediumAccess Control媒介访问控制;
从上图可以知道CAN总线底层硬件的内容(CAN控制器、收发器)主要位于OSI的第1层和第2层。
--------------------------------
2)CAN诊断协议
ISO 9141、ISO 14230 (Keyword 2000)、ISO 15765 (CAN 上运行的Keyword 2000)
----------------------------------------------------------

7、标准规格

汽车CAN、LIN汇总_第17张图片
CAN 协议和标准规格

汽车CAN、LIN汇总_第18张图片
通信协议分类
【注】*1 SAE: Society of Automotive Engineers,*2 Class: SAE 的分类名称
--------------------------------------------------------------------------------------------------------------

二、CAN报文基础


1、CAN报文的特点


(1)多主控制。总线空闲时,所有单元都可发送消息,而两个以上的单元同时开始发送消息时,根据标识符(ID非地址)决定优先级。两个以上的单元同时开始发送消息时,对各消息ID的每个位进行逐个仲裁比较。仲裁获胜(优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。 
(2)系统柔软性。连接总线的单元,没有类似“地址”的信息,因此,在总线上添加单元时,已连接的其他单元的软硬件和应用层都不需要做改变。
(3)速度快,距离远。最高1Mbps(距离<40m),最远可达10Km(速率<5Kbps)。 
(4)具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。  
(5)故障封闭功能。CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
(6)连接节点多。CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
(7)广播方式发送数据,面向内容编址,接收设备不需要有物理目的地址。
----------------------------------------------------------

2、物理层特征(硬件电路)

汽车CAN、LIN汇总_第19张图片
ISO11898标准物理层特征
CAN 控制器根据CAN_L和CAN_H上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
显性电平对应逻辑:0
CAN_H和CAN_L之差为2V左右。
隐性电平对应逻辑:1
CAN_H和CAN_L之差为0V。

汽车CAN、LIN汇总_第20张图片

 汽车CAN、LIN汇总_第21张图片

----------------------------------------------------------

3、帧种类介绍


数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符(ID),扩展格式有 29 个位的 ID。各种帧的用途如下表。

汽车CAN、LIN汇总_第22张图片
----------------------------------------------------------

4、各种帧构成


1)数据帧构成

汽车CAN、LIN汇总_第23张图片
(1)帧起始。标准帧和扩展帧都是由1个位的显性电平表示帧起始。
-----------------
(2)仲裁段。表示数据优先级的段,标准帧和扩展帧格式在本段有所区别,如图所示:

 汽车CAN、LIN汇总_第24张图片


ID:高位在前,低位在后。基本ID,禁止高7位都为隐性,即不能:ID=1111111XXXX;
RTR:远程请求位。0数据帧,1远程帧;
SRR:替代远程请求位。设置为1(隐性电平);
IDE:标识符选择位。0标准标识符,1扩展标识符。
-----------------
(3)控制段。 由6个位构成, 表示数据段的字节数。标准帧和扩展帧的控制段稍有不同,如图所示:

汽车CAN、LIN汇总_第25张图片
r0、r1:保留位。必须以显性电平发送,但是接收可以是隐性电平;
DLC:数据长度码。0~8表示发送/接收的数据长度(字节);
IDE:标识符选择位。0标准标识符,1扩展标识符。
-----------------
(4)数据段。该段可包含0~8个字节的数据,从最高位(MSB)开始输出。标准帧和扩展帧在这个段的格式完全一样:

 汽车CAN、LIN汇总_第26张图片


*1 保留位(r0、r1)
保留位必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。
*2 数据长度码(DLC)
数据长度码与数据的字节数的对应关系如表 8 所示。
数据的字节数必须为 0~8 字节。但接收方对 DLC = 9~15 的情况并不视为错误。
-----------------
(5)CRC段。该段用于检查帧传输错误。由15个位的CRC顺序和1个位的CRC界定符(用于分隔的位)组成,标准帧和扩展帧在这个段的格式也是相同的。 参加CRC校验的位场包括帧起始、仲裁场、控制场、数据场(假若存在)在内的 无填充位流 。

汽车CAN、LIN汇总_第27张图片

CAN总线数据传输的过程中,可能会因为某些原因导致数据被篡改,导致该帧出现错误,为了避免出现这样的问题,设计了CRC段, CRC校验段是CAN控制器自动完成,发送节点会根据发送的内容得到一个CRC段,接收节点会根据接收到的内容进行CRC计算,并进行对比 ,不一致时会通报错误。
CRC校验算法详见:https://blog.csdn.net/liht_1634/article/details/124328005​。

汽车CAN、LIN汇总_第28张图片

-----------------


(6)ACK段。此段用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位组成。标准帧和扩展帧在这个段的格式也是相同的:

汽车CAN、LIN汇总_第29张图片

发送单元ACK段:发送2个隐性位。
接收单元ACK段:接收到正确消息的单元,在ACK槽发送显性位,通知发送单元,正常接收结束。称之为发送ACK/返回ACK。
注意:发送 ACK 的是既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送ACK)。正常消息是指:不含填充错误、格式错误、CRC 错误的消息。

汽车CAN、LIN汇总_第30张图片
-----------------
(7)帧结束。由7个隐性位组成。标准帧和扩展帧在这个段格式完全一样。
--------------------------------
2)遥控帧构成
遥控帧由6个域组成:帧起始、仲裁域、控制域、CRC域、应答域和帧结束。遥控帧不存在数据域。

 汽车CAN、LIN汇总_第31张图片

遥控帧的RTR位必须是隐位1,没有数据段。 无数据段的数据帧和遥控帧可通过RTR位区别开来。
DLC的数据值是独立的,它可以是0~8中的任何数值,为对应数据帧的数据长度。
--------------------------------
3)错误帧构成

汽车CAN、LIN汇总_第32张图片
(1)位错误,如果被发送位与接收位不同位填充错误,5个相同位应插入一个填充位。
(2)CRC错误
(3)ACK错误,发送者收不到接收者的ACK
(4)格式错误,不符合帧格式。
上述错误的次数,都会记录在错误寄存器中
三种错误状态:
Error Active State 收发错误总和低于128或者其中之一超过96;
Error Passive State 收发错误总和达到128;
Bus off 总线关闭状态:收发错误总和大于255。
错误帧-信号错误

 汽车CAN、LIN汇总_第33张图片


--------------------------------
4)超载帧构成
发送超载帧的超载条件: 
要求延迟下一个数据帧或远程帧
在间歇段检测到显位

汽车CAN、LIN汇总_第34张图片
--------------------------------
5)帧间隔构成
过载帧和错误帧之间没有帧间隔
----------------------------------------------------------

5、总线仲裁

汽车CAN、LIN汇总_第35张图片


同时多个单元发送数据时,总线仲裁过程:

汽车CAN、LIN汇总_第36张图片
规律:
(1)总线空闲时,最先发送的单元获得发送优先权,一但发送,其他单元无法抢占;
(2)如果有多个单元同时发送,则连续输出显性电平多的单元,具有较高优先级。
从ID开始比较,如果ID相同,还可能会比较RTR和SRR等位。
----------------------------------------------------------

6、位时序(波特率)


由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位一般可以分为如下四段:
同步段(SS)
传播时间段(PTS)
相位缓冲段1(PBS1)
相位缓冲段2(PBS2)
这些段又由可称为 Time Quantum(以下称为Tq)的最小时间单位构成。
1 位分为4 个段,每个段又由若干个Tq 构成,这称为位时序。
位时间=1/波特率,因此,知道位时间,我们就可以知道波特率。
1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。
位时序各段的作用和 Tq 数如下表:

汽车CAN、LIN汇总_第37张图片
一个位的构成:

 汽车CAN、LIN汇总_第38张图片


图中采样时间加大或减少量的最大值就是SJW
位时序由CAN控制器内部硬件自动完成。
----------------------------------------------------------

7、位填充

汽车CAN、LIN汇总_第39张图片
若一直维持电平状态时间长,将会产生累计误差,故使用位填充解决。
连续出现5个相同电平时就需要插入1个反向电平, 比如5个0则需要插入一个1,但这个1在读数时需去掉。位填充的数据不需要编程控制,由CAN控制器自动完成。

 汽车CAN、LIN汇总_第40张图片


http://​ https://blog.csdn.net/boyemachao/article/details/104059190 ​
----------------------------------------------------------

8、同步如何取得


CAN总线的通讯是采用NRZ(Non-Return to Zero,非归0)码,数据本身并不携带时钟信息,也即在每一位的开始或结束没有同步信号,发送单元以位时序同步的方式开始发送帧数据,接收单元根据总线电平的变化进行同步并进行接收工作。
然而,发送器和接收器之间由于彼此的时钟误差或传输路径的相位误差可能会失去同步关系,因此接收单元在接收帧的时候, 必须通过硬件同步或重新同步调整它的操作时序。

汽车CAN、LIN汇总_第41张图片
①首先进行硬同步
在总线空闲状态时,接收单元检测到SOF,就会执行这个同步调整过程。 “隐式”电平跳变到“显式”电平的边缘的时间点被认为是SS,而不管SJW的值。硬同步只发生在帧的起始。
如果沿出现在SS里,沿的相位误差e=0;
如果沿位于采集点(PBS1结束之前)之前,e>0;
如果沿位于采集点之后,e<0;
② 假如输出没有延迟,但是主机和从机晶振不同,虽然已实现硬同步,但是采集信息仍有问题,这时就进行重同步解决问题
重同步的本质为增加或减少位定位时间来和总线上的其他节点同步,
在接收过程中检测到总线电平发生了改变时执行重新同步操作。
每当检测到一个边沿(总线电平的改变),收发单元根据SJW值通过增加PBS1段或减少PBS2段来调整同步。 如果发生了超出SJW值的误差时,最大调整量不能超过SJW值。 

 汽车CAN、LIN汇总_第42张图片


调整同步的规则
硬件同步和再同步的执行遵从如下规则:
(1) 在1个位时间里(或者说在2个采样点之间),只允许1个同步(或者说只进行1次同步调整)。
(2) 只有当采样点之前的总线电平和边沿后的总线电平不同时,该边沿才能用于调整同步。
(3) 如果出现隐性电平到显性电平变化的边沿,且条件(1)和(2) 满足,将进行同步。
(4) 如果在帧间间隙期间发生隐性电平到显性电平的信号边沿(除了间隙里的第一位),则总会执行硬件同步。
(5) 如果发生从所有其它隐性电平到显性电平的信号边沿,则执行再同步。
(6) 如果发送单元自身输出的显性电平被检测到有延迟,则不执行再同步。
----------------------------------------------------------

10、STM32的CAN总线J1939数据格式说明


CAN是ISO国际标准化的串行通信协议,CAN技术规范包含A和B两部分。2.0A给出了曾在CAN技术规范版本1.2中定义的CAN报文格式,能提供11位地址;而2.0B给出了标准的和扩展的两种报文格式,提供29位地址。
J1939是总线通信的协议,而ISO11898与ISO11519-2是根据总线协议衍生出来的规范。 专为大型货车和重工机械车辆设计的 J1939 协议。
--------------------------------
1)CAN2.0A标准帧
CAN 标准帧信息为11个字节,包括两部分:信息和数据部分。前3个字节为信息部分。
Byte1(第1个字节)控制端:数据的字节及保留位的段。
Byte2~3 仲裁段:表示该帧优先级的段(即Message ID)。
Byte4~11 数据段:数据内容,可发送0~8个字节的数据。

汽车CAN、LIN汇总_第43张图片
字节1为帧信息。第7位(FF)表示帧格式,在标准帧中,FF=0;第6位(RTR)表示帧的类型,RTR=0表示为数据帧,RTR=1表示为远程帧;
DLC表示在数据帧时实际的数据长度。
字节2~3为报文识别码,11位有效。
字节4~11为数据帧的实际数据,远程帧时无效。
--------------------------------
2)CAN2.0B扩展帧
CAN 标准帧信息为13个字节,包括两部分:信息和数据部分。前5个字节为信息部分。
Byte1(第1个字节)控制端:数据的字节及保留位的段。
Byte2~3 仲裁段:表示该帧优先级的段(即Message ID)。
Byte4~11 数据段:数据内容,可发送0~8个字节的数据。

汽车CAN、LIN汇总_第44张图片


字节1为帧信息。第7位(FF)表示帧格式,在扩展帧中,FF=1;第6位(RTR)表示帧的类型,RTR=0表示为数据帧,RTR=1表示为远程帧;DLC 表示在数据帧时实际的数据长度。
字节2~5为报文识别码,其高29位有效。
字节6~13数据帧的实际数据,远程帧时无效。
--------------------------------
3)CAN读取解析
从输入流获取到字节数组,按上面两图表中字节的含义可以获取到需要的参数信息。
这里CAN一次读取获取的不只一帧数据,是多条帧掺杂在一起,所以做法是byte数组转成16进制字符串,和CAN协议里的Message ID比对,判断是否包含你要的MessageID,包含则获取它后边的8个字节数据,按照协议文档解析。

汽车CAN、LIN汇总_第45张图片
 

typedef struct
{
   uint32_t StdId;
   uint32_t ExtId;
   uint8_t IDE;
   uint8_t RTR;
   uint8_t DLC;
   uint8_t Data[8];
   uint8_t FMI;
}CanRxMsg;


接收与发送结构体一样,只是名字不同CanTxMsg。

 汽车CAN、LIN汇总_第46张图片


如上所示,在J1939中CAN帧结构为32位,包括优先级、PDU格式(PF)、PS、SA。而在STM32的结构体中却是32位ID,8位
IDE、RTR、DLC。如果要单独提取标识符中的某1个又如何提取?这涉及STM32收发邮箱的寄存器存储结构。

汽车CAN、LIN汇总_第47张图片
对于J1939协议来说,必须对帧数据和优先级、PF、PS、SA进行双向解析。所以在发送或接收数据时必须做一定的处理。在STM32的固件库中该寄存器中的各个部分的值取出来赋给其结构体中各个部分的值。
发送数据时:

u32 Id_Ext = 0x00000000;
Id_Ext = Id_Ext|Priority<<26;
Id_Ext = ((Id_Ext>>16)|Pdu_PF)<<16;
Id_Ext = ((Id_Ext>>8)|Pdu_Ps)<<8;
Id_Ext = Id_Ext|Pdu_Sa;


接收数据时

PDU_PF = (RxMessage.ExtId&0x00ff0000)>>16;
PDU_PS = (RxMessage.ExtId&0x0000ff00)>>8;
PDU_SA = RxMessage.ExtId&0x000000FF;


注意:在帧结构图中我们看到PF被分成了两部分,而在上面的处理中PF却是连在一起的8位。这又是怎么回事呢?这就要归结为ExtId这个结构体成员的具体形式了。

 


想通过这个ExtId数据位结构的说明,对于如何对帧数据和优先级、PF、PS、SA进行双向解析有了比较清楚的认识了吧。可以结合下面这个STM32中的函数对比着看更容易理解。

void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage)
{
  assert_param(IS_CAN_ALL_PERIPH(CANx));
  assert_param(IS_CAN_FIFO(FIFONumber));
  
  RxMessage->IDE = (uint8_t)0x04 & CANx->sFIFOMailBox[FIFONumber].RIR;
  if (RxMessage->IDE == CAN_ID_STD)
    RxMessage->StdId = (uint32_t)0x000007FF & (CANx->sFIFOMailBox[FIFONumber].RIR>> 21);
  else
    RxMessage->ExtId = (uint32_t)0x1FFFFFFF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 3);
  
  RxMessage->RTR = (uint8_t)0x02 & CANx->sFIFOMailBox[FIFONumber].RIR;
  RxMessage->DLC = (uint8_t)0x0F & CANx->sFIFOMailBox[FIFONumber].RDTR;
  RxMessage->FMI = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDTR >> 8);
  RxMessage->Data[0] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDLR;
  RxMessage->Data[1] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 8);
  RxMessage->Data[2] = (uint8_t)0xFF & (CANx>sFIFOMailBox[FIFONumber].RDLR >> 16);
  RxMessage->Data[3] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 24);
  RxMessage->Data[4] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDHR;
  RxMessage->Data[5] = (uint8_t)0xFF &(CANx>sFIFOMailBox[FIFONumber].RDHR >> 8);
  RxMessage->Data[6] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 16);
  RxMessage->Data[7] =  (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 24);
 
  CAN_FIFORelease(CANx, FIFONumber);
}

三、AutoSAR


1、什么是AutoSAR


AutoSAR就是AUTomotive Open System ARchitecture汽车开放系统架构,它是由全球汽车OEM和供货商共同推出的一种汽车电子嵌入式软件分层架构。该分层架构由微控制器抽象层、ECU抽象层、服务层、执行时环境(RTE)和应用层组成,前三层被统称为基础软件(BSW)。
将汽车电子控制单元(ECU)的软件底层做了一个标准的封装。使得大家都能共用一套底层软件,只需要修改其中的一些参数,就可以匹配不同硬件,也可以匹配不同的应用层软件。如此之后,用户只需要专心负责应用层功能开发即可,底层都交给AutoSAR工程师就行了。也就是一套写的比较好的底层软件,其实现了硬件驱动的封装(类似于STM32的库),实现了操作系统的功能。用户只需要开发操作系统上层的软件应用即可(基于安卓开发App)。从开发的角度来讲,提高了代码的复用性,降低了代码的复杂度,提高了代码的可维护性。
----------------------------------------------------------

2、什么是网络管理


目的是使网络中的ECU节点有序的睡眠和唤醒。在没有通信需求的时候睡眠,在需要通信的时候唤醒,可以节约汽车电池的电量。

汽车CAN、LIN汇总_第48张图片

汽车CAN、LIN汇总_第49张图片
----------------------------------------------------------

3、什么是CAN总线


CAN是控制器局域网络(Controller Area Network)的简称,是一种能够实现分布式实时控制的串行通信网络。
----------------------------------------------------------

4、CAN总线的AutoSAR网络管理报文(以下简称NM报文)


首先要明确一点,NM报文就是CAN报文。NM报文符合CAN报文的格式,由帧起始、仲裁段、控制段、数据段、CRC段、应答段、帧结尾组成。一般厂家在设计的时候会规定好NM报文的ID范围。
例子:规定标识符在0x500~0x5FF范围为NM报文。当在CANoe(CAN open environment)中抓取到此ID范围内的报文,那就是NM报文。

汽车CAN、LIN汇总_第50张图片
图2.4.1 此报文ID=0x502,那么它就是一帧NM报文
关于仲裁:

 汽车CAN、LIN汇总_第51张图片


图2.4.2

汽车CAN、LIN汇总_第52张图片
图2.4.3 NM报文数据段
NM报文的重点在于数据段8字节里的内容:

 


图2.4.4 NM报文数据段内容格式
Byte0:
这里填的是ECU的地址,或者叫ECU的ID;
此报文的ID=1个基础值+ECU的ID,例如厂家规定基础值为0x500,那么此报文的ID=0x500+0x8=0x508;
这里要注意区分报文的ID和ECU ID的概念,很容易混淆。
Byte1:

汽车CAN、LIN汇总_第53张图片
图2.4.5 NM报文数据段byte1格式
bit0:当此位置1时强制进入RMS(下面会讲到)。
bit4:告诉其他节点自身是怎么被唤醒的。
置0:被动唤醒、远程唤醒,比如被其他节点发送的NM报文唤醒
置1:主动唤醒、本地唤醒,比如给ECU上电
byte2~byte7里的user data数据由用户自行定义。
----------------------------------------------------------


5、CAN NM状态介绍


AutoSAR网络管理有三种状态,如下。
(1)睡眠模式(Bus-Sleep Mode):当节点没有本地网络唤醒以及远程唤醒请求时,ECU通讯控制器切换至睡眠模式,ECU功耗降低至适当水平;此模式下,NM报文只收不发,APP报文不收不发,当出现有效唤醒源时必须要被唤醒。
-----------------
(2)预睡眠模式(Prepare Bus-Sleep Mode):这个状态是为了等待总线上的所有节点能够在进入Bus-Sleep Mode之前有时间停止节点的active状态(如清空队列中为发送的报文);此模式下,NM报文只收不发,APP报文不收不发,如果缓冲区有APP报文那可以继续发完。
-----------------
(3)网络模式(Network Mode):包含3个子状态,如下。
重复报文状态(Repeat Message State):NM报文可收可发,APP报文可收可发;
正常工作状态(Normal Operation State):NM报文可收可发,APP报文可收可发;
准备睡眠状态(Ready Sleep State):NM报文只收不发,APP报文可收可发。
总结见下图:

汽车CAN、LIN汇总_第54张图片
----------------------------------------------------------

6、定时器及参数介绍

汽车CAN、LIN汇总_第55张图片
----------------------------------------------------------

7、状态机


名词解释:
BSM-睡眠模式        NM-网络模式         PBM-预睡眠模式
RMS-重复报文模式 NOS-正常操作状态 RSS-准备睡眠模式
01:给ECU上电,ECU自己就会初始化进入睡眠模式。如果没有唤醒源来唤醒此节点,那就会一直待在睡眠模式。
02+03:当出现本地唤醒(03)或者远程唤醒(02)时,进入RMS状态。这里再解释下,本地唤醒就是我自己想要主动和其他节点通信;远程唤醒是其他节点想要和我通信。
04:我们现在已经走到网络模式的重复报文子状态了。话说为什么叫重复报文子状态呢,因为在这个状态里的时候,ECU需要一直发送周期报文,来告诉别人:我在线,性感ECU在线陪聊,你再不来找我我就要开始想念你......
如果是走03(本地唤醒)进来的,那么需要先在NM Immediate Transmit State中以很快的周期发送N帧报文(例:以20mS的周期连续发送5帧报文),发完这N帧报文再进入到NM Normal Transmit State中以正常的周期发送报文(例:500mS为周期发送报文。这个在上面的表格里有定义)。如果是直接走02进来的,那么直接以正常周期发送NM报文就可以了。一直发到T_repeat_message定时器超时。
这一步的目的是如果是本地唤醒的话,可能此ECU下面还有很多从属节点,当此ECU唤醒之后,需要同时唤醒其他兄弟节点一起通信,所以最开始的N帧报文周期很短,目的是为了快速、低延迟地唤醒其他节点。为什么被远程唤醒就不需要这一步呢?
06+12:且慢,我们先来计算一下从BSM到这一步花费了多少时间了。参考上面定时器的定义,在02或03中,最大唤醒时间为T_wake_up=200ms;在04中,T_repeat_message=1600mS。总计1800mS,差不多为2S的时间,此时ECU有可能已经不需要通信了(ECU持续处于唤醒状态的条件是有持续的唤醒源,例如一直有NM报文远程唤醒、或一直有本地唤醒源例如上电)。如果还需要继续通信,走06,进入NOS,继续周期发送NM报文,可以收发APP报文,当不再需要通信了,就停止发送NM报文,等待T_NM_timeout超时之后走09;如果直接不需要通信了,直接走12。
10:收到本地唤醒,进入NOS。
11:收到NM报文的byte1字节的重复请求位如果置1,强制进入RMS。
08+14+05:T_NM_timerout定时器超时,不改变当前状态。定时器需要重置。
13:在RSS状态,NM报文不可以发送。等待T_NM_TIMEOUT定时器超时后进入PBM。
15+16:PBM状态只可以接收NM报文,其他报文不发不收。收到远程唤醒,走15;收到本地唤醒,走16。
17:如果PBM状态收不到任何唤醒源,在T_WAIT_BUS_SLEEP定时器超时后进入BSM。
DUT在RSS状态的时候,如果收到本地唤醒(如KL15电闭合),会走NM11进入RMS状态;那如果收到远程唤醒报文呢?根据主机厂的设计不同,可能会有下面两种Action:
(1)在RSS收到远程唤醒报文,不会发生状态跳转,但是会重置T_NM_TIMEOUT定时器,即在RSS状态收到持续的远程报文唤醒,会一直保持在RSS状态,此时DUT不能发出NM报文,但是可以收发APP报文;
-----------------
(2)在RSS状态收到远程唤醒报文,会重新进入NOS。

汽车CAN、LIN汇总_第56张图片
----------------------------------------------------------

8、CAN矩阵表识读


1)概述
在汽车行业开发的过程中,凡是挂在CAN总线上的产品,客户都会给一份CAN矩阵表,如何去读懂CAN矩阵表显得尤为重要,下面以某个车厂的CAN矩阵表为例来说明。

汽车CAN、LIN汇总_第57张图片
引自:CAN矩阵详解
--------------------------------
2)报文名称
Msg_Name主要是通过名称就能区分我们平时描述的是哪条报文,这个名称一般是唯一的,就像人的名称一样,一般客户也不是随便定义该名称,当然这个名称也可以随意定。
例如:NM_ASR_IPM查看后面的信号描述AutoSAR Network Management Frame Tx by IPM 从IPM发送的AutoSAR网络管理帧。
--------------------------------
3)报文类型
Msg_Type主要描述报文类型,在汽车行业中,报文主要类型有应用报文、网络管理报文、诊断报文。
应用报文Normal: Normal Communication message;
网络管理报文NM:Network Mangment message;
诊断报文Diag: Diagnostic message。
--------------------------------
4)报文标识符
Msg_ID是Message Identifier的缩写,在矩阵表中,一般同一个报文标识符的内容放在一起,方便阅读,这个标识符是CAN总线上的唯一标识符,不可与其他信号重复,在矩阵表中,一般加上0x开头,代表16进制显示,在前面已经提到过在标准帧CAN的标识符大小为11位,所以一般大小为0x00~0x7FF。扩展帧我们这儿不作描述,因为一般车厂使用的都是标准帧,很少采用扩展帧。
--------------------------------
5)报文发送类型
Msg_Send_Type表示的是报文发送的类型,在汽车行业中,报文发送的类型一般主要有事件型、周期型、周期事件型、使能型、周期使能型等,其他类型不做描述。
(1)事件型(Event)
事件报文的发送取决于事件是否触发,事件发生改变时,按照矩阵发送事件报文,非触发事件发生改变时不允许触发发送事件报文,事件型报文一般车厂都会要求一个事件触发的时候发送多次,为了避免报文丢失,每帧之间也会限定一个帧与帧之间的最小间隔。下图为最小间隔20mS,当在事件报文发送 20mS 之后有新的事件发生,则发送新的事件报文,丢弃上一个事件报文;当在事件报文发送 20mS 之内有新事件发生,则新事件报文延迟到 20mS 之后发送。

汽车CAN、LIN汇总_第58张图片


-----------------
(2)周期型(Cycle)
报文以一定的间隔时间循环发送,报文的发送周期在矩阵表都会有体现,开发的时候必须按照客户规定的周期进行开发,一般时间两帧之间的误差不能超过规定时间的百分之十。

汽车CAN、LIN汇总_第59张图片
-----------------
(3)周期事件型(CE)
CE意思是 Cycle and Event,当事件未发生时,报文以周期时间 T 循环发送,事件发生时,报文以快周期发送规定次数,周期事件型报文是一条比较特殊的报文,一般对实时性要求比较高,但是为了减少总线的负载,采用此方式。假设某车厂要求快周期为20mS,事件报文与周期报文发送的时间间隔不应小于 20mS。如果事件发生在周期报文发送之后 20mS 内,则事件报文延迟到周期报文发送 20mS 后再发送。如果事件报文发生在周期报文发送之前 20mS 内,则周期报文延迟到事件报文发送 20mS 后再发送;如果事件报文和周期报文发生冲突时,周期报文应延时到事件报文发送完成后 20mS 再发送。

 汽车CAN、LIN汇总_第60张图片


-----------------
(3)使能型(IfActive)
和事件型发送类型一样,使能发送类型由报文中的一个或多个信号触发,引起报文传输。当触发信号的“当前信号值≠非使能值时”,约束条件满足,触发条件发生,使能报文立刻以周期时间 T 循环发送。当信号值由使能值变为非使能值时并且再无其它使能信号,相应报文发送规定次数。

汽车CAN、LIN汇总_第61张图片
-----------------
(4)周期使能型(CA)
CA意思是Cycle if Active,当触发信号的“当前信号值=非使能值时”,报文以周期时间 T 循环发送,当触发信号的“当前信号值≠非使能值时”,约束条件发生,触发条件满足时,使能报文以周期发送直到“当前信号值=非使能值时”。

 汽车CAN、LIN汇总_第62张图片


-----------------
(5)报文周期时间
Msg_Cycle_Time主要是针对周期型报文、周期事件型报文和周期使能型,要注意这个周期时间的单位,一般默认为mS。
-----------------
(6)报文发送的快速周期
Msg_Cycle_Time_Fast指当报文发送类型不为周期型时,报文发送的快速周期。
-----------------
(7)报文快速发送的次数
Msg_Nr_Of_Reption指当报文发送类型不为周期型时,报文快速发送的次数。
-----------------
(8)报文延时时间
Msg_Delay_Time指当报文发送类型不为周期型时,相同ID报文之间的最小间隔。
-----------------
(9)报文长度
Msg_Length是指报文的长度,有的时候客户用Lenth表示,有的时候用DLC表示。对于标准帧的传输,这个值最大为8,也就是1帧传输的有效字节数最多为8个有效数据位。
-----------------
(10)信号名称
Signal_Name是指定义在数据位信号名称,这个标识符和报文标识符是差不多的,也是唯一的,一般信号名称都是英文的,这个是为了通过这个标识符来生成信号,可用于位定义,DBC文件名称。
-----------------
(11)信号描述
Signal_Description指该信号的用途,代表的意思一般是对该信号的描述。
-----------------
(12)排列格式
Byte_Order在汽车行业中有三种格式,分别是Intel,Motorola LSB,Motorola MSB。而有的时候车厂指写了Motorola,这个一般是指Motorola LSB。
数据类型定义:在汽车行业中,CAN传输的8个字节按照位定义了信号名称,定义名称如下图所示:

汽车CAN、LIN汇总_第63张图片
Intel格式:
当1个信号的数据长度不超过 1 Byte,并且信号在1个字节内实现时,该信号的高位将被放在该字节的高位,信号的低位将被放在该字节的低位,当1个信号的数据长度超过 1 Byte或者数据长度不超过 1 Byte,但是采用跨字节的方式实现时,该信号的高位将被放在高字节的高位,信号的低位将被放在低字节的低位,这样信号的起始位就是低字节的低位。

 汽车CAN、LIN汇总_第64张图片


Motorola LSB格式:
当1个信号的数据长度不超过 1 Byte并且信号在1个字节内实现时,信号的高位将被放在该字节的高位,信号的低位将被放在该字节的低位,这样信号的起始位就是该字节的低位,当1个信号的数据长度超过 1 Byte或者数据长度不超过1个字节但是采用跨字节方式实现时,该信号的高位将被放在低字节的高位,信号的低位将被放在高字节的低位,这样信号的起始位就是高字节的低位。

汽车CAN、LIN汇总_第65张图片
Motorola MSB格式:
当1个信号的数据长度不超过 1 Byte并且信号在1个字节内实现时,信号的高位将被放在该字节的高位,信号的低位将被放在该字节的低位,这样信号的起始位就是该字节的高位,当1个信号的数据长度超过 1 Byte或者数据长度不超过1个字节但是采用跨字节方式实现时,该信号的高位将被放在低字节的高位,信号的低位将被放在高字节的低位,这样信号的起始位就是低字节的高位。

 汽车CAN、LIN汇总_第66张图片


-----------------
(13)起始字节
Start_Byte就是指起始位所在的字节 ,在标准帧中这个值只能是0~7,不会出现大于7的情况。
-----------------
(14)起始位
Start_Bit对于不同排列格式的起始位是不相同的,这点一定要注意, 得出的数据内容可能完全是两个东西,在标准帧中这个值只能是0~63,不会出 现大于63的情况。
-----------------
(15)信号发送类型
Signal_Send_Type的类型主要有以下几种:Cycle、OnWrite、OnWriteWithRepetition、OnChange、OnChangeWithRepetition、IfActive、IfActiveWithRepetition等。
-----------------
(16)信号长度
Bit_Length代表信号的长度,不同排列格式虽然起始位不同,但是信号长度却是一样的,它代表该信号占了多个数据位,在标准帧中这个值只能是1~64,不会出现大于64的情况。
-----------------
(17)数据类型
Date_Type主要有两种,无符号和有符号,即Unsigned和Signed,其他还有IEEE float、IEEE Double等。
-----------------
(18)精度
Factor十六进制值的比例因子是为了计算信号的物理值。公式如下:[Physical Value] = ( [Hex Value] * [Factor] ) + [Offset]
-----------------
(19)偏移量
Offset偏移量用来计算信号的物理值。
-----------------
(20)物理最小值
Signal_Min_Value_Phy指总线实际换算出来的最小值。
-----------------
(21)物理最大值
Signal_Max_Value_Phy指总线实际换算出来的最大值。
-----------------
(22)总线最小值
Signal_Min_Value指总线上的最小值。
-----------------
(23)总线最大值
Signal_Max_Value指总线上的最大值。
-----------------
(24)初始值
Initial_Value指如果在网络启动后没有可用的有效信号,预定义的值将被发送(取决于功能需求)。有效值必须在启动后此时间内可用。
-----------------
(25)无效值
Invalid_Value一般用于节点丢失时的替代值。
-----------------
(26)非使能值
Inactive_Value仅用于使能型及周期使能型报文。
-----------------
(27)单位
Unit指信号的换算单位,比如“%”“”等。
-----------------
(28)信号值描述
Signal_Value_Description指信号的代表的意思,比如:0x00:Close、0x01:Open代表当总线上信号的指为0x00的时候代表关闭,0x01代表打开。
-----------------
(29)备注
Comments即其他的描述。
-----------------
(30)发送节点
Transmitter代表该报文信号是哪个ECU发送的,指发送节点。
-----------------
(31)接收节点
Receivers代表该报文信号是哪些ECU接收的,指接收节点。
----------------------------------------------------------

9、CAN解析方式


大端模式:数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放。这和我们的阅读习惯一致。
小端模式:数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
在清楚单片机的大端和小端的情况,我们可以这样去定义一个共用体,假设该报文长度为4。我们可以定义如下共用体,后面称为位定义:

typedef union
{
  uint8_t data[4];
  struct
  {
    //Byte[0]
    bits_t reserved0_7     :8;
    //Byte[1]
    bits_t reserved8_15   :8;
    //Byte[2]
    bits_t reserved16_21 :6; //6+2=8bits=1Byte
    bits_t demo               :2;
    //Byte[3]
    bits_t reserved24_31 :8;
  }bits;
}Msg_TYPE; //单片机为小端,比如STM32
 
typedef union
{
  uint8_t data[4];
  struct
  {
    //Byte[0]
    bits_t reserved0_7     :8;
    //Byte[1]
    bits_t reserved8_15   :8;
    //Byte[2]
    bits_t demo               :2;  //2+6=8bits=1Byte
    bits_t reserved16_21 :6;
    //Byte[3]
    bits_t reserved24_31 :8;
  }bits;
}Msg_TYPE; //单片机为大端

当报文接收到的时候,可以直接强制转换。

Msg_TYPE* p_msg = (Msg_TYPE*)message.byte;
demo = p_msg -> demo;


----------------------------------------------------------

10、CAN实际测试


1)概述
测试环境:Win7 64位, Vehicle Spy软件。
当IGN=OFF和SysPwrMode=OFF时,BCM停发网络管理报文,IPM在没有收到网络管理报文的情况下,一定时间(2S±10%)内停发应用报文。此时IPM并未进入休眠状态,只是停发应用报文。
通过 CANscope 总线分析仪解码窗口、 Kingst LA5016 usb 逻辑分析仪检测CAN数据通讯 或者带有 CAN协议解码能力的示波器 从总线模拟波形上得到对应的CRC数据。
--------------------------------
2)发送与接收概况

汽车CAN、LIN汇总_第67张图片
图3.10.1

 汽车CAN、LIN汇总_第68张图片


图3.10.2
--------------------------------
3)报文解析
(1)通过软件解析报文

汽车CAN、LIN汇总_第69张图片
图3.10.3

 汽车CAN、LIN汇总_第70张图片


图3.10.4

汽车CAN、LIN汇总_第71张图片

图3.10.5
对数据段的数据54 00 08 00 00 00 00结合网络通信矩阵解读其中的0x08如下:
对于折叠后视镜IPM_FoldingMirrorPosStatus其起始字节为3Bytes,起始位为27Bit,信号长度占2Bit。

汽车CAN、LIN汇总_第72张图片
图3.10.6

此数据表示折叠后视镜动作。

汽车CAN、LIN汇总_第73张图片

图3.10.7  网络通信矩阵

汽车CAN、LIN汇总_第74张图片
图3.10.8

汽车CAN、LIN汇总_第75张图片
图3.10.9 方向盘的转角度数
对数据段数据 03 E8 00 00 00 00 06 39 结合 网络通信矩阵 解读其中的 03 E8 如下: 

 汽车CAN、LIN汇总_第76张图片


图3.10.10

精度为0.1,那么100度*10=1000=0x3EH;-1000即0x3EH取反再加1,0xFC18。

汽车CAN、LIN汇总_第77张图片

 

总结:Vehicle Spy软件解析AutoSAR应用层报文,其中ArbId/Header为报文ID,DataBytes为数据。

-----------------
(2)实际波形解析

汽车CAN、LIN汇总_第78张图片
图3.10.11 CAN输出对地波形

图3.10.11波形图说明如下:

A.位填充
B.将CAN_H和CAN_L的差值为高电平时定义为显性,逻辑上表示为0,为低电平时定义为隐形,逻辑上表示为1,所以读出的电平应反向;
C.CAN_H的高电平对应显性电平逻辑0,CAN_L的低电平对应隐性电平逻辑1。

汽车CAN、LIN汇总_第79张图片

图3.10.12 IPM发送的报文

汽车CAN、LIN汇总_第80张图片

图3.10.13 逻辑电平波形

汽车CAN、LIN汇总_第81张图片

图3.10.13波形图说明如下:

汽车CAN、LIN汇总_第82张图片

图3.10.14 CAN一帧结构

汽车CAN、LIN汇总_第83张图片

图3.10.15 波形转换为二进制

A.起始位、仲裁段、控制段、数据段如图3.10.15所示,注意:位填充。

B.CRC校验范围:起始位+仲裁段+控制段+数据段

汽车CAN、LIN汇总_第84张图片
CRC校验移步:https://blog.csdn.net/liht_1634/article/details/124328005

C.ACK段

CAN信息发送成功后,会有个应答间隙的,在这个间隙内,接收节点可以准备要回复的信息,也就是把应答场填充为显性0,在发送时其为隐性1。应答过程可能如下:当信息传输到ACK前的Del时,可以认为信息已经传输完毕,接收节点也接收到了足够的信息来检测接收的信息是否正确,所以这时接收节点就会检测信号是否正确,如果正确,就将ACK置位为显性0,注意这时,发送节点因为还在发送而接收节点又将ACK信息置位为1,所以它就会在回读时检测到ACK为0,判断接收成功。注意:这其中有个接收节点用显性覆盖隐性---覆盖ACK位的过程,覆盖+回读。

ACK前后各加一个Del,就是为了考虑到时间误差,让接收节点有足够的时间对ACK确认。

这个过程说明,CAN发送是个双向互动的过程,发送节点一边发送,一边对节点进行回收确认数据正确,而接收节点也时刻接收,并在正确的时间将ACK设置为1。如果没有外部CAN接收器,那么其错误类型显然就是:

ErrorFrame  ECC: 11011001, Other Type of Error, Segment = ACK Slot

       |  ECC       11011001              

       |  Code      Other Type of Error   

       |  Segment   ACK Slot  

因为没有CAN节点对接收到的信息进行确认,不管波特率如何,都要有CAN节点进行确认。

--------------------------------------------------------------------------------------------------------------

四、LIN基础

虽然Lin总线的通信速率不高,工程中,最高的速率也就19200bps。但是,Lin总线依然在整车拓扑中被广泛使用,为什么呢?答:成本。Lin总线,作为CAN总线的补充衍生而来。对于一些实时性、安全性要求不高的场景(eg:空调、座椅、门窗、后视镜),可以使用价格相对低廉的Lin总线,以此降低整车成本。本文,从Lin Frame开始,聊一聊Lin。

----------------------------------------------------------

1、Lin的网络拓扑

Lin总线和CAN总线一样,是串行通信总线。不同于CAN总线的双绞线,Lin的物理连接,使用单线连接,Lin总线的网络拓扑如下所示:

汽车CAN、LIN汇总_第85张图片

一个Lin网络拓扑中,受限于电气特性,一般会约束通信节点的数量,eg:16个。

----------------------------------------------------------

2、Lin Frame

学习任何总线,都需要清楚其链路层的报文格式,也就是"Frame"。对于Lin总线的学习,最权威的规范莫过于17897,Lin Frame的讲解主要在Part3部分。Lin Frame结构如下所示:

如上图,Lin Frame主要由两部分组成:Header + Response。

(一)Header

Header包含三个Field:Break Field、Sync Byte Field、Protected Identifier Field。

Break Field:间隔域。由Master发送,表示一个新的Lin Frame的开始,至少由13 Bit的显性位组成,之后跟至少1Bit的隐性位,如下所示:

汽车CAN、LIN汇总_第86张图片

Lin总线的显性(dominant)和隐性(recessive)不同于CAN总线,由于Lin总线是单线通信方式,没有压差的概念。在Lin总线中,接收端(Receiver)将高于Vbat 60%的电压看作隐性,将低于Vbat 40%的电压看作显性;对于发送端,将高于Vbat 80%的电压看作隐性,将低于Vbat 20%的电压看作显性。如下所示:

汽车CAN、LIN汇总_第87张图片

Sync Byte Field:同步域,主要作用是:协调接收端识别发送端的通信速率。按照协议规范,此处固定为0x55。接收端判断同步域开始和结束的两个下降沿,再除以8就可以算出发送端每个Bit的时间长度。

汽车CAN、LIN汇总_第88张图片

Protected Identifier Field:此域包括frame identifier和parity,这两个部分构成了常说的PID。

frame identifier:报文的唯一标识,由6个Bit组成。6个bit可以表示的数据范围0x00~0x3F;parity:奇偶校验,由两个Bit组成。frame identifier和parity在Protected Identifier Field中的Mapping如下所示:

(二)Response

Lin通信中,请求只能Master发起,即发送Header,Slave响应主节点请求。各从节点根据Header中的ID来识别是否需要响应。Lin总线的Response部分包括数据和Checksum,数据最大可以传送8 Byte。Header和Resposne之间有一个响应间隔(response space),每个数据字节之间有inter-byte space。Response格式如下所示:

汽车CAN、LIN汇总_第89张图片

对于间隔空间(space),对应到具体的Lin Controller,可以根据项目需求配置,如下为一个Lin Frame的Maximum Bit示例:

汽车CAN、LIN汇总_第90张图片

Master可以处理三种类型的信息:发送帧头(TxH)、发送响应(TxR)、接收响应(RxR);Slave也可以处理三类信息:接收帧头(RxH)、发送响应(TxR)、接收响应(RxR)。如下所示:

汽车CAN、LIN汇总_第91张图片

----------------------------------------------------------

3、Lin的通信规则

Lin总线的通信模式:主从模式。即:Master发送Header,Slave或者Master给出响应(Response)。

(一)Lin的发送行为示例

汽车CAN、LIN汇总_第92张图片

Lin通信启动以后,Master节点先发送Header 0x10;

Slave A识别0x10,需要给出响应(Response)。同理,其他节点也需要识别0x10,并给出对应的动作(响应、接收响应、忽略);

Master节点按照时序,继续发送Header 0x11;

Slave C识别0x11,需要给出响应(Response)。同理,其他节点也需要识别0x11,并给出对应的动作(响应、接收响应、忽略);

Master节点按照时序,继续发送Header0x12;

Slave B识别0x12,需要给出响应(Response)。同理,其他节点也需要识别0x12,并给出对应的动作(响应、接收响应、忽略);

(二)Lin的接收行为示例

1、Slave A给出0x10报文响应,Slave B接收0x10报文的响应,其他节点忽略此信息;

2、Slave C给出0x11报文响应,Slave B接收0x11报文的响应,其他节点忽略此信息;

3、Slave B给出0x12报文响应,Slave Master接收0x12报文的响应,其他节点忽略此信息。

具体接收流程示意如下所示:

--------------------------------------------------------------------------------------------------------------
参考
1、相关缩略语: https://blog.csdn.net/liht_1634/article/details/123987262 之7、汽车电子。
2、CAN基本知识:https://download.csdn.net/download/liht_1634/85208314。
3、项目驱动CAN-bus现场总线教程: https://download.csdn.net/download/liht_1634/85208324, 非常详细。
4、汽车CAN总线: https://www.cnblogs.com/jacklu/p/4729638.html。
5、Lin基础:从Lin Frame开始: Lin基础:从Lin Frame开始

你可能感兴趣的:(汽车电子,单片机,stm32,嵌入式硬件)