1、概念
CAN是一种异步通信,使用CAN_HIGH,CAN_LOW两根信号线实现差分通信,通信网络有两种:闭环总线网络、开环总线网络
1.1闭环总线网络
特点:
- 遵循 ISO11898 标准
- 高速、短距离
- 总线最大长度为 40m,通信速度最高为 1Mbps
- 两端各要求有一个“120 欧”的电阻。
1.2开环总线网络
特点:
- 遵循 ISO11519-2 标准
- 低速远距离
- 最大传输距离为 1km,最高通讯速率为 125kbps
- 每根总线上各串联有一个“2.2 千欧”的电阻
1.3 通讯节点
CAN通讯节点由一个CAN控制器和一个CAN收发器构成;
- 控制器与收发器之间:CAN_Tx 及 CAN_Rx 信号线(TTL逻辑)
- 收发器与 CAN 总线之间: CAN_High 及 CAN_Low信号线
1.4 差分信号电平
由于 CAN 总线协议的物理层只有 1 对差分线,在一个时刻只能表示一个信号,所以对通讯节点来说, CAN 通讯是半双工的,收发数据需要分时进行。在 CAN 的通讯网络中,因为共用总线,在整个网络中同一时刻只能有一个通讯节点发送信号,其余的节点在该时刻都只能接收。
2、协议层
2.1位时序分析
为了实现位同步, CAN 协议把每一个数据位的时序分解成四段:SS 段、PTS 段、 PBS1 段、 PBS2 段,这四段的长度加起来即为一个 CAN 数据位的长度。(即每一个数据位都会经历同步等操作)
- SS 段(SYNC SEG):SS 译为同步段, 若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的范围之内,则表示节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。 SS 段的大小固定为 1Tq。
- PTS 段(PROP SEG) : PTS 译为传播时间段,这个时间段是用于补偿网络的物理延时时间。 是总线上输入比较器延时和输出驱动器延时总和的两倍。 PTS 段的大小可以为 1~8Tq
- PBS1 段(PHASE SEG1): PBS1 译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。 PBS1 段的初始大小可以为 1~8Tq。
- PBS2 段(PHASE SEG2): PBS2 这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。 PBS2 段的初始大小可以为 2~8Tq
每一个数据位总长位19Tq,数据采样发生在5Tq和7Tq之间。
2.2通讯的波特率
总线上的各个通讯节点 只要约定好 1 个 Tq 的时间长度以及每一个数据位占据多少个Tq,就可以确定 CAN 通讯的波特率。例如,假设上图中的 1Tq=1us,而每个数据位由 19 个 Tq 组成,则传输一位数据需要时间 T1bit =19us,从而每秒可以传输的数据位个数为:
1x106/19 = 52631.6 (bps)
这个每秒可传输的数据位的个数即为通讯中的波特率。
2.3 同步过程
同步过程分为:硬同步和重新同步
- 硬同步在起始帧的时候起作用
- 重新同步在每一位的SS段进行检测,是否相位超前 或 相位滞后
2.4报文
几种通讯协议所需的信号线:
- SPI:CS,SDI,SDO,SCLK
- I2C:SCL,SDA
- UART:RXD,TXD,GND
- CAN:CAN_H,CAN_L
CAN 使用的是两条差分信号线,只能表达一个信号,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议, CAN协议给出的解决方案是对数据、操作命令(如读/写)以及同步信号进行打包,打包后的这些内容称为报文。
五种帧:
- 数据帧 用于节点向外传送数据
- 遥控帧 用于向远端节点请求数据
- 错误帧 用于向远端节点通知校验错误,请求重新发送上一个数据
- 过载帧 用于通知远端节点:本节点尚未做好接收准备
- 帧间隔 用于将数据帧及遥控帧与前面的帧分离开来
2.4.1数据帧
数据帧是在 CAN 通讯中最主要、最复杂的报文
图为数据帧结构:
数据帧可分为 帧起始(逻辑0),仲裁段 ,控制段 , 数据段 ,CRC段 ,ACK段 ,以及帧结束(7个连续隐性电平)
帧起始:
通知其他节点有数据要传输,其他节点根据帧起始信号进行硬同步
仲裁段:
仲裁段的内容包括ID信息,RTR,IDE,SRR位
1.ID信息:其主要内容为本数据帧的 ID 信息 。仲裁段长度决定了数据帧是标准数据帧(ID 为 11 位)还是扩展数据帧(ID 为 29 位)。报文的优先级也通过对ID的仲裁来决定(物理层决定了如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平)
2.RTR(Remote Transmission Request Bit)
用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧
3.IDE位(Identifier Extension Bit)
区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式
4.SRR 位 (Substitute Remote Request Bit)
只存在于扩展格式,它用于替代标准格式中的RTR 位。由于扩展帧中的 SRR 位为隐性位, RTR 在数据帧为显性位,所以在两个 ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高
控制段:
内容为:r1、r2位、DLC段
在控制段中的 r1 和 r0 为保留位,默认设置为显性位。它最主要的是 DLC 段(DataLength Code),译为数据长度码,它由 4 个数据位组成,用于表示本报文中的数据段含有多少个字节, DLC 段表示的数字为 0~8。例如DLC=4,数据段包含4个字节
数据段:
数据段为数据帧的核心内容,它是节点要发送的原始信息,由 0~8 个字节组成, MSB先行。
CRC 段:
ACK段:
ACK 段包括一个 ACK 槽位,和 ACK 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。帧结束:
其他帧,如遥控帧、错误帧等见下图
3、STM32外设CAN
特点:
- 自动地接收和发送 CAN 报文
- 支持使用标准 ID 和扩展 ID 的报文;
- 外设中具有 3 个发送邮箱,
- 发送报文的优先级可以使用软件控制,还可以记录发送的时间;
- 具有 2 个 3 级深度的接收 FIFO,可使用过滤功能只接收或不接收某些 ID 号的报文;
- 可配置成自动重发;
- 不支持使用 DMA 进行数据收发
3.1stm32的CAN测试模式:
3.2 CAN外设的位时序与波特率
STM32 外设定义的位时序与CAN 标准时序有一点区别 :
- CAN标准时序: SS | PTS | PBS1 | PBS2
- stm32CAN时序: STNC_SEG | BS1 | BS2
stm32的CAN时序的BS1可以看成标准CAN的PTS和PBS1之和
因此:
其中单个时间片的长度 Tq 与 CAN 外设的所挂载的时钟总线及分频器配置有关,CAN1 和 CAN2 外设都是挂载在 APB1 总线上的,而位时序寄存器 CAN_BTR 中的 BRP[9:0]
寄存器位可以设置 CAN 外设时钟的分频值 ,所以:
Tq = (BRP[9:0]+1) x TPCLK
其中的 PCLK 指 APB1 时钟,默认值为 45MHz。
最终可以计算出 CAN 通讯的波特率:
BaudRate = 1/N Tq
例: