什么是CAN?
CAN是一种通信的方式,就是用来传递数据的,是属于串行通信的一种,是异步的半双工通讯,根据通信速率的不同可以分为高速CAN和低速CAN,主要的区别是在于对总线电平和数据传输速率(波特率)的定义,分别遵循ISO的不同标准。
低速CAN 通信速率 10-125Kbps,总线长度可达1000米。
高速CAN(ISO11898)通信速率125kbps~1Mbps,总线长度≤40米 经典CAN 。
CAN FD 通信速率可达5Mbps,并兼容经典CAN,遵循ISO 11898-1 做数据收发。
CAN的总线组成为:CAN控制器 (芯片内的CAN外设),CAN收发器(CAN的收发器芯片),
CAN_High和CAN_Low两根线构成的总线结构

对于CAN_High、CAN_Low是共同组成一组差分的信号线,CAN网络中的物理信号是基于差分信号进行传输的,其终端的电阻是在高速CAN中防止信号反射和振铃。

低速的CAN是属于开环总线,高速的CAN是属于闭环总线。对于CAN总线有以下特点:多主控制,每个设备都是可以主动的发送数据,当然这一点就会涉及到优先级的问题,这个问题会在后面详细介绍。在CAN中是没有类似于地址的信息,数据是以广播的形式,所以这个特点也就涉及到CAN的ID相关信息。
写到现在,可以简单的回答一下几个问题:一个节点的MCU向总线上那么多的节点的某一个节点发送消息的?一个节点又是如何知道某个信息是发送给自己或者不是发送给自己呢?这个就会涉及到CAN的ID 和CAN控制器的过滤器的内容啦。
CAN的简洁的物理层必须要配上一套更加复杂的协议
CAN的总线是使用差分信号,其物理媒介是一对双绞线,这样差分信号的优点可以实现对干扰信号的抵消,总线上是CAN_High、CAN_Low.通过电位差来判断总线的电平,当然在这个地方高速CAN和低速CAN是不一样的。

在经典CAN及高速CAN中:
显性电平:总线上逻辑0表示显性,遇0得0,显性最强 差分信号的电压差一般为2V
隐形电平:总线上逻辑1表示隐形,隐形的攻击性不强 差分信号的电压差一般为0

在低速CAN中
显性电平:逻辑0表示显性 显性的电压差一般为3V
隐形电平:逻辑1表示隐性 隐性的电压差一般为-1.5V
刚刚说到,显性电平是逻辑0,并且是具有正的电压差的,因此显性电平是具有优先权的,只要有一个节点输出显性电平,总线上即为显性电平。但是隐性电平是需要所有的节点都输出隐性电平,总线上才是才是隐形电平。从逻辑上来说这是一种与逻辑,其物理的实现是通过集电极开路电路实现的。

说到这些电平是需要CAN的收发器实现的,目前CAN的收发器芯片有TK1050、TK1042。CAN收发器芯片能够将微控制器 的逻辑电平转换为CAN总线所使用的物理层电平,并负责将数据发送到总线上,同时接收总线上的数据并将其转换为适合微控制器处理的逻辑电平。收发器芯片还包含其他功能,如滤波、保护电路等,以确保可靠的通信。有了CAN的收发器实现差分信号到逻辑信号的转换之后,我们就可以基于CAN的控制器实现CAN的帧的通信。CAN的协议定义了五种类型的帧。
对于CAN的帧有数据帧、遥控帧、错误帧、过载帧、间隔帧。我们今天主要是针对标准的数据帧进行实现。
数据帧是由七段来组成的,当然数据帧又分为标准帧CAN2.0A、扩展帧CAN2.0B

帧起始:表示数据帧开始的段,是以显性信号表示,SOF发出后会产生一个跳变沿用于整个CAN网络的时间同步。
仲裁段:表示该帧优先级的段,该部分和CAN的过滤器相关,标准格式ID有11个位,从ID28到ID18被依次发,ID禁止设置高7位为隐性
控制段:表示数据的字节数和保留位的段,控制段是由6个位构成的,四个位为DLC,称数据长度码,表示后面要表示的数据的字节数,还有两个保留位
数据段:数据的内容,一帧可以发送0-8字节的数据
CRC段:检查帧的传输错误的段,由15个位的CRC顺序和一个位的CRC界定符构成
ACK段:表示确认正确接收的段,该段由两位组成,其中一位是界定符,对于发送单元而言在该段发两个隐性位,接收段在ACK Slot段发送显性位,通知发送单元是正常接收结束
帧结束:是以七个隐性电平表示数据帧的结束
对CAN的位时序介绍:在CAN总线上我们是读取电平来实现表征数据0、1。对于没有时钟线的CAN总线里,是以“位时序”的机制,实现对电平的正确采样,位数据是由四段组成的:
同步段SS:1Tq
传播时间段PTS:1~8Tq
相位缓冲段PBS1:1~8 Tq
相位缓冲段PBS2:2~8Tq
此外因时钟的频率偏差,传送延迟等,各单元有同步午餐,SJW为再补偿宽度,其实我们对位同步而言不需要太深入的了解其实现,该部分主要是由硬件自动完成。
高速CAN收发器选型推荐(TK1050)