| 编辑推荐: |
本文主要介绍了CAN总线的基础知识,包括其硬件电路实现、电平标准和各种帧格式,希望对您的学习有所帮助。
本文来自于壹零肆工作室,由火龙果软件Alice编辑、推荐。 |
|
引言: 对于CAN这篇我计划分为两个篇幅来讲,一篇讲CAN的硬件电路实现和帧格式,另一篇讲代码的具体实现。 一、简介( 了解一下就行 ):
CAN总线(ControllerArea Network Bus)控制器局域网总线CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域,下面的图片是高速CAN和低速CAN的对比:
CAN总线特征( 需要记住 ):
- 两根通信线(CAN H、CAN L),线路少,无需共地差分信号通信,抗干扰能力强
- 高速CAN(ISO11898):125k~1Mbps,<40m
- 低速CAN(ISO11519)10k~125kbps,<1km
- 异步,无需时钟线,通信速率由设备各自约定
- 半双工,可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序11位/29位报文ID,用于区分消息功能,同时决定优先级
- 可配置1~8字节的有效载荷
- 可实现广播式和请求式两种传输方式
- 应答、CRC校验、位填充、位同步、错误处理等特性
二、硬件电路( 了解一下就行 )
- 每个设备通过CAN收发器挂载在CAN总线网络上
- CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CANH和CAN L分别与总线的CAN H和CANL相连
- 注 :在STM32中的CAN外设电路,CAN控制器只会引出TX和RX两个引脚,这两个引脚不能直接引在CAN总线,必须通过CAN收发器来引入。
- 此时就会有小伙伴问了, STM32不是有两个引脚是can通信的嘛?为什么还需要一个can收发器来进行通信,而不是直接用这两个引脚啊?
- 答: 因为CAN协议设计的有回读机制,CAN_TX和RX引脚电平也不是差分信号
那又有人问了,为什么不把 CAN收发器芯片也集成到STM32里呢?
答:母鸡啊,可能因为电平标准不一样或者为了保护、隔离电路吧
- 高速CAN使用 闭环 网络: CAN H和CAN L两端添加120欧的终端电阻
- 低速CAN使用 开环 网络:CAN_H和CAN_L其中一端添加2.2千欧的终端电阻
左侧为闭环高速CAN,右侧是开环低速CAN
三、CAN电平标准( 需要弄明白 )
CAN总线采用差分信号,即两线 电压差 (Vh-Vl) 传输数据位
- 高速CAN规定:
- 电压差为0V时表示 逻辑1(隐性电平)
- 电压差为2V时表示逻辑0 (显性电平)
- 低速CAN规定:
- 电压差为-1.5V时表示逻辑1(隐性电平)
- 电压差为3V时表示逻辑0(显性电平)
四、CAN总线帧格式( 要弄明白 )
1.数据帧 ( 好好看 )
- 用途:发送设备主动发送数据,属于广播式的通信方式
- 格式: 分为 标准格式和扩展格式两种格式
图例解析:
- 灰色部分D表示显性电平0
- 白色部分R表示隐性电平1
- 紫色部分D/R表示根据发送数据的不同,可以选择显性电平0或隐性电平1
- 白色和灰色部分(ACK)是应答位特有的,发送方必须发隐性1,接收方必须发送显性0
- 图例中间的数字表示此段时序所占的位数
设计者的思路 ( 看一遍 ) :
- 需要设计一个波形承载波段,那必然有数据段,
- 又想要几个数据段的几个字节是可调的,所以加了 DLC ,用于指定数据段的长度
- 为了区分数据的功能,就在前面加了 ID 号
- 为了实现广播式,类似只写,或者请求式,类似读取,就有了 RTR 位进行区分
- 为了判断数据是否正确传输,就有了 CRC 校验
- 为了判断是否有接收方,就有了 ACK 应答设计
- IDE 和 r0 是保留位,为了后续升级,现在的 IDE 用于区分标准帧和扩展帧格式
- 最后整个波形前面套上起始,后面套上结束,这个伟大的波形设计就大功告成了
扩展格式: 当标准格式的11位ID不够用时,就用到了扩展格式,且扩展格式也要保持对标准格式的兼容。 在上图可以看到标准格式的RTR挪到了老后面,原来标准格式的RTR的位置就空出来了,但是这一位也不能当做别的用途,是为了保证仲裁规则中,标准格式的优先级高于扩展格式,这一位SRR虽然没用,但必须要给隐形电平1,至于仲裁流程,后续再说。 然后就是IDE了,扩展格式要为隐性1。 最后做个总结( 枯燥无味,不看了 ):
| SOF |
帧起始,表示后面一段波形为传输的数据位 |
| ID |
标识符,区分功能,同时决定优先级 |
| RTR |
远程请求位,区分数据帧和遥控帧 |
| IDE |
扩展标志位,区分标准格式和扩展格式 |
| SRR |
替代RTR,协议升级时留下的无意义位 |
| r0/r1 |
保留位,为后续协议升级留下空间 |
| DLC |
数据长度,指示数据段有几个字节 |
| Data |
数据段的1~8个字节有效数据 |
| CRC |
循环冗余校验,校验数据是否正确 |
| ACK |
应答位,判断数据有没有被接收方接收 |
| CRC/ACK 界定符 |
为应答位前后发送方和接收方释放总线留下时间 |
| EOF |
帧结束,表示数据位已经传输完毕 |
2.遥控帧 ( 稍微看一下 )
知道了数据帧,看这个遥控帧应该就很简单:
遥控帧无数据段,RTR为隐性电平1,其他部分与数据帧相同
3.错误帧 ( 了解即可 )
总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误"或“CRC错误”或“格式错误”或“应答错误”,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备
4.过载帧 ( 了解即可 )
当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失
5.帧间隔 ( 了解即可 )
将数据帧和远程帧与前面的帧分离开
五、位填充( 要弄明白 )
规则: 发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据。如:
位填充作用:
- 增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化导致接收方不能精确掌握数据采样时机
- 将正常数据流与“错误帧"和“过载帧”区分开,标志“错误帧"和“过载帧”的特异性
- 保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲
|