收藏 分享(赏)

CAN总线解析.doc

上传人:weiwoduzun 文档编号:3199992 上传时间:2018-10-07 格式:DOC 页数:17 大小:2.09MB
下载 相关 举报
CAN总线解析.doc_第1页
第1页 / 共17页
CAN总线解析.doc_第2页
第2页 / 共17页
CAN总线解析.doc_第3页
第3页 / 共17页
CAN总线解析.doc_第4页
第4页 / 共17页
CAN总线解析.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、一、 概述CAN(Controller Area Network)即控制器局域网,是一种能够实现分布式实时控制的串行通信网络。想到 CAN 就要想到德国的 Bosch 公司,因为 CAN 就是这个公司开发的(和 Intel)CAN有很多优秀的特点,使得它能够被广泛的应用。比如:传输速度最高到 1Mbps,通信距离最远到 10KM,无损位仲裁机制,多主结构。近些年来,CAN 控制器价格越来越低,很多 MCU 也集成了 CAN 控制器。现在每一辆汽车上都装有 CAN 总线。一个典型的 CAN 应用场景:二、 CAN 总线标准CAN 总线标准只规定了物理层和数据链路层,需要用户来自定义应用层。不同的

2、 CAN 标准仅物理层不同。CAN 收发器负责逻辑电平和物理信号之间的转换,将逻辑信号转换成物理信号(差分电平)或者将物理信号转换成逻辑电平。CAN 标准有两个,即 IOS11898 和 IOS11519,两者差分电平特性不同。(有信号时,CANH 3.5V,CANL 1.5V,即显性;没有信号时,CANH 2.5V,CANL 2.5V,即隐性)IOS11898 高速 CAN 电平中,高低电平的幅度低,对应的传输速度快。双绞线共模消除干扰,是因为电平同时变化,电压差不变。2.1 物理层CAN 有三种接口器件多个节点连接,只要有一个为低电平,总线就为低电平,只有所有的节点都输出高电平时,才为高电

3、平。所谓“线与”。CAN 总线有 5 个连续性相同的位后,就会插入一个相反位,产生跳变沿,用于同步。从而消除累计误差。 和 485、 232 一样, CAN 的传输速度与距离成反比。CAN 总线终端电阻的接法:特点:低速 CAN 在 CANH 和 CANL 上串入 2.2k 的电阻;高速 CAN 在 CANH 和CANL 之间并入 120 电阻。 为什么是 120,因为电缆的特性阻抗为 120,为了模拟无限远的传输线。(因为大多数双绞线电缆特性阻抗大约在 100120 。 )120 欧姆只是为了保证阻抗完整性,消除回波反射,提升通信可靠性的,因此,其只需要在总线最远的两端接上 120 欧姆电阻

4、即可,而中间节点并不需要接(接了反而有可能会引起问题)。因此各位在使用 CAN Omega 做 CAN 总线侦听的时候,大多数情况下是不需要这个120 欧姆电阻的,当然,即使当前网络中并没有终端匹配电阻,只要传输线长度不长(比如SysCan360 比赛环境中,传输线只有 1-2 米)CAN 节点数量不多的情况下,不要这个 120欧姆电阻也完全可以工作,甚至,你接任意电阻都是不会有影响的。因为此时传输线长度和波长还相差甚远,节点不多的情况下,反射波的叠加信号强度也不会很强,因此传输线效应完全可以忽略。而哪些情况需要呢,主要就是,当使用 2 个 CAN Omega 对发或者当前网络中仅有 2 个C

