介绍
CAN总线(Controller Area Network Bus)控制器局域网总线。
CAN总线构建的是一种局域网网络,每一个挂载在CAN总线的设备,都可以利用这个局域网去发送自己的消息,也可以接收局域网的各种消息,每个设备都是平等的,都在共享这个局域网的通信资源。不存在什么主从关系。
CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域。
can总线特征:
- 两根通信线(CAN_H、CAN_L),线路少,无需共地;
- 差分信号通信,抗干扰能力强(若线路产生干扰,则一般两根线的电压都会同时出现波动,但是两根线的电压差值仍然是不变的,所以用电压差值来传递数据,可以极大的避免干扰)
- 高速CAN(ISO11898):125k~1Mbps, 传输距离<40 m(本课程侧重学习的是高速CAN)
- 低速CAN(ISO11519):10k~125kbps, 传输距离<1 km;
- 异步,无需时钟线,通信速率由设备各自约定;
- 半双工(不可以同时发送和接收),可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序;
- 11位/29位报文ID,用于区分消息功能,同时决定优先级;
高速can:

低速can:

差分信号:
- can_High和can_Low走的是一对差分信号;
- 传统的单端信号传输:一根信号线和一根地线
- 差分传输是一种信号传输的技术,差分传输在这两根线上都传输信号,这两个信号的振幅相同,相位相反
- 信号接收端比较这两个电压的差值来判断发送端发送的逻辑状态。
- 在电路板上,差分走线必须是等长、等宽、紧密靠近、且在同一层面的两根线。

**优点:**抗干扰能力强,干扰噪声一般会等值、同时的被加载到两根信号线上,而其差值为0,即,噪声对信号的逻辑意义不产生影响。差分走线必须是等长、等宽、紧密靠近就是为了让外界干扰同等的附加在这两根线上,最后的差值为0;
**缺点:**差分信号一定要走两根等长、等宽、紧密靠近、且在同一层面的线。对电路板比较小,走线比较紧张的情况下,给布线带来挑战。
can差分信号的逻辑电平:

高速can
- 逻辑1(隐性电平)
- can_High = can_Low = 2.5V(标准)
- 电压差为(-0.5, 0.05)之间
- 逻辑0(显性电平)
- can_High - can_Low = 2.0V(标准)
- 电压差为(1.5, 3.0)之间
低速can
- 逻辑1(隐性)
- can_High - can_Low = -1.5(标准)
- 电压差为(-0.3, ∞)
- 逻辑0(显性)
- can_High - can_Low = 3.0(标准)
- 电压差为(0.3, ∞)
can总线协议帧
can总线的报文种类
CAN总线是广播类型的总线。这意味着所有节点都可以侦听到所有传输的报文。无法将报文单独发送给指定节点;所有节点都将始终捕获所有报文。但是CAN硬件能够提供本地过滤功能,让每个节点对报文有选择性地做出响应。这段话的意思是当一个节点发送数据时,所有的节点都能得知这个数据,但是会有一个本地过滤功能让指定的节点来接收数据。
五中不同的报文类型
- 数据帧:数据帧是最常见的报文类型,用于发送单元向接收单元发送数据。
- 远程帧(遥控帧):远程帧用于接收单元向具有相同id的发送单元请求发送数据。(不带数据,仅仅就是发送一个求数据的请求)
- 错误帧:错误帧当检测出错误时向其他单元通知错误的帧。
- 过载帧:接收设备通知其尚未做好接收准备(过载帧并不常用,因为当今的CAN控制器会非常智能化地避免使用过载帧)
- 帧间隔:用于将数据帧及遥控帧与前面的帧分离开来的帧
其中错误帧、过载帧、帧间隔都是由硬件自动完成的,没有办法用软件来控制。对于一般使用者来说,只需要掌握数据帧与遥控帧。数据帧和遥控帧有标准格式与扩展格式。标准格式有11位标识符,扩展格式有29位标识符。
数据帧介绍
标准帧


- 帧起始:1位,总线空闲时发送
- 总裁段:
- 标识符位:11位,可以理解为节点ID**(高位在前)**
- 远程发送请求位:区分是数据帧还是远程帧(显性信号0代表数据帧)
- 控制段:
- IDE位:1位 区分标准格式还是拓展格式(显性电平代表标准格式)
- R0位:保留位:以后使用
- DLC段:4位 用于表示本报文中的数据有多少个字节。
- 数据段:64位。8个字节
- CRC段:
- CRC校验码:15位 用于校验传输是否正确
- 界定符:隐性位,表示CRC校验的结束(同时释放总线,等待接收方拉低)
- ACK段:
- ACK确认位:发送方发送完之后接收方会将总线置显性0表示接收到了信息。
- 界定符:隐性位,用于跟后面的分开(同时接收方释放总线)
- 帧结束:7个隐性位表示帧的结束

