本篇文章就是一个自己的小笔记,后续会慢慢修改
笔记来源https://www.bilibili.com/video/BV1vu4m1F7Gt/?spm_id_from=333.999.0.0
目录
1.什么是can总线
can总线是一种简洁易用,传输快,易扩展,可靠性高的串行通讯总线,广泛用于汽车、嵌入式、工业控制等领域。
1.1特点
差分信号通讯、(CAN_H、CAN_L)、抗干扰能力、强线路少,无需共地 |
---|
高速CAN(ISO11898):125k~1Mbps, <40m |
低速CAN(ISO11519):10k~125kbps, <1km |
异步、无需时钟线、通讯速率由各自设备决定 |
半双工、可挂载多设备,同时发送数据、通过仲裁判断先后顺序 |
11位/29位报文ID,用于区分消息功能,决定优先级 |
可配置1~8字节有效载荷 |
可实现广播式和请求式两种传输方式 |
有应答、CRC校验、位填充、位同步、错误处理等特性 |
1.2区别
名称 | 引脚 | 双工 | 时钟 | 电平 | 设备 | 应用场景 |
---|---|---|---|---|---|---|
CAN | CAN_H、CAN_L | 半双工 | 异步 | 差分 | 多设备 | 多主互通 |
UART | TX、RX | 全双工 | 异步 | 单端 | 点对点 | 两设备互相通讯 |
SPI | SS、SCK、MOSI、MISO | 全双工 | 同步 | 单端 | 多设备 | 一主多从 |
I2C | SCL、SDA | 半双工 | 同步 | 单端 | 多设备 | 一主多从 |
UART原理图
I2C原理图
SPI原理图
扩展
串行通讯 | 特点 |
---|---|
单工 | 数据只能单向传输 |
半双工 | 数据可以双向传输但不能同时 |
全双工 | 数据可以同时双向传输 |
时钟 | 特点 |
---|---|
异步 | 无需时钟线、通讯速率由各自设备决定 |
同步 | 有时钟线、按照同一个时钟节拍工作 |
电平 | 特点 |
---|---|
单端 | 用一个线传输,是信号线和地的电势差,抗干扰性弱 |
差分 | 两个线传输,一方变化另外一方也会变化,抗干扰信号强 |
2.can总线的硬件电路
2.1硬件电路
每个设备要通过CAN收发器挂载在CAN总线上,CAN控制器引出的引脚TX、RX要和CAN收发器相连,而CAN收发器引出的CAN_H和CAN_L分别和总线的CAN_H和CAN_L相连
高速CAN使用的是闭环线路,CAN_H和CAN_L两端添加120Ω的终端电阻
低速CAN使用开环网络,CAN_H和CAN_L其中一端添加2.2kΩ的终端电阻
2.2电平标准
CAN总线采用差分信号,即两线电压差(VCAN_H-VCAN_L)传输数据位 高速CAN规定: 电压差为0V时表示逻辑1(隐性电平) 电压差为2V时表示逻辑0(显性电平)
低速CAN规定: 电压差为-1.5V时表示逻辑1(隐性电平) 电压差为3V时表示逻辑0(显性电平)
注意:
在低速CAN中隐性电平中电压不相等(因为长久传输可以会出现压降,所以把1和0的电平电压差距加大),所以在电路中总线两端不能闭合在一起。
同理在高速中的隐性电平两端电压相等,所以在电路中总线闭合电阻有利于总线快速回归隐性电平。回归快所以传输就快
2.3CAN收发器
2.4 CAN物理层特性
3. can总线的帧格式
CAN协议规定了以下5种类型的帧
帧类型 | 用途 |
---|---|
数据帧 | 发送设备主动发送数据(广播式) |
遥控帧 | 接收设备主动请求数据(请求式) |
错误帧 | 某个设备检测出错误时向其他设备通知错误 |
过载帧 | 接收设备通知其尚未做好接收准备 |
帧间隔 | 用于将数据帧及遥控帧与前面的帧分离开 |
3.1 数据帧
3.1.1 帧起始
一个数据位,是为显性0电平,通知各个节点有数据传输,其他节点通过帧起始信号的电平跳变沿来进行硬同步。
3.1.2 仲裁段
*仲裁段包括:报文ID和RTR组成/SRR。RTR是远程请求位/SRR,协议升级留下的无意义位。*
RTR:数据帧为显性0
选择帧为隐形1。
报文ID:标准格式为11位,
扩展格式为29位。
仲裁通过ID来确定的。在物理层上,当总线上发同时出现显性电平和隐形电平,总线的状态会被置为显性电平。所以当两个节点同时竞争CAN总线时,若首先出现隐形电平,就会进入接收状态,里一个继续发送
仲裁段ID的优先级也影响着接收设备对报文的反应。因为在CAN总线上数据是以广播的形式发送的,所有连接在CAN总线的节点都会收到所有其它节点发出的有效数据,因而我们的CAN控制器大多具有根据ID过滤报文的功能,它可以控制自己只接收某些ID的报文。
3.1.3 控制段
控制段包括:IDE、r0和DLC
IDE:标识符扩展位,用于区分标准格式(显性电平位)和扩展格式(隐性电平)。
DLC: 数据长度码,表示本报文数据段多少字节,4位数据位,表示对数字为0~8。
r0: 保留位,默认显性电平。
3.1.4 数据段
数据段为数据帧核心内容,是节点要发送的原始信息,由0~8个字节组成,MSB先行。
3.1.5 CRC段
CRC段包括:CRC校验码和CRC界定符。
CRC校验码:保证报文正确传输,当接收节点算出的CRC码(从SOF到DATA这些数据位)和接收到的CRC码不同,就会向发送节点反馈出错信息,利用错误帧请求重写发送。
CRC界定符: 把CRC校验码和ACK间隔起来,隐性位1。
3.1.6 ACK段
ACK段包括:ACK槽和ACK界定符。
ACK槽:类似I2C总线,发送节点位隐性位,接收节点位显性位。
ACK界定符:把ACK槽和帧结束间隔起来,隐性位1。
3.1.7 帧结束
译为帧结束,帧结束段由发送节点发送的7个隐性位 表示结束。
3.1.8 总结
名称 | 功能 |
---|---|
SOF | 帧起始,表示后面一段波形为传输的数据位 |
ID | 标识符,区分功能,同时决定优先级 |
RTR | 远程请求位,区分数据帧和遥控帧 |
IDE | 扩展标志位,区分标准格式和扩展格式 |
SRR | 替代RTR,协议升级时留下的无意义位 |
r0/r1 | 保留位,为后续协议升级留下空间 |
DLC | 数据长度,指示数据段有几个字节 |
Data: | 数据段的1~8个字节有效数据 |
CRC | 循环冗余校验,校验数据是否正确 |
ACK | 应答位,判断数据有没有被接收方接收 |
界定符 | 为应答位前后发送方和接收方释放总线留下时间 |
EOF | 帧结束,表示数据位已经传输完毕 |
3.2 遥控帧
遥控帧无数据段,RTR为隐形电平1,其他部分和数据帧相同
3.3 错误帧
总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误” ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备
3.4 过载帧
当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失
、
3.5 帧间隔
将数据帧和远程帧与前面的帧分离开
3.6 位填充
位填充规则:发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据
例如:
即将发送 | 100000110 | 10000011110 | 0111111111110 |
实际发送 | 1000001110 | 1000001111100 | 011111011111010 |
实际接收 | 1000001110 | 1000001111100 | 011111011111010 |
移除填充后 | 100000110 | 10000011110 | 0111111111110 |
位填充作用:
- 增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化,导致接收方不能精确掌握数据采样时机 。
- 将正常数据流与“错误帧”和“过载帧”区分开,标志“错误帧”和“过载帧”的特异性 。
- 保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲(当can总线有11个隐性1则为空闲)。
3.7 波形实例
标准数据帧,报文ID为0x555,数据长度1字节,数据内容为0xAA
标准数据帧,报文ID为0x666,数据长度2字节,数据内容为0x12, 0x34
扩展数据帧,报文ID为0x0789ABCD,数据长度1字节,数据内容为0x56
*标准遥控帧,报文ID为0x088,数据长度1字节,无数据内容**
4.can总线接收方的采样
4.1 位时序
为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分,分为同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每个段又由若干个最小时间单位(Tq)构成
4.2 硬同步
每个设备都有一个位时序计时周期,当某个设备(发送方)率先发送报文,其他所有设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方的位时序计时周期保持同步 硬同步只在帧的第一个下降沿(SOF下降沿)有效 经过硬同步后,若发送方和接收方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近。
但是不能每个数据跳变沿执行硬同步,因为数据波形抖动时,接收方秒表周期反复调整多次,这样数据就会出错。
例子:接收方以约定的位时长进行采样,但是采样点没有对齐数据位中心附近
4.3 再同步
若发送方或接收方的时钟有误差,随着误差积累,数据位边沿逐渐偏离SS段,则此时接收方根据再同步补偿宽度值(SJW)通过加长PBS1段,或缩短PBS2段,以调整同步 再同步可以发生在第一个下降沿之后的每个数据位跳变边沿 SJW=1~4Tq
例子:接收方刚开始采样正确,但是时钟有误差,随着误差积累,采样点逐渐偏离
4.4 波特率计算
波特率 = 1 / 一个数据位的时长 = 1 / (TSS + TPTS + TPBS1 + TPBS2) 例如: SS = 1Tq,PTS = 3Tq,PBS1 = 3Tq,PBS2 = 3Tq Tq = 0.5us 波特率 = 1 / (0.5us + 1.5us + 1.5us + 1.5us) = 200kbps
例子:如果CAN通讯速率位125kbps那 SS PTS PBS1 PBS2 Tq 怎么设置。
1/x=125 kbps、x=8 us、Tq=0.8 us、SS=0.8us、PTS=2.4us 、PBS1=2.4us 、PBS2=2.4us
5.can总线多设备发送遇到的问题
CAN总线只有一对差分信号线,同一时间只能有一个设备操作总线发送数据,若多个设备同时有发送需求,该如何分配总线资源?
5.1 规则1-先占先得
-
若当前已经有设备正在操作总线发送数据帧/遥控帧,则其他任何设备不能再同时发送数据帧/遥控帧(可以发送错误帧/过载帧破坏当前数据)
-
任何设备检测到连续11个隐性电平,即认为总线空闲,只有在总线空闲时,设备才能发送数据帧/遥控帧
-
一旦有设备正在发送数据帧/遥控帧,总线就会变为活跃状态,必然不会出现连续11个隐性电平,其他设备自然也不会破坏当前发送
-
若总线活跃状态其他设备有发送需求,则需要等待总线变为空闲,才能执行发送需求
5.2 规则2- 非破坏性仲裁
若多个设备的发送需求同时到来或因等待而同时到来,则CAN总线协议会根据ID号(仲裁段)进行非破坏性仲裁,ID号小的(优先级高)取到总线控制权,ID号大的(优先级低)仲裁失利后将转入接收状态,等待下一次总线空闲时再尝试发送。 实现非破坏性仲裁需要两个要求:
-
线与特性:总线上任何一个设备发送显性电平0时,总线就会呈现显性电平0状态,只有当所有设备都发送隐性电平1时,总线才呈现隐性电平1状态,即:0 & X & X = 0,1 & 1 & 1 = 1
-
回读机制:每个设备发出一个数据位后,都会读回总线当前的电平状态,以确认自己发出的电平是否被真实的发送出去了,根据线与特性,发出0读回必然是0,发出1读回不一定是1
5.3 非破坏性仲裁过程
数据位从前到后依次比较,出现差异且数据位为1的设备仲裁失利
6.can总线的错误处理
6.1 错误类型
错误共有5种: 位错误、填充错误、CRC错误、格式错误、应答错误
当发送和接收单元检测到上面的错误时,就会发送错误帧破坏总线数据。但是!!! ,如果一个设备自己出现问题,他认为收到的全是错误信息,就去一直破坏总线传输的信息,所以为了避免这种情况就出现了一个错误状态的处理。
6.2 错误状态
每个设备内部管理一个TEC和REC,根据TEC(发送)和REC(接收)的值确定自己的状态 主动错误状态的设备正常参与通信并在检测到错误时发出主动错误标志 被动错误状态的设备正常参与通信但检测到错误时只能发出被动错误标志 总线关闭状态的设备不能参与通信
但是在总线关闭态时,这时在总线检测到128次连续11个位的隐性位时,就会回到主动错误状态,TEC和REC清0。