5、AN 设备的时候,此时两个端点最好都加上终端匹配电阻,当然,前面也说过了,传输线长度不长的时候,也可以不需要 2 端 120 欧姆电阻,但为了信号完整性考虑,加上这两个电阻才是严谨的。2 个 120 欧姆电阻的意义在于,使用 USB CAN 调试某些不带终端电阻的中间节点设备时,有时候 CAN 总线上没有 2 个 120 欧姆电阻通信可能会异常,此时可以接入 2 个 120 欧姆电阻作为 2 个终端电阻来作阻抗匹配,这时候其他端点不应接入任何终端电阻!并且,这 2 个 120欧姆电阻不可用 1 个 60 欧姆电阻代替!125kHz 载波的波长大概在(c / f) = (3e8m/s) / (1

6、25e3Hz)=2.4km,其临界长度为2.4kM / 10 = 240m 2m,也即传输线长度不超过 240m,分布阻抗带来的影响可以忽略不计2.2 数据链路层CAN 总线传输的是 CAN 帧, CAN 的通信帧分成五种,分 别为数据帧、远程帧、错误帧、过载帧和帧间隔。数据帧用来节点之间收发数据,是使用最多的帧类型;远程帧用来接收节点向发送节点接收数据;错误帧是某节点发现帧错误时用来向其他节点通知的帧;过载帧是接收节点用来向发送节点告知自身接收能力的帧;用于将数据帧、远程帧与前面帧隔离的帧。数据帧根据仲裁段长度不同分为标准帧(2.0A)和扩展帧( 2.0B)2.3 帧起始帧起始由一个显性位(

7、低电平)组成,发送节点发送帧起始,其他节点同步于帧起始;帧结束由 7 个隐形位(高电平)组成。2.4 仲裁段CAN 总线是如何解决多点竞争的问题?由仲裁段给出答案。CAN 总线控制器在发送数据的同时监控总线电平,如果电平不同,则停止发送并做其他处理。如果该位位于仲裁段,则退出总线竞争;如果位于其他段,则产生错误事件。帧 ID 越小,优先级越高。由于数据帧的 RTR 位为显性电平,远程帧为隐性电平,所以帧格式和帧 ID 相同的情况下,数据帧优先于远程帧;由于标准帧的 IDE 位为显性电平,扩展帧的 IDE 位为隐形电平,对于前 11 位 ID 相同的标准帧和扩展帧,标准帧优先级比扩展帧高。2.5

8、 控制段共 6 位,标准帧的控制段由扩展帧标志位 IDE、保留位 r0 和数据长度代码 DLC 组成;扩展帧控制段则由 IDE、r1、r0 和 DLC 组成。2.6 数据段为 0-8 字节,短帧结构,实时性好,适合汽车和工控领域;2.7 CRC 段CRC 校验段由 15 位 CRC 值和 CRC 界定符组成。2.8 ACK 段当接收节点接收到的帧起始到 CRC 段都没错误时,它将在 ACK 段发送一个显性电平,发送节点发送隐性电平,线与结果为显性电平。2.9 远程帧远程帧分为 6 个段,也分为标准帧和扩展帧,且 RTR 位为 1(隐性电平)CAN 是可靠性很高的总线,但是它也有五种错误。CRC

9、 错误:发送与接收的 CRC 值不同发生该错误;格式错误:帧格式不合法发生该错误;应答错误:发送节点在 ACK 阶段没有收到应答信息发生该错误;位发送错误:发送节点在发送信息时发现总线电平与发送电平不符发生该错误;位填充错误:通信线缆上违反通信规则时发生该错误。当发生这五种错误之一时,发送节点或接受节点将发送错误帧为防止某些节点自身出错而一直发送错误帧,干扰其他节点通信,CAN 协议规定了节点的3 种状态及行为。2.10 过载帧当某节点没有做好接收的“准备 “时,将发送过载帧,以通知发送节点。2.11 帧间隔用来隔离数据帧、远程帧与他们前面的帧,错误帧和过载帧前面不加帧间隔。2.12 构建 C

