CAN学习笔记

1.CAN 协议简介

CAN 总线协议具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及振动大的工业环境。

CAN 通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有 CAN_High 和 CAN_Low 两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。

2.CAN总线网络

2.1闭环总线网络(ISO11898标准的高速)

它的总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个“120 欧”的电阻。

2.2开环总线网络( ISO11519-2 标准的低速)

它的最大传输距离为 1km,最高通讯速率为 125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2千欧”的电阻。

3.基于AUTOSAR的CAN通讯

3.1 CAN通讯——接收(Indication)

1.BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Read函数;
2.CAN Driver模块的Can_MainFunction_Read函数将访问CanController(硬件)的寄存器,如前面文章所述的仲裁寄存器,数据寄存器和数据长度寄存器,并读取这些寄存器的数据;
3.数据读取结束后,这时继续调用CAN Interface模块的CanIf_RxIndication函数,这样数据从CAN Driver模块传给了上一层的CAN Interface模块;
4.CAN Interface模块再调用PduR模块的PduR_RxIndication函数,将数据传到PduR模块;
5.PduR模块路由到Com模块,调用Com_RxIndication函数,将数据传到Com模块,Com模块将会把数据存入其缓存,供应用层软件读取使用。
上述第2步为什么需要读取仲裁寄存器,数据寄存器和数据长度寄存器?这是因为ISO 11898-1标准规定了LLC数据帧的格式(id,数据长度和数据3段),当然还需要根据对应的芯片手册定义来访问其他的寄存器,最终保证读取数据的有效性。

3.2 CAN通讯——发送(request,confirm)

1.BSW调度器周期性调用Com模块的Com_MainFunction_Tx函数,Com模块将从其缓存器中读取需发送的数据;
2.Com模块的Com_MainFunction_Tx函数将调用PduR模块的PduR_ComTransmit函数,将数据传给PduR模块;
3.PduR模块路由到CAN Interface模块,调用CanIf_Transmit函数,这样数据从PduR模块传给了下层的CAN Interface模块;
4.CAN Interface模块再调用Can Driver模块的Can_Write函数,将数据写入相应的寄存器;
5.与CAN接收功能一样,Can_Write函数将访问仲裁,数据长度和数据寄存器,将数据写入。
(1).BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Write函数;
(2).CAN Driver模块的Can_MainFunction_Write函数将访问CanController(硬件)有关寄存器,读取有关数据供向上层确认;
(3).数据读取结束后,这时继续调用CAN Interface模块的CanIf_TxComfirmation函数,这样数据从CAN Driver模块传给了上层的CAN Interface模块;
(4).CAN Interface模块再调用PduR模块的PduR_TxConfirmation函数,将数据传到PduR模(5)PduR模块路由到Com模块,调用Com_TxConfirmation函数,确认发送状态。

4.CAN的传输数据及波特率

由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯,特别地, CAN还会使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。
为了实现位同步,CAN协议把每一个数据位的时序分解成SS段、PTS段、PBS1段、PBS2段,这四段的长度加起来即为一个CAN数据位的长度。
分解后最小的时间单位是Tq,而一个完整的位由8~25个Tq组成。
假设1Tq=1us,而每个数据位由19个Tq组成,则传输一位数据需要时间T1bit=19us,从而每秒可以传输的数据位个数为:
1x10的6次方(1秒转换成微秒)/19(一个bit需要的时间) = 52631.6 (bps)
这个每秒可传输的数据位的个数即为通讯中的波特率。

4.1 SS段(SYNC SEG)

SS译为同步段,若通讯节点检测到总线上信号的跳变沿被包含在SS段的范围之内,则表示节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。SS段的大小固定为1Tq。

4.2 PTS段(PROP SEG)

PTS译为传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS段的大小可以为1-8Tq。

4.3 PBS1段(PHASE SEG1)

PBS1译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBS1段的初始大小可以为1-8Tq。

4.4 PBS2段(PHASE SEG2)

PBS2这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。PBS2段的初始大小可以为2-8Tq。

5.CAN 报文

当使用CAN协议进行通讯时,需要对数据、操作命令(如读/写)以及同步信号进行打包,打包后的这些内容称为报文。

5.1报文帧的种类

在原始数据段的前面加上传输起始标签、片选(识别)标签和控制标签,在数据的尾段加上CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号,各种各样的标签就如同SPI中各种通道上的信号,起到了协同传输的作用。
当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为CAN的“数据帧”。

5.1.1 数据帧

