Can基础
CAN是什么
CAN 是 Controller Area Network(控制器局域网)的缩写,它是一种串行通信协议和总线系统,最初设计用于汽车电子系统中的通信。
CAN 是由罗伯特·博世公司(Robert Bosch GmbH)在 1980 年代初开发的,旨在解决汽车电子系统中的通信需求。它提供了一种可靠的、实时的、高速的数据通信方式,用于在车辆的各个电子控制单元(ECU)之间进行通信。
CAN 总线采用了多主从的通信结构,其中一个或多个主节点负责控制总线的访问和数据传输,而从节点则接收和发送数据。CAN 总线使用差分信号传输,即使用两个线路(CAN_H 和 CAN_L)进行数据传输,以提高抗干扰能力。
CAN 协议具有以下特点和优势:
- 可靠性:CAN 使用差分信号传输,具有抗干扰能力强的特点,适用于车辆等电磁环境复杂的场景。
- 实时性:CAN 提供了实时的数据传输,用于传输对实时性要求较高的信息,如引擎控制、制动系统等。
- 高速性:CAN 总线的通信速率可达到 1 Mbps,能够满足大多数应用的需求。
- 灵活性:CAN 具有广播和点对点两种通信模式,支持多个节点同时进行通信。
- 易于扩展:CAN 支持在总线上添加或移除节点,并且具有较好的可扩展性。
- 错误检测和纠正:CAN 使用 CRC(循环冗余校验)进行错误检测,还具有错误报告和错误处理机制。
CAN物理层
CAN通信是一种异步通信方式,不依赖于时钟信号进行同步。它使用两条信号线,即CAN_High(CAN_H)和CAN_Low(CAN_L),以差分信号的形式进行通信。
CAN物理层主要有两种形式:
高速闭环网络(符合ISO 11898标准):该网络适用于短距离通信,总线最大长度为40米,通信速率最高可达1 Mbps。在总线的两端,需要分别连接一个120欧姆的电阻。
低速开环网络(符合ISO 11519-2标准):该网络适用于远距离通信,最大传输距离可达1千米,最高通信速率为125 kbps。该网络由两根独立的总线组成,不形成闭环结构,在每根总线上都需要串联一个2.2千欧姆的电阻。
CAN协议层
CAN通信是一种异步通信方式,没有时钟信号线。在一个共享总线网络中,各个节点之间使用约定好的波特率进行通信。CAN使用位同步的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。
位时序分解:为了实现位同步,CAN协议采用了位时序分解的方法。每个数据位被分解为SS(同步段)、PTS(传输段)、PBS1(位填充段1)和PBS2(位填充段2)四个部分,它们的长度加起来构成一个CAN数据位的长度。最小时间单位为Tq(时间量子),一个完整的位由8到25个Tq组成。
段名称 | 作用 | Tq数 |
---|---|---|
SS 段 (SYNC SEG) | 同步段,若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的范围之内,则表示节点与总线的时序是同步的 | 1Tq |
PTS 段 (PROP SEG) | 传播时间段,用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍 | 1~8Tq |
PBS1 段 (PHASE SEG1) | 相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长 | 1~8Tq |
PBS2 段 (PHASE SEG2) | 另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短 | 2~8Tq |
波特率:总线上的各个通讯节点只要约定好 1 个 Tq 的时间长度以及每一个数据位占据多少个 Tq,就可以确定 CAN 通讯的波特率。
同步过程:波特率只是约定了每个数据位的长度,数据同步还涉及到相位的细节,此时就要用到数据位内的 SS、PTS、PBS1 及 PBS2 段了。根据对段的应用方式差异, CAN 的数据同步分为硬同步和重新同步。其中硬同步只是当存在帧起始信号时起作用,无法确保后续一连串的位时序都是同步的,而重新同步方式可解决该问题
- 硬同步:在CAN节点发送数据时,会发送帧起始信号。挂载在CAN总线上的节点会检测总线上的信号,当检测到总线的帧起始信号与节点内部的时序不同步时,节点调整自身的位时序,使得同步后的采样点可以正确采集数据
- 重新同步:当一帧数据很长且节点信号与总线信号相位有偏移时,硬同步无法解决同步问题。重新同步利用普通数据位的跳变沿来同步。它使用SS段进行检测,目的是包含跳变沿。重新同步分为相位超前和相位滞后两种情况
- 相位超前:节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前 2Tq,这时控制器在下一个位时序中的 PBS1 段增加 2Tq 的时间长度,使得节点与总线时序重新同步
- 相位滞后:节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后 2Tq,这时控制器在前一个位时序中的 PBS2 段减少 2Tq 的时间长度,获得同步
报文种类及结构:对数据、操作命令 (如读/写) 以及同步信号进行打包,打包后的这些内容称为报文。CAN 一共规定了 5 种类型的帧
帧 | 帧用途 |
---|---|
数据帧 | 用于节点向外传送数据 |
遥控帧 | 用于向远端节点请求数据 |
错误帧 | 用于向远端节点通知校验错误,请求重新发送上一个数据 |
过载帧 | 用于通知远端节点:本节点尚未做好接收准备 |
帧间隔 | 用于将数据帧及遥控帧与前面的帧分离开来 |
数据帧:数据帧是在 CAN 通讯中最主要、最复杂的报文
段名称 作用 备注 帧起始 SOF,用于通知各个节点将有数据传输 1个数据位(显性电平) 仲裁段 决定数据帧发送的优先级,也决定其它节点是否会接收这个数据帧。标准格式11位,扩展格式29位 RTR位标识是否远程帧(0数据帧;1远程帧),IDE位为标识符选择位(0标准标识符;1扩展标识符),SRR位为代替远程请求位(隐性位),代替了标准帧中的RTR位 控制段 用表示数据段的字节数,由6个位构成 标准帧和扩展帧有所不同,r1和r0为保留位,默认为显性位;DLC为数据长度码,由4位组成,表示本报文中的数据段含有多少个字节 数据段 节点要发送的原始信息 由 0~8 个字节组成,从最高位(MSB)开始输出 CRC段 用于检查帧传输错误 由15个位的CRC顺序和1个位的CRC界定符(用于分隔的位)组成 ACK段 用来确认是否正常接收 由ACK槽(ACK Slot)和ACK界定符2个位组成 帧结束 EOF,由发送节点发送的7个隐性位表示结束 7 个数据位(隐性电平)