拓展帧

扩展帧与标准帧的不同在于仲裁段和控制段,其他完全一样。

遥控帧
遥控帧就是发送一个请求,没有数据。

错误帧
总线上所有设备都会监督总线的数据,一旦发现"位错误"或"填充错误"或"CRC错误"或"格式错误"或"应答错误" ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备

过载帧
当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失

位填充
位填充规则:发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据
例如:

作用:
当发送方发送一连串相同的电平时,会对接收方的接受造成干扰
将正常数据流与"错误帧"和"过载帧"区分开,标志"错误帧"和"过载帧"的特异性
can总线仲裁
CAN总线处于空闲状态的时候,最先发送消息的单元获得发送权。
多个单元同时开始发送时,从仲裁段(报文id)的第一位开始进行仲裁。连续输出显性电平最多的单元可以继续发送,即首先出现隐性电平的单元失去对总线的占有权变为接收。(即报文id小的优先级高)。(因为我们的仲裁段是高位在前的,谁先出现0,谁的优先级就高)
竞争失败,会自动检测总线空闲,在第一时间再次尝试发送。
can的位时序介绍
**位同步:**是为了解决时序同步的机制,这里一帧包含了四位:


同步段的时间往往被看做是这一帧的时间单元,后面三段的时间都需要是同步段时间的整数倍
**同步段:**ss的大小固定是1Tq,若通讯节点检测到总线上信号的跳变沿被包含在 SS段的范围之内,则表示节点与总线的时序是同步的 。这段看不懂不用管了
**传播时间段:**CAN总线上数据的传输会受到各种物理延迟。比如发送单元的发送延迟、总线上信号的传播延迟、接收单元的输入延迟等。PTS段就是用来补偿这些因素产生的时间延迟。这样降低波特率来实现稳定的功能
**相位缓冲段1:**主要是来补偿边沿阶段的误差。它的时间长度在重新同步阶段的时候可以被自动加长。PBS1段的初始大小可以为1~8Tq。
相位缓冲段2:另一个相位缓冲段,也是用来补偿边沿阶段误差的,他的时间长度在重新同步阶段会被缩短。
位同步
CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长
发送方以约定的位时长每隔固定时间输出一个数据位
接收方以约定的位时长每隔固定时间采样总线的电平,输入一个数据位
理想状态下,接收方能依次采样到发送方发出的每个数据位,且采样点位于数据位中心附近
硬同步
因为can总线没有时钟线,他们传输数据是按照双方约定好的波特率来实现的。当发送方率先发送报文,随后接收方接收到SOF的下降沿后,接收方会直接把自己的位时序周期拨动到ss的位置与发送方的时序保持一致。

可以类比为右边的钟表,每一时刻所有的节点都必须指向同一位置。
再同步
我们的理想状态下是接收方在数据中心采样,但是这只是一种理想的状态,我们难免会因为一些影响导致我们的采样点不在数据中心位,所以我们有一个解决方法就是我们在一个跳变沿开始计时到采样时刻,如果时间短的话,那就让后面采样慢一点。以此类推。
仲裁
**不同时发:**这时,设备1正在发送数据,然后设备2检测到有设备正在发送数据,所以说设备2进入等待状态。等待下一次总线空闲;总线空闲:当检测到11位隐性电平时,就认为此时总线是空闲状态。一旦有设备正在发数据,总线就会变成活跃状态,必然不会出现11个隐性电平。

**同时发:**总线空闲时,来了两个设备来争夺,那么ID号小的(优先级高)的先发送,ID号大的(优先级低)后发送。这里有两个特点就是:1.总线的线与特性;2.回读机制。因为这两个特性正是硬件自身判断ID号大小的关键。

两个设备同时来的,设备1和设备2发送起始位,都是显性0,将总线拉低,他们分别回读后发现与自身一样,就进行下一位的判断。随后通过判断前几位,两个设备对总线的操作都是一样的,回读也与自身一样。直到红色时刻。单元1发送隐性1,拉高总线,单元2发送显性0,拉低总线。因为总线线与的特性,所以总线呈现出拉低的状态,单元1回读后发现与自身不一样,那他就放弃总线的争夺,等到下一次的总线空闲再去争夺。