CAN的一些知识
根据STM32开发手册的一些笔记记录
一、CAN 物理层
CAN是一种异步通讯,只有CAN_High和CAN_Low两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。
1、总线网络
CAN物理层的形式主要有两种:闭环总线网络和开环总线网络
- 闭环总线网络它允许总线最大长度为40m,最高速度为1Mbps,总线的两端各有120Ω的电阻。
- 开环总线网络最大传输距离为1km,最高通讯速率为125kbps,两根线是独立的,每根线上串联一个2.2kΩ的电阻。
2、通讯节点
CAN节点是指能够挂载在CAN总线上的单元,并能够通过CAN总线实现各个节点间的通信,以实现复杂的控制过程。
连接多节点时,降低通信速率 ,可连接的节点增加;提高通信速率,则可连接的节点数量减少。
CAN通信节点由一个CAN控制器及CAN收发器组成,控制器和收发器之间通过普通的类似TTL逻辑信号来连接,CAN_Low和CAN_High是一对差分信号线。
(1)CAN控制器
CAN控制器用于实现CAN总线的协议底层以及数据链路层,用于生成CAN帧并以二进制的方式发送,在此过程中进行位填充、添加CRC校验、应答检测等操作;将接收到的二进制码进行解析并接收,在此过程中进行收发比对、去位填充、执行CRC校验等操作。
此外还需要进行冲突判断、错误处理等诸多任务。
(2)CAN收发器
CAN收发器(有时也叫做驱动器),用于将二进制码流转换为差分信号发送,将差分信号转换为二进制码流接收。
(3)工作方式
当CAN节点需要发送数据时,控制器把要发送的二进制编码通过CAN_Tx线发送到收发器,然后由收发器把这个普通的逻辑电平信号转换成差分信号,通过差分线CAN_High和CAN_Low线输出到CAN总线网络。
而通过收发器接收总线上的数据到控制器时,是相反的过程。
(4)协议中的差分信号
差分信号又称差模信号。CAN通信是半双工的,收发数据需要分开来进行。
显性电平对应逻辑“0”,隐形电平对应逻辑“1”。
- 当表示隐性电平时(逻辑“1”),CAN_High和CAN_Low的电压均为2.5V,此时它们的电压差为0V。
- 当表示显性电平时(逻辑“0”),CAN_High的电压为3.5V,CAN_Low的电压为1.5V,电压差为2V。
- 显性电平具有优先权,当一个单元(即节点)输出显性电平,总线上即为显性电平。只有所有单元都输出隐性电平,总线上才为隐性电平。
CAN通信是半双工的,收发数据需要分开来进行。公用总线的缘故,整个网络中,同一时刻只能由一个通讯节点发送信号,其余节点在该时刻只能接收。
二、CAN协议层
CAN通信异步通信,没有时钟线,需约定好波特率。
1、位时序的组成
CAN协议将每个数据位的时序分解成4段,即:SS段、PTS段、PBS1段、PBS2段,4段加起来就是一个CAN数据位的长度。分解后的最小时间单位是Tq,一个完整的位由8~25个Tq组成。
下图是总线电平下每个位分解,位时序分解图:
- SS段:称为同步段,用于使总线上的各个节点同步,要求有一个跳变沿位于此段内,该段的长度为1Tq;
- PTS段:称为传播时间段,用于补偿网络内的物理延时,它是信号在总线上传播时间,输入比较器延时和输出驱动器延时之和的两倍,该段长可以为1~8Tq;
- PBS1段:称为相位缓冲段,主要用来补偿变压阶段的误差,它的实际长度在重新同步的时候可以加长,该段大小可以为1~8Tq;
- PBS2段:称为另一个相位缓冲段,也是用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长,该段大小可以为2~8Tq。
2、波特率计算
假设1Tq=1us,19个Tq,则传输一位数据需要的实际为19us,这样每秒可以传输的数据位个数为:1*10^6 / 19 = 52631.58(bps),即为波特率。
3、CAN同步机制
硬同步和重同步。
CAN总线的位同步只有在节点检测到"隐性位"到“显性位”的跳变沿时才会产生。
- 硬同步:在总线空闲时通过一个下降沿来完成,此时不管有没有相位误差,所有节点的位时序将重新开始。强迫引起硬同步的跳变沿位于重新开始的位时间的同步段之内。
- 重同步:在消息帧的随后位中,每当有从“隐性位(1)”到“显性位(0)”的跳变,并且该跳变段落在同步段之外,就会引起一次重同步。重同步机制可以根据跳变沿增长或者缩短位时序以调整采样点的位置,保证正确采样。
相位误差:同步段需要跳变沿,当跳变沿不处于此同步段时,就会产生相位误差,该相位误差就是跳变沿与同步段结束位置直接的距离。
4、CAN报文
CAN使用两条差分信号线,因而只能表示一个信号,于是为了实现完整的传输信号功能,CAN协议便对数据、操作命令以及同步信号进行打包,打包后的内容便称为报文。
(1)报文格式
CAN规定5种类型的帧:数据帧、遥控帧、错误帧、过载帧、帧间隔
数据帧和遥控帧有标准格式和扩展格式两个,唯一不同时标识符(ID)不同。
帧类型 | 帧用途 |
---|---|
数据帧 | 发送单元通过此帧向接收单元发送信息 |
遥控帧 | 接收单元通过此帧向具有相同ID的发送单元请求数据 |
错误帧 | 当检测到错误时,向其他单元通知检测到错误 |
过载帧 | 接收单元用来通知它还没有准备好接收帧 |
间隔帧 | 用来将数据帧或遥控帧同前面的帧隔开 |
(2)数据帧的结构
数据帧以一个显性位(逻辑0)开始,以一个7个连续隐性位(逻辑1)结束。
在开始和结束之间分为:仲裁段、控制段、数据段、CRC段、ACK段。加开始和结束一共有7个段。
- RTR位:远程传输请求位,用显性电平和隐性电平来区分数据帧和遥控帧。
- IDE位:标志符扩展位,用显性电平和隐性电平来区分标准格式还是扩展格式。
- SRR位:只存在于扩展格式,用于替代标准格式中的RTR位,由于扩展帧中的SRR位为隐性位,RTR是数据帧为显性位,所以在两个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级更高。
帧起始:
标准帧和扩展帧都是通过一个显性电平表示帧起始,作用:通知各个节点将有数据传输,其他节点通过帧起始信号的电平跳变沿来进行硬同步。
仲裁段:
表示优先级的段,主要内容为数据帧的ID信息。数据帧有标准格式和扩展格式两种,具体区别是ID信息的长度,标准格式的ID为11位,扩展格式的ID为29位。
通过显性电平的优先权和隐性电平的包容性进行仲裁:若两个节点同时竞争CAN总线的占有权,当它们发送报文时,若首先出现隐性电平,则会失去去总线的占有权,进入接收状态。
CAN协议中,ID决定着数据帧的优先级,也决定着其他节点是否也会接收这个数据帧。重要的信息,打包一个优先级高的ID,使他能够及时发送出去,因此使得CAN的扩展性大大加强,在总线上增加和减少节点并不会影响其他设备。
控制段:
r1和r0为保留段,默认置为显性,它最主要的是由4位组成的DLC段,MSB先行(高位先行),DLC段表示的数字为0~8.
数据段:
数据帧的核心内容,它是节点要发送的原始信息,由0~8个字节组成,MSB先行。
CRC段:
15位的CRC检验码,在CRC检验后,有一个CRC界定符,为隐性,将CRC检验码与后面的ACK段分隔开。
ACK段:
包括一个ACK槽位和ACK界定符,在ACK槽位中,发送端发送的为隐性位,接收端在这一位中发送显性位以表示应答,在ACK界定槽和帧结束之间由ACK界定符分隔开。
帧结束段:
由发送节点发送7个隐性位表示结束。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具