1.帧起始(BOF):表示数据帧开始的段,1 个位的显性位。
2.仲裁段:表示该帧优先级的段。
标准格式的 ID 有 11 个位,从 ID28 到 ID18 被依次发送,禁止高 7 位都为隐性(ID=1111111XXXX);
扩展格式的 ID 有 29 (11+18)个位,基本ID及禁止位相同,扩展 ID 由 ID17 到 ID0 表示。
RTR:标志仲裁段结束,1位显性电平。
3.控制段:表示数据的字节数及保留位的段,数据段可包含 0~8 个字节的数据。从 MSB(最高位)开始输出。
4.保留位(r0,r1)必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。
5.(DLC)数据长度码与数据的字节数的对应关系如下:
注:数据的字节数必须为 0~8 字节。但接收方对 DLC = 9~15 的情况并不视为错误。
6.数据段:数据的内容,可发送 0~8 个字节的数据。
CRC 段:检查帧的传输错误的段,由 15 个位的 CRC 顺序*1 和 1 个位的 CRC 界定符(用于分隔的位)构成。
CRC顺序是根据多项式生成的 CRC 值,CRC 的计算范围包括帧起始、仲裁段、控制段、数据段。
没有数据段的数据帧可用于各单元定期连接的确认、应答、或仲裁段本身带有实质信息的情况下。
7.接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。
8.ACK 段:表示确认正常接收的段。 由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位构成。
发送单元的 ACK 段: 发送单元在 ACK 段发送 2 个位的隐性位。
接收单元的 ACK 段 :接收到正确消息的单元在 ACK槽(ACK Slot)发送显性位,通知发送单元正常接收结束。这称作“发 送 ACK”或者“返回 ACK”。
9.帧结束:表示数据帧结束的段。由 7 个位的隐性位构成。

5.1.2 遥控帧

接收单元向发送单元请求发送数据所用的帧。
遥控帧由 6 个段组成。遥控帧没有数据段,数据长度以所请求数据帧的数据长度码表示。
帧启始:表示帧开始的段;
仲裁段:表示该帧的优先级;RTR位为隐性(可通过该位区分没有数据段的数据帧和遥控帧)。
控制段:表示数据字节数和保留位的段;
CRC段:检查帧的传输错误的段;
ACK段:表示正常接收的段;
帧结束:表示遥控帧结束的段;

5.1.3 错误帧

用于在接收和发送消息时检测出错误通知错误的帧。错误帧由错误标志和错误界定符构成。
错误标志:
主动错误标志:6 个位的显性位。
被动错误标志:6 个位的隐性位。
错误界定符:错误界定符由 8 个位的隐性位

5.1.4 过载帧

过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。
过载标志:6 个位的显性位。
过载标志的构成与主动错误标志的构成相同。
过载界定符 :8 个位的隐性位。
过载界定符的构成与错误界定符的构成相同。

5.1.4 帧间隔

帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、 遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。
间隔:3 个位的隐性位。
总线空闲:隐性电平,无长度限制(0 亦可)。
本状态下,可视为总线空闲,要发送的单元可开始访问总线。
延迟传送(发送暂时停止):8 个位的隐性位。
只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。

5.2报文帧的优先级

多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。
比如:
1、具有相同 ID 的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权,可继续发送。
2、标准格式 ID 与具有相同 ID 的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式数据帧的 RTR 位为显性位的具有优先权,可继续发送。

5.3报文帧的位填充

位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。
(1) 发送单元的工作
在发送数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,在下一个位(第 6 个位)则 要插入1 位与前 5 位反型的电平。
(2) 接收单元的工作
在接收数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,需要删除下一个位(第 6 个 位)再接收。如果这个第 6 个位的电平与前 5 位相同,将被视为错误并发送错误帧。

5.5报文帧的错误种类

(1) 位错误
 位错误由向总线上输出数据帧、遥控帧、错误帧、过载帧的单元和输出 ACK 的单元、输出错误的单元来检测。
输出被动错误标志(6 个位隐性位)但检测出显性电平时,将遵从错误标志的结束条件,等待检测出连续相同 6 个位的值(显性或隐性),并不视为位错误。
在仲裁段输出隐性电平,但检测出显性电平时,将被视为仲裁失利,而不是位错误。
发送单元在 ACK 段输出隐性电平,但检测到显性电平时,将被判断为其它单元的 ACK 应答,而非位错误。
(2)填充错误
在需要位填充的段内,连续检测到 6 位相同的电平时所检测到的错误。以及在仲裁段作为填充位输出隐性电平时,但检测出显性电平时。
(3)CRC 错误
从接收到的数据计算出的CRC结果与接收到的 CRC 顺序不同时所检测到的错误。
(4) 格式错误
 即使接收单元检测出 EOF(7 个位的隐性位)的最后一位(第 8 个位)为显性电平,也不视为格式错误。
 即使接收单元检测出数据长度码(DLC)中 9∼15 的值时,也不视为格式错误。
(5)ACK 错误
发送单元在ACK槽(ACK Slot)中检测出隐性电平时所检测到的错误(ACK没被传送过来时所检测到的错误)。

5.6报文帧的错误种类

检测出满足错误条件的单元输出错误标志通报错误。
处于主动错误状态的单元输出的错误标志为主动错误标志;处于被动错误状态的单元输出的错误标志为被动错误标志。
发送单元发送完错误帧后,将再次发送数据帧或遥控帧。

6.CAN知识点总结

6.1CAN有哪几种错误类型,什么是Busoff?

