1、完整版CAN总线解析概述CAN ( Controller Area Network )即控制器局域网,是一种能够实现分布式实时控制的串 行通信网络。想到 CAN 就要想到德国的 Bosch 公司,因为 CAN 就是这个公司开发的(和 Intel ) CAN 有很多优秀的特点,使得它能够被广泛的应用。比如:传输速度最高到 1Mbps ,通信距离最远 到 10KM ,无损位仲裁机制,多主结构。近些年来, CAN 控制器价格越来越低, 很多 MCU 也集成了 CAN 控制器。 现在每一辆汽车 上都装有 CAN 总线。个典型的 CAN 应用场景:CAN 总线标准CAN 总线标准只规定了物理层和数据链路
2、层,需要用户来自定义应用层。不同的 CAN 标 准仅物理层不同。CAN 收发器负责逻辑电平和物理信号之间的转换, 将逻辑信号转换成物理信号 (差分电平) 或者将物理信号转换成逻辑电平。CAN 标准有两个, 即 IOS11898 和 IOS11519 ,两者差分电平特性不同。 (有信号时, CANH3.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 欧姆只是为了保证阻抗完整性,消除回波反射,提升通信可靠
4、性的, 因此, 其只需要在总线最远的两端接上 120 欧姆电阻即可, 而中间节点并不需要接 (接了反而有可能会引起问题) 。 因此各位在使用 CAN Omega 做 CAN 总线侦听的时候,大多数情况下是不需要这个 120 欧姆 电阻的,当然,即使当前网络中并没有终端匹配电阻, 只要传输线长度不长(比如 SysCan360 比赛环境中,传输线只有 1-2 米) CAN 节点数量不多的情况下,不要这个 120 欧姆电阻也完 全可以工作,甚至,你接任意电阻都是不会有影响的。因为此时传输线长度和波长还相差甚远, 节点不多的情况下,反射波的叠加信号强度也不会很强,因此传输线效应完全可以忽略。而哪些情况
5、需要呢,主要就是,当使用 2 个 CAN Omega 对发或者当前网络中仅有 2 个CAN 设备的时候,此时两个端点最好都加上终端匹配电阻,当然,前面也说过了,传输线长度 不长的时候,也可以不需要 2 端 120 欧姆电阻,但为了信号完整性考虑,加上这两个电阻才是 严谨的。2 个 120 欧姆电阻的意义在于,使用 USB CAN 调试某些不带终端电阻的中间节点设备时, 有时候 CAN 总线上没有 2 个 120 欧姆电阻通信可能会异常,此时可以接入 2 个 120 欧姆电阻 作为 2 个终端电阻来作阻抗匹配, 这时候其他端点不应接入任何终端电阻!并且,这 2 个 120欧姆电阻不可用 1 个
6、60 欧姆电阻代替!/ 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、 控制段2.6 数据段为 0-8 字节,短帧结构,实时性好,适合汽车和工控领域;2.7 CRC 段CRC 校验段由 15 位 CRC 值和 CRC 界定符组成共 6 位,标准帧的控制段由扩展帧标志位 IDE 、保留位 r0 和数据长度代码 DLC 组成;扩展帧控制段则由 IDE 、 r1 、r0 和 DLC 组成2.8ACK 段当接收节点接收到的帧起始到 CRC 段都没错误时, 它将在 ACK 段发送一个显性电平, 发送 节点发送隐性电平,线与结果为显性电平。2.9远程帧远程帧分为 6 个段,也分为标准帧和扩展帧,且 RTR 位为 1 (隐性电平)CAN 是可靠性很高的总线,但是它也有五种错误
9、。CRC 错误:发送与接收的 CRC 值不同发生该错误; 格式错误:帧格式不合法发生该错误; 应答错误:发送节点在 ACK 阶段没有收到应答信息发生该错误; 位发送错误:发送节点在发送信息时发现总线电平与发送电平不符发生该错误; 位填充错误:通信线缆上违反通信规则时发生该错误。CAN 协议规定了节点的当发生这五种错误之一时,发送节点或接受节点将发送错误帧为防止某些节点自身出错而一直发送错误帧,干扰其他节点通信,3 种状态及行为2.10过载帧当某节点没有做好接收的 准备 时,将发送过载帧,以通知发送节点2.11帧间隔用来隔离数据帧、远程帧与他们前面的帧,错误帧和过载帧前面不加帧间隔2.12构建
10、CAN 节点构建节点,实现相应控制,由底向上分为四个部分: CAN 节点电路、 CAN 控制器驱动、 CAN 应用层协议、 CAN 节点应用程序。虽然不同节点完成的功能不同,但是都有相同的硬件和软件结构。CAN 收发器和控制器分别对应 CAN 的物理层和数据链路层,完成 CAN 报文的收发;功 能电路,完成特定的功能,如信号采集或控制外设等;主控制器与应用软件按照 CAN 报文格式 解析报文,完成相应控制。存器的操作,初始化 CAN 控制器、发送 CAN 报文、接收 CAN 报文;如果直接使用 CAN 硬件驱动,当更换控制器时,需要修改上层应用程序,移植性差。在应 用层和硬件驱动层加入虚拟驱动
11、层,能够屏蔽不同 CAN 控制器的差异。一个 CAN 节点除了完成通信的功能,还包括一些特定的硬件功能电路,功能电路驱动向下 直接控制功能电路, 向上为应用层提供控制功能电路函数接口。 特定功能包括信号采集、 人机显CAN 收发器是实现 CAN 控制器逻辑电平与 CAN 总线上差分电平的互换。实现 CAN 收发 器的方案有两种,一是使用 CAN 收发 IC(需要加电源隔离和电气隔离),另一种是使用 CAN隔离收发模块。推荐使用第二种。CAN 控制器是 CAN 的核心元件, 它实现了 CAN 协议中数据链路层的全部功能, 能够自动 完成 CAN 协议的解析。 CAN 控制器一般有两种,一种是控制
12、器 IC (SJA1000 ),另一种是集成 CAN 控制器的 MCU ( LPC11C00 )。MCU 负责实现对功能电路和 CAN 控制器的控制: 在节点启动时, 初始化 CAN 控制器参数; 通过 CAN 控制器读取和发送 CAN 帧;在 CAN 控制器发生中断时,处理 CAN 控制器的中断异 常;根据接收到的数据输出控制信号;接口管理逻辑:解释 MCU 指令, 寻址 CAN 控制器中的各功能模块的寄存器单元,向主控 制器提供中断信息和状态信息。发送缓冲区和接收缓冲区能够存储 CAN 总线网络上的完整信息。验收滤波是将存储的验证码与 CAN 报文识别码进行比较,跟验证码匹配的 CAN 帧
13、才会存 储到接收缓冲区。CAN 内核实现了数据链路的全部协议。2.13CAN 协议应用层概述CAN 总线只提供可靠的传输服务,所以节点接收报文时,要通过应用层协议来判断是谁发 来的数据、 数据代表了什么含义。 常见的 CAN 应用层协议有: CANOpen 、DeviceNet 、J1939 、 iCAN 等。CAN 应用层协议驱动是运行在主控制器(如 P89V51 )上的程序,它按照应用层协议来对CAN 报文进行定义、完成 CAN 报文的解析与拼装。例如,我们将帧 ID 用来表示节点地址,当 接收到的帧 ID 与自身节点 ID 不通过时,就直接丢弃,否则交给上层处理;发送时,将帧 ID 设
14、置为接收节点的地址。2.14CAN 收发器SJA1000 的输出模式有很多,使用最多的是正常输出模式,输入模式通常不选择比较器模 式,可以增大通信距离,并且减少休眠下的电流。收发器按照通信速度分为高速 CAN 收发器和容错 CAN 收发器。同一网络中要使用相同的CAN 收发器。 CAN 连接线上会有很多干扰信号,需要在硬件上添加滤波器和抗干扰电路。也可以使用 CAN 隔离收发器(集成滤波器和抗干扰电路)CAN 控制器与 MCU 的连接方式SJA1000 可被视为外扩 RAM ,地址宽度 8 位,最多支持256 个寄存器1 #define REG_BASE_ADDR 0xA000 / 寄存器基址
15、2 unsigned char *SJA_CS_Point = (unsigned char *) REG_BASE_ADDR ;34/ 写 SJA1000 寄存器5void WriteSJAReg(unsigned char RegAddr, unsigned char Value) 6*(SJA_CS_Point + RegAddr) = Value;7return;8910/ 读 SJA1000 寄存器11unsigned char ReadSJAReg(unsigned char RegAddr) 12return (*(SJA_CS_Point + RegAddr);13将缓存区的数
16、据连续写入寄存器for (i=0;ilen;i+) WriteSJAReg(RegAdr+i,ValueBufi); 将连续多个寄存器连续读入缓存区for (i=0;ilen;i+) ReadSJAReg(RegAdr+i,ValueBufi); 头文件包含方案:每个程序包含用到的头文件#define _CONFIG_H/ 定义取字节运算#define CPUCLK (OSCCLK / 12)14#endif / _CONFIG_HSJA1000 上电后处于复位状态,必须初始化后才能工作。(1 )置位模式寄存器 Bit0 位进入复位模式;(2 )设置时钟分频寄存器选择时钟频率、 CAN 模式;
17、(3)设置验收滤波,设定验证码和屏蔽码;(4 )设置总线定时器寄存器 0 、 1 设定 CAN 波特率;( 5 )设置输出模式;(6 )清零模式寄存器 Bit0 位退出复位模式;模式寄存器只检测模式: SJA1000 发送 CAN 帧时不检查应答位;只听模式:此模式下 SJA1000 不会发送错误帧,用于自动检测波特率; SJA1000 以不同的波特 率接收 CAN 帧,当收到 CAN 帧时,表明当前波特率与总线波特率相同。2.15波特率设置CAN 总线无时钟,使用异步串行传输;波特率是 1 秒发送的数据位;2.16CAN 帧发送:发送 CAN 帧的步骤: 1.检测状态寄存器,等待发送缓冲区可
18、用;2.填充报文到发送缓冲区; 3.启动发送。设置发送模式1char SetSJASendCmd(unsigned char cmd) 2unsigned char ret;3switch (cmd) 4default:5case 0:6ret = SetBitMask(REG_CAN_CMR, TR_BIT); /正常发送7break;8case 1:9ret = SetBitMask(REG CAN CMR, TR BIT|AT BIT); / 单次发送10break;11case 2:12ret = SetBitMask(REG_CAN_CMR, TR_BIT|SRR_BIT);/ 自收
19、自发13break;14case 0xff:15ret = SetBitMask(REG_CAN_CMR, AT_BIT);/终止发送16break;1718return ret;19发送函数12345unsigned char SJA_CAN_Filter8 = /定义验收滤波器的参数, 接收所有帧0x00, 0x00, 0x00, 0x00,/ ACR0ACR30xff, 0xff, 0xff, 0xff/ AMR0AMR367;unsigned char STD_SEND_BUFFER11 = / CAN发送报文缓冲区0x08, / 帧信息,标准数据帧,数据长度 = 880xEA, 0x
20、60, / 帧 ID = 0x75390x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa /帧数据10;11;void main(void) / 主函数,程序入口1213timerInit();/ 初始化14D1 = 0;15SJA1000_RST = 1; / 硬件复位 SJA100016timerDelay(50); / 延时 500ms17SJA1000_RST = 0;18SJA1000_Init(0x00, 0x14, SJA_CAN_Filter); /初始化 SJA1000 ,设置波特率为191Mbps20/ 无限循环, main() 函数不允许返回21for(;) 22SJASendData(STD_SEND_BUFFER, 0x0);23timerDelay(100); / 延时 1000ms2425为什么帧 ID 是 0x753 ,这与 CAN 帧在缓冲区的存储格式有关。终端电阻非常重要,当波特率较高而且没加终端电阻时,信号过冲非常严重。SJA1000 有 64 个字节的接收缓冲区( FIFO ),这可以降低对 MCU 的要求。 MCU 可以通 过查询或中断的方式确定 SJA1000 接收到报文后读取报文。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1