STM32 CAN简介及帧格式

一、CAN简介

图1.CAN简介

高速CAN:用于短距离、高速

低速CAN: 用于长距离、低速

二、回顾之前的通信协议对比:

图2. 通信协议对比

UART:点对点的通信,只有两个设备

I2C:一个主机外挂多个被动的传感器、存储器等模块

SPI:也是一主多从,但是通信速率是最快的,主要应用于高速通信场景

CAN:可以实现多个主控互相通信

三、CAN硬件电路

  • 每个设备通过CAN收发器挂载在CAN总线网络上
  • CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CANH和CAN L分别与总线的CAN H和CANL相连
  • 高速CAN使用闭环网络,CANH和CANL两端添加120Q的终端电阻
  • 低速CAN使用开环网络,CAN H和CANL其中一端添加2.2kQ的终端电阻

图3.闭环高速CAN

图4.开环低速CAN

注:闭环控制CAN总线的两端120欧电阻作用:

1.防止回波反射(与传输线原理有关)

2.可以将两根差分线的电压"收紧",,也就是电压拉至同一电压,呈现1状态。当需要0状态的时候由软件来将电压拉开,呈现0状态。(如下)

CAN收发器-TJA1050

图5.TJA1050原理图

  • 发送部分:

首先最右边的CANH和CANL就是CAN总线,连接在总线上。

中间的RECEIVER可以时刻检测总线的电压差,然后输出到左边通过场效应管到RXD引脚(这个场效应管有电平反向的功能,右边为1,输出左边为0。右边为0,输出到左边为1)。

  • 接收部分:

如果TXD给1,则不会对总线进行任何操作,总线呈现默认的隐性电平1。

如果TXD悬空,则默认也是给1

如果TXD给0,则驱动器会把CANH拉高,CANL拉低,输出显性电平0。

如果TXD一直给0,出错了,则显性超时,收发器会主动释放CAN总线。

四、CAN电平标准

图6.CAN电平标准

这里注意:逻辑1隐性电平逻辑0显性电平

高速CAN规定的状态0或者是状态1,都是由电压差来呈现的。逻辑电平是由两个线的差分电平合成而来的

五、CAN总线帧格式

规定了一下五种帧格式:

图7.CAN帧类型

主要学习的是数据帧,最复杂,用到的最多

(一)数据帧

图8,数据帧的构成

  • 一个起始帧,是一个显性信号,用来标志起始信号
  • identifier(ID):报文ID ,标准格式是11位。用来表示后面数据的功能,相 当于加一个名字,同时还用来区分优先级,ID小的报文优先发送,ID大的等到下一次的空闲时间重新发送,不同功能的数据帧ID不同
  • RTR:占据1位必须为显性0,远程请求标志位,用于区分数据帧还是遥控帧。数据帧为0,遥控帧为1
  • IDE:ID扩展标志位,用于区分标准格式 还是**扩展格式,**标准格式固定为显性0(如上半部分),扩展格式固定为隐性1(如下班部分)
  • r0 : 保留位,必须为显性0,为了以后附加其它功能的
  • DLC :数据段的长度,例如发一个字节,DLC就给0001,八个字节,就给1000
  • Data : 数据段,最大64位,也就是8个字节(这里数据段必须要给8的倍数)
  • CRC段 : 高效检验算法,有15位,对前面所有的数据进行算法计算,从SOF到Data,计算得到一个校验码,然后接收方也是通过CRC进行CRC计算,得到校验码。然后对比发送方的校验码,判断传输是否有误
  • CRC界定符 : 1位,必须是隐性电平
  • ACK槽:应答的作用,发送方发出一帧数据,查看是否收到,发送方发送隐性1,如果接收方存在,则接收方就要发显性0,可以多个设备同时接收(也就是同时拉开)
  • EOF:7个隐性1,作为停止位。

扩展格式:

  • ID:同上
  • SRR:没有用,但是要给隐性电平1
  • IDE:扩展格式标志位,和标准格式相反
  • 之后就和标准格式相同

(二)遥控帧

适合使用频率低,但偶尔又需要集中用几次的数据

图9.遥控帧的构成

RTR进行数据帧和遥控帧的区分,数据帧为0,遥控帧为1。

请求方发出遥控帧,其中ID表示要请求的数据。响应请求的那边,通过相同ID的数据帧反馈数据。

注:当请求和反馈数据同时发生时,数据帧拥有更高的优先级

(三)错误帧

用途:某个设备检测出错误时,向其它设备通知错误

图10.错误帧的构成

(四)过载帧

图11.过载帧的构成

(五)帧间隔

连续发送数据帧时,中间会有一小段帧间隔

图12.帧间隔

六、位填充

  • 位填充规则:发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据
  • 例如:

即将发送: 10000011 0 10000011110 0111111111110

实际发送: 1000001110 1000001111100 011111011111010

实际接收: 1000001110 1000001111100 011111011111010

移除填充后: 100000110 10000011110 0111111111110

  • 位填充作用:
  1. 增加波形的定时信息,利于接收方执行"再同步",防止波形长时间无变化,导致接收方不能精确掌握数据采样时机

2.将正常数据流与"错误帧"和"过载帧"区分开,标志"错误帧"和"过载帧"的特异性(它们都需要6个相同电平

3.保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲(规定:出现连续11个隐性1之后,认为是总线空闲)

总结:某个设备想要发送自己的数据时,就操作总线,拉开或者释放,使总线产生一段这样的时序波形,发送方需要依照上面的帧格式的定义来发,接收方同样根据帧格式的定义,来接收解析

相关推荐
iCxhust44 分钟前
一款复古的Intel8088单板机制作
开发语言·单片机·嵌入式硬件
智者知已应修善业2 小时前
【51单片机2位数码管100毫秒的9.9秒表】2022-5-16
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
东芝-铠侠-技术王工5 小时前
TB62211FNG是一款采用时钟输入控制的PWM斩波器的两相双极步进电机驱动器
单片机·嵌入式硬件
懒惰的bit5 小时前
STM32F103C8T6 学习笔记摘要(三)
笔记·stm32·学习
happygrilclh5 小时前
Modbus仿真器 Modbus Poll 和Modbus Slave详细图文教程
stm32·单片机·嵌入式硬件
懒惰的bit5 小时前
STM32F103C8T6 学习笔记摘要(一)
笔记·stm32·学习
ILOVECOMPUTING6 小时前
无人机上,利用 ucos2 实现 stm32 采集陀螺仪数据
单片机·嵌入式硬件·无人机·数据采集·陀螺仪·ucos2
乌萨奇也要立志学C++6 小时前
【STM32】STM32的中断系统&寄存器NVIC、EXTI
stm32·单片机·嵌入式硬件
橡木树的叶子6 小时前
正点原子STM32cubeide学习——TFTLCD(MCU 屏)实验
ide·stm32·单片机·嵌入式硬件·学习