CAN总线协议 学习笔记
1.CAN总线网络
CAN总线网络主要挂在CAN_H和CAN_L,各个节点通过这两条线实现信号的串行差分传输,为了避免信号的反射和干扰,还需要在CAN_H和CAN_L之间接上120欧姆的终端电阻,但是为什么是120欧姆呢?那是因为电缆的特性阻抗为120欧。
2.信号表示
CAN总线采用不归零码位填充技术,也就是说CAN总线上的信号有两种不同的信号状态,分别是显性的(Dominant)逻辑0和隐形的(recessive)逻辑1,信号每一次传输完后不需要返回到逻辑0(显性)的电平。
位填充规则:发送器只要检测到位流里有5个连续相同值的位,便自动在位流里插入补充位。
观察下图:
可以看到上图中的当第一段为隐性(recessive),CAN_H和CAN_L电平几乎一样,也就是说CAN_H和CAN_L电平很接近甚至相等的时候,总线表现隐性的,而两线点位差较大时表现为显性的,按照定义的:
- CAN_H-CAN_L < 0.5V 时候为隐性的,逻辑信号表现为"逻辑1"- 高电平。
- CAN_H-CAN_L > 0.9V 时候为显性的,逻辑信号表现为"逻辑0"- 低电平。
下面将差分信号和显隐性之间对应关系总结为下表:
状态 |
逻辑信号 |
电压范围 |
显性Dominant |
0 |
CAN_H-CAN_L > 0.9 |
隐性recessive |
1 |
CAN_H-CAN_L < 0.5 |
由上面的分析我们可以知道:
CAN总线采用的"线与"的规则进行总线冲裁。即1&0=0;所以0为显性。
这句话隐含的意思是,如果总线上只要有一个节点将总线拉到低电平(逻辑0)即显性状态,总线就为低电平(逻辑0)即显性状态而不管总线上有多少节点处于传输隐性状态(高电平或是逻辑1),只有所有节点都为高(隐性),总线才为高,即隐性。
3.通讯速率与通讯距离
下面的SAE J2411为美国汽车标准。
类型 |
标准 |
最高速率 |
描述 |
高速CAN |
CAN/ISO 11839-2 |
1Mbit/秒 |
最通用的CAN总线类型 |
低速CAN |
ISO/ISO 11839-3 |
125Kbit/秒 |
容错,在一条总线短路的时候仍然能工作 |
单线CAN |
SAE J2411 |
50Kbit/秒 |
高速模式可达到100Kbit/s主要用在汽车上,例如通用公司 |
CAN总线上任意两个节点的最大传输距离与其位速率有关,如下表:
位速率/kbps |
1000 |
500 |
250 |
125 |
100 |
50 |
20 |
10 |
5 |
最大距离/m |
40 |
130 |
270 |
530 |
620 |
1300 |
3300 |
6700 |
10000 |
这里的最大通信距离指的是同一条总线上两个节点之间的距离。可以看到速率越低通讯距离就越远,也就是说CAN总线的通讯距离和波特率成反比。在位速率为5千比特位每秒的时候达到最大的传输距离10公里。其中一般的工程中比较常用的为500K每秒的通讯速率。这个速率在实际测试的时候也是非常可靠的。
如果想要更远的传输(大于10公里);可以考虑用多个CAN控制器连接或是加其他通讯协议(如485或是TCP/IP)的接口芯片组成的一个设备,这样就可实现长距离的通讯需求。
4.数据冲突解决办法-仲裁
只要总线空闲,总线上任何节点都可以发送报文,如果有两个或两个以上的节点开始传送报文,那么就会存在总线访问冲突的可能。但是CAN使用了标识符的逐位仲裁方法可以解决这个问题。
在仲裁期间,每一个发送器都对发送的电平与被监控的总线电平进行比较。如果电平相同,则这个单元可以继续发送。如果发送的是一"隐性"电平而监视到的是一"显性"电平,那么这个节点失去了仲裁,必须退出发送状态。如果出现不匹配的位不是在仲裁期间则产生错误事件。
帧ID越小,优先级越高。由于数据帧的RTR位为显性电平,远程帧为隐性电平,所以帧格式和帧ID相同的情况下,数据帧优先于远程帧;由于标准帧的IDE位为显性电平,扩展帧的IDE位为隐形电平,对于前11位ID相同的标准帧和扩展帧,标准帧优先级比扩展帧高。
4.CAN总线是怎么通信的?
CAN 总线是一个广播类型的总线,所以任何在总线上的节点都可以监听总线上传输的数据。也就是说总线上的传输不是点到点的,而是一点对多点的传输,这里多点的意思是总线上所有的节点。但是总线上的节点如何知道那些数据是传送给自己的呢?CAN总线的硬件芯片提供了一种叫做本地过滤的功能,通过这种本地过滤的功能可以过滤掉一些和自己无关的数据,而保留一些和自己有关的信息。
CAN标准定义了四种消息类型,每条消息用一种叫做比特位仲裁(Arbitration)机制来控制进入CAN总线,并且每条消息都标记了优先权。另外CAN标准还定义了一系列的错误处理机制。
CAN报文的四种消息类型:
- 数据帧:数据帧将数据从发送器传输到接收器。
- 远程帧:总线单元发出远程帧,请求发送具有同一标识符的数据帧。
- 错误帧:任何单元检测到总线错误就发出错误帧。
- 过载帧:过载帧用在相邻数据帧或远程帧之间的提供附加的延时。
(1)数据帧
下图为基本的格式:
CAN总线中有标准帧和扩展帧两种格式,两种格式不同的地方在于仲裁域格式的不同,看下面两个表格可以很清楚的看出两者的不同,下面第一个表是标准帧(CAN2.0 A),第二个为扩展帧(CAN2.0 B):
下面为扩展帧格式(CAN2.0B):
其中
- SOF为帧开始
- SRR为"替代远程请求位
- IDE为扩展标识符位
- RTR为远程传输请求位
- CRC delimiter 为CRC定界符。
- ACK delimiter 为应答定界符.
我们看到上图中的基本帧格式可以总结为以下几个域:
域 |
描述 |
仲裁域 |
仲裁域决定了当总线上两个或是多个节点争夺总线时的优先权。 |
数据域 |
包含了0到8字节的数据。 |
CRC域 |
包含了15位的校验和,校验和用来做错误检测。 |
应答槽 |
任何一个已经正确接收到消息的控制器在每一条消息的末端发送一个应答位,发送器检查消息是否存在应答位,如果没有就重发消息。 |
(2)远程帧
作为数据接收器的站,通过发送远程帧,可以启动其资源节点传送它们各自的数据。远程帧和数据帧非常类似,只是远程帧没有数据域。
上图就是远程帧的帧格式,它相对与数据帧没有远程帧,但是要注意发送远程帧的时候RTR位要置1,表示发送的是远程帧。下图更加清晰了呈现了这种结构。
(3)错误帧
错误帧是当总线的某一个节点检测到错误后发送出来的,它会引起所有节点检测到一个错误,所以当有任何一个节点检测到错误,总线上的其他节点也会发出错误帧。CAN总线设计了一套详尽的错误计数机制来确保不会由于任何一个节点反复的发送错误帧而导致CAN总线的崩溃。
如上图所示错误标志和错误定界符组成,高低代表分别代表隐性和显性,其中错误标志为所有节点发过来的错误标志的叠加(Superposition)。下图更为清楚的看出各个数据位的分布:
下面通过以下数据结构框图概括各个部分的定义:
错误标志有两种形式:
- 主动错误标志,它由6个连续的显性位0组成,它是节点主动发送的错误标志。
- 被动错误标志,它由6个连续的隐性位1组成,除非被其他节点的显性位覆盖。
刚才说到一个节点上检测到错误会导致总线上所有的节点都会检测到错误并发送错误标志,这是为什么呢?
因为单一节点上的错误标志格式违背了从帧起始到CRC界定符的位填充规则,也破坏了ACK域或帧结尾的固定格式。下面简要说下位填充规则。
位填充规则:发送器只要检测到位流里有5个连续相同值的位,便自动在位流里插入补充位。
注意:位填充规则只是针对数据帧和远程帧,错误帧和过载帧格式固定。
所以所有其他的节点会检测到错误条件并且开始发送错误标志,因此错误帧就是各个站的不同错误标志叠加在一起的结果。
当某个节点发送错误帧(带有错误标志),其他节点收到了错误帧,检测到错误条件,就通过发送"被动错误标志"的错误帧来提示错误。
错误定界符:
传送了错误标志以后,每一个站就发送一个隐性位,并一直监视总线直到检测出一个隐性位为止,然后就开始发送其余7个隐性位。
(4)过载帧
过载帧是接收节点用来向发送节点告知自身接收能力的帧。
过载帧,意思就是某个接收节点来不及处理数据了,希望其他节点慢点发送数据帧或者远程帧,所以告诉发送节点,我已经没有能力处理你发送过来的数据了。
过载帧跟错误帧结构类似包括过载标志和过载定界符,有3中情况会引起过载:
- 接收器内部的原因,它需要延迟下一个数据帧或是远程帧。
- 在间歇字段(看下面的帧间空间)的第一位和第二位检测到一个显性位(间歇字段都是隐性位的)
- 如果CAN节点在错误界定符或是过载界定符的第八位(最后一位)采样到一个显性位逻辑0,节点会发送一个过载帧,错误计数器不会增加。
上图中很清晰的表示了过载标志有6个显性位组成,而叠加部分和"主动错误"标志一样,过载的标志破坏的是间歇域的固定格式。所以导致其他的节点都检测到过载条件,并一同发出过载标志。
过载定界符:
也就是上图的过载结束符,过载标志被传送以后,节点就一直监听着总线,直到检测到有一个从显性位到隐性位的跳变为止。当从总线上检测到这样的跳变,则就标志着每一个节点都完成了各自过载标志的发送,并开始同时发送其余7个隐性位。
5.CAN总线通信协议实例
(1)帧标识符-29位
(a)、协议号 PROTNO ( Protocol No )
协议号描述各高级单元之间通信使用的协议。
0x064 |
RMP |
Rectifier Monitor Protocol |
监控主机与采集前端标识符 |
(b)、PTP
点对点位。PTP=0,表示该帧为广播信息。PTP=1 时,表示该帧为点对点信息。例如,在对所有的节点广播命令时,PTP=0时,目的地址设置为 0xFF。。
(c、目的地地址
目标地址表示该帧发往哪个地址。 目的地址(0x00-0xFE)。
如果 PTP=1,bit11~bit18 被作为点对点通信的目的地址。
(d)、源地址
源地址表示该帧是由哪个地址发出。 源地址(0x00-0xFE)。
在所有通信类型中,bit3~bit10 用于指示总线上信息源的地址。
在系统中,PRONTO=0x064,采集前端的地址确定在 0x00~0x7F。
监控主机的地址都确定在 0xF0~0xF8。
(e)、源地址
后续数据标识。如果 CNT=1,表示数据包含下一帧,而且,它有相同的源地址和协议类型。如果 CNT=0,表示是数据的最后部分。如果数据包只需要一帧传递,则 CNT=0。
(f) 、RES 1
预留位,为将来使用,必须设置为 1。
(g)、RES 2
预留位,为将来使用,必须设置为 1。
(2)数据域
(a)、 ERR
错误位。如果节点接收到的数据包帧格式不符合协议规定,将此位置位传递给源节点。
(b)、PTP
点对点位。PTP=0,表示该帧为广播信息。PTP=1 时,表示该帧为点对点信息。例如,在对所有的节点广播命令时,PTP=0时,目的地址设置为 0xFF。。
(c)、MSGTYPE
命令信息类型。表示数据信息对应的类型。
(d)、ErrType
错误类型。表示数据信息错误原因。
ErrType |
意义 |
0xf0 |
无错误,正常响应 |
0xf1 |
节点地址无效 |
0xf2 |
命令无效 |
0xf3 |
数据校验错误 |
0xf4 |
地址识别过程中 |
(e)、Data information
数据部分。
(3)MSGTYPE
欢迎大家进群交流分享:QQ群:773082801
CAN总线协议 学习笔记的更多相关文章
- I2C总线协议学习笔记 (转载)
1.I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL. SDA传输数据是大端传输,每次传输8bit,即一字节. 支持多主控(multimastering),任何时间点只能有一 ...
- HTTP协议学习笔记(四)
HTTP协议学习笔记(四) 与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率. 1.用单台虚拟主机实现多个域名 ...
- HTTP协议学习笔记(三)
HTTP协议学习笔记(三) 1.状态码告知从服务器端返回的请求结果 状态码的职责是当客户端向服务端向服务端发送请求时,描述返回的请求结果.借助状态码,用户可以知道服务端是正常处理了请求,还是出现了错误 ...
- HTTP协议学习笔记(二)
HTTP协议学习笔记(二) 1.HTTP报文 HTTP报文:用于HTTP协议交互的信息.请求报文:请求端(客户端)的HTTP报文叫做请求报文.响应报文:响应端(服务端)的HTTP报文叫做响应报文. H ...
- HTTP协议学习笔记(一)
HTTP协议学习笔记(一) 1.HTTP协议用于客户端和服务端之间的通信 客户端:请求访问文本或图像等资源的一端服务端:提供资源响应的一端 在两台计算机之间使用HTTP协议通信时,在一条通信线路上必定 ...
- TCP/IP协议学习笔记
计算机网络基础知识复习汇总:计算机网络基础知识复习 HTTP协议的解析:剖析 HTTP 协议 一个系列的解析文章: TCP/IP详解学习笔记(1)-- 概述 TCP/IP详解学习笔记(2)-- 数据链 ...
- RSA算法、SSL协议学习笔记
最近学习计算机网络,涉及到SSL协议,我想起了去年密码学课程讲过的非对称加密RSA算法,结合阮老师的博客,写写学习笔记,这里再回忆一下. RSA算法 RSA算法是一种非对称密码算法,所谓非对称,就是指 ...
- 网络协议学习笔记(二)物理层到MAC层,交换机和VLAN,ICMP与ping原理
概述 之前网络学习笔记主要讲解了IP的诞生,或者说整个操作系统的诞生,一旦有了IP,就可以在网络的环境里和其他的机器展开沟通了.现在开始给大家讲解关于网络底层的相关知识. 从物理层到MAC层:如何在宿 ...
- 接口与协议学习笔记-AMBA片上通信协议_APB_AHB_AXI_AXI4不同版本(二)
随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大.数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用.在基于IP复用的SoC设计中,片上总线设计是最 ...
随机推荐
- mysql添加注释
-- 查看字段类型-- show columns from campaign_distribute --给表添加注释 -- alter table campaign_distribute commen ...
- gitlab VS github
gitlab 和 github的比较 GitLab - 基于Git的项目管理软件 GitLab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务.
- 2018.07.04 POJ 1113 Wall(凸包)
Wall Time Limit: 1000MS Memory Limit: 10000K Description Once upon a time there was a greedy King wh ...
- 20155305乔磊2016-2017-2《Java程序设计》第七周学习总结
教材学习内容总结 第十二章 Lambda 12.1 认识Lambda语法 - Lambda 教材的引入循序渐近.深入浅出 如果使用JDK8的话,可以使用Lambda特性去除重复的信息,例: Compa ...
- ENVI数据格式
选择一个或多个感兴趣的图层: 分类:目视解译.非监督分类 投影 哪里需要七参数,没有必要七参数吧?如果精度要求不高的话
- Opengl中的gluProject函数认识
1. 从官方说明如下 https://www.opengl.org/sdk/docs/man2/xhtml/gluProject.xml Name gluProject — map object co ...
- 【最大流之ek算法】HDU1532 求最大流
本来是继续加强最短路的训练,但是遇到了一个最短路 + 最大流的问题,最大流什么鬼,昨天+今天学习了一下,应该对ek算法有所了解,凭借学习后的印象,自己完成并ac了这个最大流的模板题 题目大意:都是图论 ...
- java web开发过程中的“\”指的是什么,如何区分
- 发个招聘贴,魔都求手游C++后端,UNITY前端,开发实习生
上海游旺网络科技有限公司成立于2015年5月,是一家极具潜力的新创移动游戏公司.公司初创团队均来自腾讯,盛大,畅游,墨麟,蜗牛等知名互联网公司,公司创始人团队参与制作过<鬼吹灯><Q ...
- [CentOS]Centos设置PATH全局变量
PATH确认方法 $ echo $PATH 根据优先级先后顺序用:分割,因此可以复数指定 PATH设定方法(临时) $ export PATH=$PATH:/usr/local/scala/bin P ...