参考文章链接:一文读懂CAN总线协议 (超详细配34张高清图)_can总线协议详解-优快云博客
一、熟悉can通信
CAN总线由两根信号线,CANH和CANL,没有时钟同步信号,无需共地。所以CAN是一种异步通信方式,与UART的异步通信方式类似,CAN总线的两根信号线通常采用的是双绞线,如下图4所示,传输的是差分信号,通过两根信号线的电压差CANH-CANL来表示总线电平。以差分信号传输信息具有抗干扰能力强,能有效抑制外部电磁干扰等优点,这也是CAN总线在工业上应用广泛的一个原因。
1、can总线结构
can总线分为开环结构和闭环结构
开环结构:
各自串联一个2.2k欧的电阻。这种CAN总线网络由ISO11519-2标准定义,是低速can、远距离的CAN网络,通信速率最高125kbit/s。在40kbit/s速率时,总线最长距离可达1000m。
闭环结构:
闭环结构的CAN总线网络,总线两端各连接一个120欧的电阻,两根信号线形成回路。这种CAN总线网络由ISO 11898标准定义,是高速can、短距离的CAN网络,通信速率为125kbit/s到1Mbit/s。在1Mbit/s通讯速率时,总线长度最长达40m。
闭环can总线发送0时将H和L电平拉开,发送1是不对总线进行操作,终端电阻会自动将H,L电平缩紧
总结
在CAN网络中,没有主设备和从设备的区别。一个CAN节点的硬件部分一般由CAN控制器和CAN收发器两个部分组成。CAN控制器负责CAN总线的逻辑控制,实现CAN传输协议;CAN收发器主要负责MCU逻辑电平与CAN总线电平之间的转换。
CAN控制器一般是MCU的片上外设,例如,STM32F407由两个CAN控制器。CAN收发器一般是单独的芯片,并且根据CAN总线的结构不同,需要使用不同的CAN收发芯片,例如,STM32F407开发板上使用的CAN收发芯片是TJA1040,只能构成闭环网络结构。
2、can总线特点
实时性: CAN总线具有优越的实时性能,适用于需要及时传输数据的应用,如汽车控制系统、工业自动化等。仲裁机制和帧优先级的设计保证了低延迟和可预测性。
多主机系统: CAN支持多主机系统,多个节点可以同时发送和接收数据。这种分布式控制结构使得系统更加灵活,适用于复杂的嵌入式网络。CAN总线上的节点既可以发送数据又可以接收数据,没有主从之分。但是在同一个时刻,只能由一个节点发送数据,其他节点只能接收数据。
差分信号传输: CAN使用差分信号传输,通过两个线路(CAN_H和CAN_L)之间的电压差来传递信息。这种差分传输方式提供了良好的抗干扰性能,使得CAN总线适用于工业环境等有电磁干扰的场合。
仲裁机制: CAN总线采用非破坏性仲裁机制,通过比较消息标识符的优先级来决定哪个节点有权继续发送数据。这种机制确保了总线上数据传输的有序性,避免了冲突。
广播通信: CAN总线采用广播通信方式,即发送的数据帧可以被总线上的所有节点接收。这种特性有助于信息的共享和同步,同时减少了系统的复杂性。
低成本: CAN总线的硬件成本相对较低,适用于大规模的系统集成。由于CAN控制器在硬件上实现了仲裁机制,无需额外的主机处理器,减小了成本和复杂性。
灵活性: CAN协议灵活适应不同的应用场景,支持不同的波特率和通信速率。这使得CAN总线可以被广泛用于各种嵌入式系统,从低速的传感器网络到高速的汽车控制系统。
错误检测和处理: CAN总线具有强大的错误检测和处理机制。通过CRC检查和其他错误检测手段,CAN能够识别和处理传输过程中可能发生的错误,提高了通信的可靠性。
多种帧类型:**CAN总线上的节点没有地址的概念。CAN总线上的数据是以帧为单位传输的,帧又分为数据帧、遥控帧等多种帧类型,帧包含需要传输的数据或控制信息。
线与逻辑:CAN总线具有“线与”的特性,也就是当由两个节点同时向总线发送信号时,一个是发送显性电平(逻辑0),另一个发送隐性电平(逻辑1),则总线呈现为显性电平。这个特性被用于总线总裁,也就是哪个节点优先占用总线进行发送操作。
特定标识符:每一个帧有一个标识符(Identifier,一下简称ID)。ID不是地址,它表示传输数据的类型,也可以用于总线仲裁时确定优先级。例如,在汽车的CAN总线上,假设用于碰撞检测的节点输出数据帧ID为01,车内温度检测节点发送数据帧的ID为05等。
滤波特性:每个CAN节点都接收数据,但是可以对接收的帧根据ID进行过滤。只有节点需要的数据才会被接收并进一步处理,不需要的数据会被自动舍弃。例如,假设安全气囊控制器只接受碰撞检测节点发出的ID为01的帧,这种ID的过滤时有硬件完成的,以便安全气囊控制器在发送碰撞时能及时响应。
**半双工:**CAN总线通信时半双工的,即总线不能同时发送和接收。在多个节点竞争总线进行发送时,通过ID的优先级进行仲裁,竞争胜出的节点继续发送,竞争失败的节点立刻转入接收状态。
**无时钟信号:**CAN总线没有用于同步的时钟信号,所以需要规定CAN总线通信的波特率,所以节点都是用同样的波特率进行通信。
3、can电平标准
can总线采用差分信号,即两线电压差(Vcan_H - Vcan_L)传输数据位
高速can规定:
电压差为0v时表示逻辑1(隐性电平)
电压差为2v时表示逻辑0(显性电平)
低速can规定:
电压差为-1.5v时表示逻辑1(隐性电平)
电压差为3v时表示逻辑0(显性电平)
4、can的各类帧
can协议规定了以下5种类型的帧
数据帧(发送设备主动发送数据)
注意:图中的数字代表位数
D显性(0)
R隐性(1)
sof:帧起始位,表示后面一段波形为传输的数据位
ID:标识符,区分功能,同时决定优先级(越小优先级越高)
RTR:远程请求位,区分数据帧和遥控帧
IDE:扩展标志位,区分标准格式和扩展格式
SRR:替代RTR,协议升级留下来的无意义位,为保证仲裁优先级原则,这一位要给1
r0/r1:保留为,为后续协议升级留下空间
DLC:数据长度,指示数据段有几个字节
Data:数据段的1~8个字节有效数据
CRC:循环冗余校验
CRC界定符:1是为了区分开校验和应答,2是为了让发送方释放总线,便于接收应答
ACK:应答位,判断数据是否正确
ACK槽:发送的数据是否有应答,在发送方发送完主要数据后会释放一段时间的总线,如果有应答总线呈现显性0的状态,发送方在释放总线结束后会读取ACK槽,来看是否有接收
应答,没有应答可以重现发送也可以不管。
ACK界定符:接收方应答后要交出总线,
CRC/ACK界定符:为应答位前后发送方和接收方释放总线留下时间
EOF:帧结束,表示数据位已经传输完毕
发送数据时发送和接收方是同时监视总线的,当发送方发送一段数据结束之前,接收方其实已经接受到这段数据了!!!!
遥控帧(接收设备主动请求数据,用于数据频率不高的场景)
遥控帧无数据段,RTR为隐性电平1,其他部分与数据帧相同
错误帧(某个设备检测出错误时向其他设备通知错误)
总线上所有设备都会监视总线数据,一旦发现“为错误”“填充错误”“CRC错误”“格式错误”“应答错误”,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备
过载帧(接受设备通知其尚未做好接收准备)
当接收方收到大量数据而无法处理时,其可以发送过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失
帧间隔(用于将数据帧及遥控帧与前面的帧分离开)
第一种为主动错误状态
第二种为被动错误状态
5、can总线位填充
填充规则:发送方每发送5个相同的电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据。
发送数据 10000011110
实际发送的数据 1000001111100
实际接收的数据 1000001111100
移除填充后 10000011110
位填充的作用:
增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化,导致接收方不能精确掌握数据采样的时机
将正常数据流与“错误帧”“过载帧”区分开,标志“错误帧”“过载帧”的特异性
保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲,can总线认为总线上出现连续11个1隐性,视为总线空闲
6、can总线接收方数据采样
问题:接收方以约定的位时长进行采样,但是采样点没有对齐数据位中心附近
采样点的初始位置以第一次跳变沿为参考延迟半个数据位时间,进行第一次采样,硬同步
问题:接收方刚开始采样正确,但是时钟有误差,随着误差积累,采样点逐渐偏离
根据检测跳变沿与采样时间间隔,如果跳变到采样时间间隔偏离太大,就让下一次采样提前一点点
为了调整位采样时间点,can将位的时间进行细致的划分->位时序
can位时序
为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分,分为同步段(SS),传播时间段(PTS),相位缓冲段1(PBS1),相位缓冲段2(PBS2),每段又由若干个最小时间单位(Tq)构成
注意:数据采样在PBS1和PBS2之间,因此PBS1设置短了数据就会靠前采样,PBS2设置短了就会靠后采样
can硬同步
也叫硬件同步,使接收方第一位数据采样点在位中间,原理实现:
1:每个设备都有一个位时序计时周期,当某个设备(发送方)率先发送报文,其他设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到ss段的位置,与发送方的位时序计时周期保持同步
2:硬同步只在帧的第一个下降沿(SOF下降沿)有效
3:经过硬同步后,若发送方和接收方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近。
波形是发送方波形,第一张是检测到跳变不在SS段,第二张是检测后接收方进行位时序调整之后的,保证每段数据SOF跳变在接收方SS段
can再同步
1:若发送方或接收方的始终有误差,随着误差的积累,数据位边沿逐渐偏离SS段,则此时接收方根据再同步补偿宽度最大值(SJW)通过加长PBS1段或缩短PBS2段以调整同步 ,
2:再同步可以发生在第一个下降沿之后的每个数据位跳变沿
SJW = 1~4Tq
第一中情况是,接收方的时钟频率比发送方快,为什么是快?如果是相同的或这个条边沿应该在SS段,而现在跑到SS段之前的PTS段,是不是接收方在上次一检测完数据后在下一个数据位快于发送方呢。第二种接收方时钟比发送方慢
注意:SJW是补偿最大值,补偿补多少下限取决于偏离多少个Tq上限取决于SWJ,如果时钟偏差不大设置SJW过大会导致时序混乱
7、can波特率计算
波特率 = 1/一个数据位时长 = 1/(TSS+TPTS+TPBS1+TPBS2)
8、can多设备同时发送数据问题
资源分配规则1:先占先得(用于先到先发)
资源分配规则2:非破坏性仲裁(多个设备同时发,ID号+RTR小的优先级高优先发)
条件:1线与特性,2有回读机制
ID号相同的数据帧优先于遥控帧
标准格式11位ID号与扩展格式29位ID号的高11位相同时,标准格式优先级高于扩展格式
9、Can错误处理
错误共有 5 种。多种错误可能同时发生。
- 位错误
- 填充错误
- CRC 错误
- 格式错误
- ACK 错误
错误的种类、错误的内容、错误检测帧和检测单元如表 6 所示
总线上所有设备都会监视总线数据,一旦发现“为错误”“填充错误”“CRC错误”“格式错误”“应答错误”,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备,发送错误帧有两种主动错误帧,被动错误帧,这是根据错误状态进行选择的
错误状态
主动错误状态的设备正常参与通讯并在检测到错误时发出主动错误帧
被动错误状态的设备正常参与通讯但在检测到错误时只能发出主动错误帧
总线关闭状态的设备不参与通信
每个设备内部管理一个ETC和REC,根据TEC和REC的值确定自己的状态,状态转化看下图表,出现错误增加的值看下下一图表
总结: 出错就会对应计数值累加,正确一次就减1,当满足状态转换条件时进行状态转换,