CAN通信
野火STM32学习笔记(仅作为学习使用,如有侵权立即删除)
1 CAN 协议简介
CAN 是控制器局域网络(Controller Area Network)的简称,它是由研发和生产汽车电子 产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519),是国际上应用最广泛的现场总线之一。 CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以 CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。近年来,它具 有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及振动大的工业环境。
1. CAN 物理层
与 I2C、SPI 等具有时钟信号的同步通讯方式不同,CAN 通讯并不是以时钟信号来进 行同步的,它是一种异步通讯,只具有 CAN_High 和 CAN_Low 两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。
1. 闭环总线网络
CAN 物理层的形式主要有两种,图 42-1 中的 CAN 通讯网络是一种遵循 ISO11898 标准的高速、短距离“闭环网络”,它的 总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个“120 欧”的电阻。
2. 开环总线网络
图 42-2 中的是遵循 ISO11519-2 标准的低速、远距离“开环网络”,它的最大传输距离为 1km,最高通讯速率为 125kbps, 两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2 千欧”的电阻。
3. 通讯节点
从 CAN 通讯网络图可了解到,CAN 总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,实现节点间通讯。由于 CAN 通讯协议不对节点进行地址编码,而是对数据内容进行编码的,所以网络中的节点个数理论上不受限制,只要总线的 负载足够即可,可以通过中继器增强负载。
CAN 通讯节点由一个 CAN 控制器及 CAN 收发器组成,控制器与收发器之间通过CAN_Tx 及 CAN_Rx 信号线相连,收发 器与 CAN 总线之间使用 CAN_High 及 CAN_Low 信号线相连。其中 CAN_Tx 及 CAN_Rx 使用普通的类似 TTL 逻辑信 号,而 CAN_High 及 CAN_Low 是一对差分信号线,使用比较特别的差分信号,下一小节再详细说明。 当 CAN 节点需要 发送数据时,控制器把要发送的二进制编码通过 CAN_Tx 线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化 成差分信号,通过差分线CAN_High 和 CAN_Low 线输出到 CAN 总线网络。而通过收发器接收总线上的数据到控制器时, 则是相反的过程,收发器把总线上收到的 CAN_High 及 CAN_Low 信号转化成普通 的逻辑电平信号,通过 CAN_Rx 输出到 控制器中。例如,STM32 的 CAN 片上外设就是通讯节点中的控制器,为了构成完整的节点,还要给它外接一个收发器, 在我们实验板中使用型号为 TJA1050 的芯片作为 CAN 收发器。CAN 控制器与 CAN 收发器的关系如同 TTL 串口与 MAX3232 电平转换芯片的关系, MAX3232 芯片把 TTL 电平的串口信号转换成 RS-232 电平的串口信号,CAN 收发器的作
用则是把 CAN 控制器的 TTL 电平信号转换成差分信号(或者相反)。
4. 差分信号
差分信号又称差模信号,与传统使用单根信号线电压表示逻辑的方式有区别,使用差分信号传输时,需要两根信号线,这两 个信号线的振幅相等,相位相反,通过两根信号线的电压差值来表示逻辑 0 和逻辑 1。见图 42-3,它使用了 V+与 V-信号的 差值表达出了图下方的信号。
相对于单信号线传输的方式,使用差分信号传输具有如下优点:
抗干扰能力强,当外界存在噪声干扰时,几乎会同时耦合到两条信号线上,而接收端只关心两个信号的差值,所以外界的 共模噪声可以被完全抵消。
能有效抑制它对外部的电磁干扰,同样的道理,由于两根信号的极性相反,他们对外辐射的电磁场可以相互抵消,耦合的 越紧密,泄放到外界的电磁能量越少。
时序定位精确,由于差分信号的开关变化是位于两个信号的交点,而不像普通单端信号依靠高低两个阈值电压判断,因而 受工艺,温度的影响小,能降低时序上的误差,同时也更适合于低幅度信号的电路。由于差分信号线具有这些优点,所以在 USB 协议、485 协议、以太网协议及 CAN 协议的物理层中,都使用了差分信号传输。
5. CAN 协议中的差分信号
CAN 协议中对它使用的 CAN_High 及 CAN_Low 表示的差分信号做了规定,见表 42-1 及图 42-4。以高速 CAN 协议为 例,当表示逻辑 1 时(隐性电平),CAN_High 和 CAN_Low线上的电压均为 2.5v,即它们的电压差 VH-VL=0V;而表示逻辑 0 时 (显性电平), CAN_High 的电平为 3.5V,CAN_Low 线的电平为 1.5V,即它们的电压差为 VH-VL=2V。 例如,当 CAN收发器从 CAN_Tx 线接收到来自 CAN 控制器的低电平信号时(逻辑 0),它会使 CAN_High 输出 3.5V,CAN_Low输出 1.5V,从而输出显性电平表示逻辑 0。
在 CAN 总线中,必须使它处于隐性电平(逻辑 1)或显性电平(逻辑 0)中的其中一个状态。 假如有两个 CAN 通讯节点,在同 一时间,一个输出隐性电平,另一个输出显性电平,类似 I2C 总线的“线与”特性将使它处于显性电平状态,显性电平的名字 就是这样来的,即可以认为显性具有优先的意味。由于 CAN 总线协议的物理层只有 1 对差分线,在一个时刻只能表示一个 信号,所以对通讯节点来说,CAN 通讯是半双工的,收发数据需要分时进行。在 CAN 的通讯网络中,因为共用总线,在整 个网络中同一时刻只能有一个通讯节点发送信号,其余的节点在该时刻都只能接收。