10、AN 节点构建节点,实现相应控制,由底向上分为四个部分:CAN 节点电路 、CAN 控制器驱动、CAN 应用层协议 、CAN 节点应用程序 。虽然不同节点完成的功能不同,但是都有相同的硬件和软件结构。CAN 收发器 和控制器分别对应 CAN 的物理层和数据链路层,完成 CAN 报文的收发;功能电路,完成特定的功能,如信号采集或控制外设等;主控制器与应用软件按照 CAN 报文格式解析报文,完成相应控制。CAN 硬件驱动是运行在主控制器(如 P89V51)上的程序,它主要完成以下工作:基于寄存器的操作,初始化 CAN 控制器、发送 CAN 报文、接收 CAN 报文;如果直接使用 CAN 硬件驱动,

11、当更换控制器时,需要修改上层应用程序,移植性差。在应用层和硬件驱动层加入虚拟驱动层,能够屏蔽不同 CAN 控制器的差异。一个 CAN 节点除了完成通信的功能,还包括一些特定的硬件功能电路,功能电路驱动向下直接控制功能电路,向上为应用层提供控制功能电路函数接口。特定功能包括信号采集、人机显示等。CAN 收发器是实现 CAN 控制器逻辑电平与 CAN 总线上差分电平的互换。实现 CAN 收发器的方案有两种,一是使用 CAN 收发 IC(需要加电源隔离和电气隔离),另一种是使用 CAN隔离收发模块。推荐使用第二种。CAN 控制器是 CAN 的核心元件,它实现了 CAN 协议中数据链路层的全部功能,能

12、够自动完成 CAN 协议的解析。 CAN 控制器一般有两种,一种是控制器 IC(SJA1000),另一种是集成 CAN 控制器的 MCU(LPC11C00)。MCU 负责实现对功能电路和 CAN 控制器的控制:在节点启动时,初始化 CAN 控制器参数;通过 CAN 控制器读取和发送 CAN 帧;在 CAN 控制器发生中断时,处理 CAN 控制器的中断异常;根据接收到的数据输出控制信号;接口管理逻辑:解释 MCU 指令,寻址 CAN 控制器中的各功能模块的寄存器单元,向主控制器提供中断信息和状态信息。发送缓冲区和接收缓冲区能够存储 CAN 总线网络上的完整信息。验收滤波是将存储的验证码与 CAN

13、 报文识别码进行比较,跟验证码匹配的 CAN 帧才会存储到接收缓冲区。CAN 内核实现了数据链路的全部协议。2.13 CAN 协议应用层概述CAN 总线只提供可靠的传输服务,所以节点接收报文时,要通过应用层协议来判断是谁发来的数据、数据代表了什么含义。常见的 CAN 应用层协议有: CANOpen、DeviceNet、J1939 、iCAN 等。CAN 应用层协议驱动是运行在主控制器(如 P89V51)上的程序,它按照应用层协议来对CAN 报文进行定义、完成 CAN 报文的解析与拼装。例如, 我们将帧 ID 用来表示节点地址,当接收到的帧 ID 与自身节点 ID 不通过时,就直接丢弃,否则交给

14、上层处理;发送时,将帧 ID设置为接收节点的地址。2.14 CAN 收发器SJA1000 的输出模式有很多,使用最多的是正常输出模式,输入模式通常不选择比较器模式,可以增大通信距离,并且减少休眠下的电流。收发器按照通信速度分为高速 CAN 收发器和容错 CAN 收发器。同一网络中要使用相同的CAN 收发器。 CAN 连接线上会有很多干扰信号,需要在硬件上添加滤波器和抗干扰电路。也可以使用 CAN 隔离收发器(集成滤波器和抗干扰电路)。CAN 控制器与 MCU 的连接方式SJA1000 可被视为外扩 RAM,地址宽度 8 位,最多支持 256 个寄存器12345678910111213#defi