CAN总线BUS OFF机制,用于检测CAN物理总线是否出现问题(CANH和CANL短路)。
(1) 主动错误状态
主动错误状态是可以正常参加总线通信的状态。
处于主动错误状态的单元检测出错误时,输出主动错误标志。
(2) 被动错误状态
被动错误状态是易引起错误的状态。
处于被动错误状态的单元虽能参加总线通信,但为不妨碍其它单元通信,接收时不能积极地发送错误通知。
处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。
处于被动错误状态的单元检测出错误时,输出被动错误标志。
另外,处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8 个位的隐性位)。
(3) 总线关闭态
总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。
这些状态依靠发送错误计数和接收错误计数来管理,根据计数值决定进入何种态。错误状态和计数值的关.

6.2什么是ACK?

CAN是一种基于广播的通讯方式,为了保证总线上的每一个节点都能正确的接收到报文,报文的发送者要求每一个接收节点在报文发送结束前,也就是ACK SLOT 的时间内,作出应答,即在ACK段上,要求接收节点在报文正确性的基础上及时发送一个“显性”位。
送者在发送的同时会监视总线上的数据,如果与发送的数据不一致,则表示发送失败或自己失去仲裁,立即停止发送或转入接收模式。由于发送者在发送数据的同时会向ACK段连续写入2个隐性位,如果发送者在回读过程中监控到ACK SLOT 位为“显性”位,则说明接收者已正确接收;如果发送者在回读过程中监控到ACK SLOT 位为“隐性”位,则说明没有节点正确接收该报文,则发送者会检测到这个隐性位而知道发送失败,此条报文需要重发。

6.3 CAN的终端电阻一般用多大?

闭环总线网络(ISO11898标准的高速)120 欧,开环总线网络( ISO11519-2 标准的低速)2.2千欧.

6.4普通CAN和CANFD的区别?

(1)传输速率不同。
CAN FD的速率可变,从控制场中的BRS位到ACK场之前(含CRC分界符)为可变速率,最高速率可达到8Mbps(下图的蓝色部分)。其他部分与CAN相同。
(2)数据长度不同。
CAN FD支持的最大数据长度为64byte。
(3)帧格式不同。
CanFD新增了FDF、BRS、ESI位:
FDF:表示 CAN 报文还是 CAN-FD 报文;BRS:表示位速率转换,该位隐性时,速率可变(即 BSR 到 CRC 使用转换速率传输),该位为显性时,以正常的 CAN-FD 总线速率传输(恒定速率);ESI:表示发送节点状态。
ID长度不同。CAN FD标准帧ID长度可扩展至12bit,CAN的标准帧ID为11bit。

6.5 SJW和采样次数一般设置多少?

同步跳转宽度(SJW)1~4Tq ,选择3、4可以使总线获得更宽的波特率容忍度。
采样次数:分为单次采样跟三次采样,三次采样在设计之初虽然是为了过滤掉总线上毛刺,但是采用三次采样经常会影响SJW的跳转。所以实际应用中我们一般都会采用单次采样。

6.6 采样点一般设置多少?

所谓采样点是读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。
BRP:波特率分频器
Baud:波特率=f/[Tss+Tpts+Tpbs1+Tpbs2*(BPR+1)]
当波特率大于800kbps时,推荐采样率为75%;当波特率为500k-800kbps时,推荐采样率80%左右;当波特率不大于500kbps时,推荐采样率为87.5%。
采样率=[Tss+(Tpts+Tpbs1)]/[Tss+(Tpts+Tpbs1)+Tpbs2]

6.7 BU、BO、SG分别代表什么意思?

BU:网络节点,BO:报文,SG:信号

6.8 ID值是用十进制还是十六进制表示?

10进制

7.数据库常见熟悉与说明

7.1对象类型:Network

BusType:包含的总线类型或网络协议

NmBaseAddress:定义网络管理报文的基地址

NmMessageCount:定义网络管理报文的数量

GenNWMSleepTime:定义同时睡眠节点的睡眠时间

7.2对象类型:Node

NodeLayerModules:列出了当前仿真工程节点所使用的动态链接库文件(*.dll)

NmNode:定义该节点是否参与网络管理

NmStationAddress:定义网络管理节点的基地址

GenNodSleepTime:定义不同节点的睡眠时间

7.3对象类型:Message

NmMessage:指定报文是否是网络管理报文

GenMsgStartDelay Time:指定系统开始后首帧报文的延迟发送时间

GenMsgSendType:定义报文的发送类型

GenMsgNrOfRepetition:定义事件型报文的重复周期

GenMsgILSupport:指定该报文是否需要交互层的支持

GenMsgFastOnStart:指定交互层启动后到周期报文开始发送的时间间隔

GenMsgDelay Time:定义两帧报文之间传输的最小间隔

GenMsgCycleTimeFast:定义快速报文的周期

GenMsgCycleTime:定义报文的发送周期

7.4对象类型:Signal

NWM-WakeupAllowed:定义信号是否参与网络管理

GenSigStartValue:定义信号的初始值

GenSigSendType:定义信号的发送类型

GenSiglnactive Value:定义信号的无效值

参考资料

《CAN入门书》

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

提升自我,勇闯天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值