找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4149|回复: 0
打印 上一主题 下一主题
收起左侧

CAN2.0规范学习研究

[复制链接]
跳转到指定楼层
楼主
ID:105323 发表于 2016-2-21 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
概述
CAN总线是BOSCH公司发布的一款针对汽车电子的总线协议,主要用于汽车各部件之间的通信以及对各部件进行检测。
1989年PHILIPS公司发布了CAN2.0标准
1991年ISO组织讲CAN总线协议列为标准的现场总线协议ISO11898
第一章:
要了解CAN总线的知识,必须实现了解NRZ编码,因为CAN总线的物理层使用的就是NRZ编码。NRZ编码的示例图如下图所示:



                                                                   NRZ编码
NRZ编码存在的一个问题就是当连续传输n多个0或者n多个1时,发送者和接收者没法进行同步。
NRZI 编码(Non-Return-to-ZeroInverted Code)和 NRZ 的区别就是 NRZI 用信号的翻转代表一个逻辑,信号保持不变代表另外一个逻辑。

  USB 传输的编码就是 NRZI 格式,在 USB 中,电平翻转代表逻辑 0,电平不变代表逻辑1(NRZI 遇 0 翻转,遇 1 不变):NRZI编码如下图所示:


NRZI编码
翻转的信号本身可以作为一种通知机制,而且可以看到,即使把 NRZI 的波形完全翻转,所代表的数据序列还是一样的,对于像 USB 这种通过差分线来传输的信号尤其方便.
   但是同样,NRZ 和 NRZI 都没有自同步特性,但是可以用一些特殊的技巧解决。比如,先发送一个同步头,内容是 0101010 的方波,让接受者通过这个同步头计算出发送者的频率,然后再用这个频率来采样之后的数据信号,就可以了。
  在 USB 中,每个 USB 数据包,最开始都有个同步域(SYNC),这个域固定为 00000001,这个域通过 NRZI 编码之后,就是一串方波(复习下前面:NRZI 遇 0 翻转遇 1 不变),接受者可以用这个 SYNC 域来同步之后的数据信号。
  此外,因为在USB的NRZI编码下,逻辑0会造成电平翻转,所以接受者在接受数据的同时,根据接收到的翻转信号不断调整同步频率,保证数据传输正确.
  但是,这样还是会有一个问题,就是虽然接受者可以主动和发送者的频率匹配,但是两者之间总会有误差。假如数据信号是1000个逻辑1,经过USB的NRZI编码之后,就是很长一段没有变化的电平,在这种情况下,即使接受者的频率和发送者相差千分之一,就会造成把数据采样成 1001 个或者999个1了。        
  USB 对这个问题的解决办法,就是强制插 0,也就是传说中bit-stuffing,如果要传输的数据中有7个连续的1,发送前就会在第6个1后面强制插入一个0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。接受者只要删除6个连续1之后的0,就可以恢复原始的数据了。
   而CAN协议当位流里有连续5个1或者连续5个0时,便在位流里插入一个补充位,而接收器则自动删除这个补充位,换句话说,最长等待5个bit的时间,各节点就可以进行同步。需注意连续6个相同的位表示ERRORFLAG,
   bit-stuffing的示意图如下所示:图中白色的为填充位



                                   位填充示意图
关于NRZ编码就介绍到这里。下面我们将介绍CAN2.0的规范
第二章 CAN2.0规范
CAN2.0规范分为AB两部分,其中A定义了标准帧,B定义了标准帧和扩展帧。
其中标准帧又分为四种:
数据帧
远程帧
过载帧
错误帧
数据帧:
标准数据帧的格式如图所示:
      
                                                            标准数据帧示意图
有图可以看出数据帧由如下及部分组成:
SOF                                          起始帧
ARBITRATIONFIELD              仲裁域
CTRLFIELD                              控制域
DATAFIELD                             数据域
CRC  FIELD                              校验域
ACKFIELD                               确认域
EOF                                          终止帧
数据域的长度可以为0
   MESSAGE ID 用于寻址,它在总线网络中是唯一的。CAN控制器一般都有一个验收码寄存器和验收屏蔽寄存器,当接收到消息ID时,控制器检查验收寄存器为1的位有哪些,那么就不去判断MESSAGEID的相应位,剩下的位如果和验收寄存器的值相等,那么就接收该消息。
   MESSAGE ID号越小表示优先级越高,多个节点同时发送数据时总线通过该域进行仲裁,传输优先级高的节点继续传输,失去传输资格的节点在总线空闲时重新传输。仲裁的过程如下图所示:
   
                                                          CAN仲裁过程示意图
                                                                                                                                                                          如图,仲裁采用的是按位仲裁的方式,谁的大值出现的早谁就先退出仲裁。
INTERMISSIONFIELD 用于区区分开两个连续的帧
扩展数据帧的格式如下:
   



两种帧的区别在于CTRLFIELD 中的识别符扩展位(IDE)

远程帧也分为两种:标准帧和扩展展,他们与数据帧的区别在于:
远程帧没有数据域
RTR位为recessivebit
其它完全一样。

错误帧只有当检测到CAN标准定义的错误时产生错误帧,错误帧的位数有6-12BIT,错误帧的示意图如下:
                                      

                                                                 错误帧示意图                        
过载帧
一般情况下,如下几种情况会导致过载帧的出现
1、上次接收的数据帧未被CPU读取,又来了新的数据帧
2CAN节点检测到帧间隔的第一位或者第二位为dominant位,在检测到dominant位后马上发出
3CAN节点检测到错误帧的界定域或者过载帧的界定域存在dominant位,在检测到dominant位后马上发出。
过载帧示意图如下:
                             

                                   过载帧

暂时到这里,有了新的理解再持续更新

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表