15、ne REG_BASE_ADDR 0xA000 / 寄存器基址unsigned char *SJA_CS_Point = (unsigned char *) REG_BASE_ADDR ;/ 写 SJA1000 寄存器void WriteSJAReg(unsigned char RegAddr, unsigned char Value) *(SJA_CS_Point + RegAddr) = Value;return;/ 读 SJA1000 寄存器unsigned char ReadSJAReg(unsigned char RegAddr) return (*(SJA_CS_Point + R

16、egAddr);将缓存区的数据连续写入寄存器 for (i=0;i / 包含 80C51 寄存器定义头文件#include “SJA1000REG.h“ / 包含 SJA1000 寄存器定义头文件/ 定义取字节运算#define LOW_BYTE(x) (unsigned char)(x)#define HIGH_BYTE(x) (unsigned char)(unsigned int)(x) 8)/ 定义振荡器时钟和处理器时钟频率(用户可以根据实际情况作出调整)#define OSCCLK 11059200UL/ 宏定义 MCU 的时钟频率#define CPUCLK (OSCCLK / 1

17、2)#endif / _CONFIG_H_SJA1000 上电后处于复位状态,必须初始化后才能工作。(1)置位模式寄存器 Bit0 位进入复位模式;(2)设置时钟分频寄存器选择时钟频率、CAN 模式;(3)设置验收滤波,设定验证码和屏蔽码;(4)设置总线定时器寄存器 0、1 设定 CAN 波特率;(5)设置输出模式;(6)清零模式寄存器 Bit0 位退出复位模式;模式寄存器只检测模式:SJA1000 发送 CAN 帧时不检查应答位;只听模式:此模式下 SJA1000 不会发送错误帧,用于自动检测波特率;SJA1000 以不同的波特率接收 CAN 帧,当收到 CAN 帧时,表明当前波特率与总线波

18、特率相同。2.15 波特率设置CAN 总线无时钟,使用异步串行传输;波特率是 1 秒发送的数据位;2.16 CAN 帧发送:发送 CAN 帧的步骤: 1.检测状态寄存器,等待发送缓冲区可用;2.填充报文到发送缓冲区;3.启动发送。SJA1000 具有一个 12 字节的缓冲区,要发送的报文可以通过寄存器 16-28 写入,也可通过寄存器 96-108 写入或读出 设置发送模式123456789char SetSJASendCmd(unsigned char cmd) unsigned char ret;switch (cmd) default:case 0:ret = SetBitMask(RE

19、G_CAN_CMR, TR_BIT); /正常发送break;case 1:ret = SetBitMask(REG_CAN_CMR, TR_BIT|AT_BIT); /单次发送10111213141516171819break;case 2:ret = SetBitMask(REG_CAN_CMR, TR_BIT|SRR_BIT);/自收自发break;case 0xff:ret = SetBitMask(REG_CAN_CMR, AT_BIT);/终止发送break;return ret; 发送函数12345678910111213141516171819202122232425unsig

20、ned char SJA_CAN_Filter8 = / 定义验收滤波器的参数,接收所有帧0x00, 0x00, 0x00, 0x00, / ACR0ACR3 0xff, 0xff, 0xff, 0xff / AMR0AMR3;unsigned char STD_SEND_BUFFER11 = / CAN 发送报文缓冲区 0x08, / 帧信息,标准数据帧,数据长度 = 8 0xEA, 0x60, / 帧 ID = 0x7530x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa / 帧数据;void main(void) / 主函数,程序入口 timer

21、Init();/ 初始化D1 = 0; SJA1000_RST = 1; / 硬件复位 SJA1000 timerDelay(50); / 延时 500ms SJA1000_RST = 0; SJA1000_Init(0x00, 0x14, SJA_CAN_Filter); / 初始化 SJA1000,设置波特率为 1Mbps / 无限循环,main()函数不允许返回 for(;) SJASendData(STD_SEND_BUFFER, 0x0); timerDelay(100); / 延时 1000ms 为什么帧 ID 是 0x753,这与 CAN 帧在缓冲区的存储格式有关。终端电阻非常重要,当波特率较高而且没加终端电阻时,信号过冲非常严重。SJA1000 有 64 个字节的接收缓冲区(FIFO),这可以降低对 MCU 的要求。MCU 可以通过查询或中断的方式确定 SJA1000 接收到报文后读取报文。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报