CAN

CAN
KayerCAN通讯
1. CAN通讯介绍
CAN(Controller Area Network 控制器局域网,简称CAN或者CAN bus)是一种功能丰富的车用总线标准。被设计用于在不需要主机(Host)的情况下,允许网络上的单片机和仪器相互通信。
它基于消息传递协议,设计之初在车辆上复用通信线缆,以降低铜线使用量,后来也被其他行业所使用。
CAN拥有了良好的弹性调整能力,可以在现有网络中增加节点而不用在软、硬件上做出调整。除此之外,消息的传递不基于特殊种类的节点,增加了升级网络的便利性。
2. 物理层
CAN网络节点:
一个CAN控制器
- 一般MCU提供。STM32内部提供了1个CAN控制器。
一个CAN收发器
- 收发器一般需要专门芯片提供。
控制器与收发器之间通过 CAN_Tx及CAN_Rx信号线相连。
收发器与CAN总线之间使用CAN_High及CAN_Low 信号线相连。
CAN网络节点发数据:
当CAN节点需要发送数据时,控制器把要发送的二进制编码通过CAN_Tx线发送到收发器。
收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High和 CAN_Low线输出到CAN总线网络
CAN网络节点收数据:
- 通过收发器接收总线上的数据到控制器时,则是相反的过程。
- 收发器把总线上收到的 CAN_High及CAN_Low信号转化成普通的逻辑电平信号。
- 通过CAN_Rx输出到控制器中。
根据接法不同,总线网络分2种:
- 闭环总线网络
- 开环总线网络
2.1 闭环总线网络
遵循 ISO11898标准的高速、短距离闭环网络:
- 最大传输距离40m。
- 通信速度最高为1Mbps。
- 总线的两端各要求有一个120欧的电阻。
2.2 开环总线网络
遵循 ISO11519-2标准的低速、远距离开环网络:
- 最大传输距离1Km。
- 通信速度最高为125Kbps。
- 两根总线是独立的、不形成闭环,要求每根总线上各串联有一个2.2 千欧的电阻。
2.3 差分信号
- CAN_High和CAN_Low 走的是一对差分信号。
- 传统的单端信号传输:一根信号线一根地线。
- 差分传输是一种信号传输的技术,差分传输在这两根线上都传输信号,这两个信号的振幅相同,相位相反。
- 信号接收端比较这两个电压的差值来判断发送端发送的逻辑状态。
- 在电路板上,差分走线必须是等长、等宽、紧密靠近、且在同一层面的两根线。
差分信号优缺点:
优点:
抗干扰能力强。
干扰噪声一般会等值、同时的被加载到两根信号线上,而其差值为0,即,噪声对信号的逻辑意义不产生影响。
能有效抑制电磁干扰(EMI)。
由于两根线靠得很近且信号幅值相等,这两根线与地线之间的耦合电磁场的幅值也相等,同时他们的信号极性相反,其电磁场将相互抵消。因此对外界的电磁干扰也小。
缺点:
- 差分信号一定要走两根等长、等宽、紧密靠近、且在同一层面的线。对电路板比较小,走线比较紧张的情况下,给布线带来挑战。
CAN中的差分信号:
以高速CAN协议为例
逻辑1(隐性电平):
- CAN_High =CAN_Low = 2.5V
- 电压差 VH-VL=0V
逻辑 0 (显性电平):
- CAN_High=3.5V,CAN_Low =1.5V
- 电压差为 VH-VL=2V
3. 协议层
CAN总线是广播类型的总线。这意味着所有节点都可以侦听到所有传输的报文。无法将报文单独发送给指定节点;所有节点都将始终捕获所有报文。但是CAN硬件能够提供本地过滤功能,让每个节点对报文有选择性地做出响应。
CAN使用短报文,最大实用负载是94位。报文中没有任何明确的地址;
可以认为报文是通过内容寻址,报文的内容隐式地确定其地址。
CAN总线上有5种不同的报文类型(或“帧”):数据帧、远程帧、错误帧、过载帧和帧间隔。
3.1 数据帧
数据帧是最常见的报文类型,用于发送单元向接收单元发送数据。
有2种数据帧:
- 标准帧
- 扩展帧
扩展帧与标准帧的不同在于仲裁段和控制段,其他完全一样。
标准帧:
帧起始(Start Of Frame-SOF):
- 1bit,显性信号(逻辑0)。
- 表示数据帧(或远程帧)的开始。
- 只能在总线空闲的时候才可以发送帧起始。
仲裁段(Arbitration Field)包括两部分:
- 标识符位(Identifier field-ID):
- 长度为11位(11 bits),ID10
ID0。按照ID10ID0的顺序进行传输。 - 是一个功能性的地址(Functional address), CAN接收器通过标识符来过滤数据帧。
- 不同节点的标识符位是不能相同的。
- 长度为11位(11 bits),ID10
- 远程发送请求位(Remote Transfer Request-RTR):
- 用于区分该帧是数据帧还是远程帧。
- 显性信号(0)代表数据帧(Data Frame)。
- 隐性信号(1)代表远程帧(Remote Frame)。
- 标识符位(Identifier field-ID):
控制段(Control Field)一共6位:
IDE位(Identifier Extension):
- 1位。区分标准格式与扩展格式。
- 显性电平时表示标准格式。
- 隐性电平时表示扩展格式。
DLC段(Data Length Code):
4位。表示本报文中的数据段含有多少个字节。
用于DLC段表示的数字为0~8。
R0位:
- 1位。保留位,以后使用。
数据段(DATA Field):
- 数据帧的核心内容,它是节点要发送的原始信息。
- 由 0~8个字节组成。
- 高位先行。
CRC段(CRC Field)包含2部分:
- CRC校验码:
- 15 bits,用于校验传输是否正确。
- 界定符:
- 隐性位,表示校验码的结束。
- CRC校验码:
ACK段(ACK Field):
- ACK确认位:
- 发送端的ACK确认位是隐性位。
- 接收端收到正确的CRC校验位后,把这一位置为显性位。
- 界定符:
- 1位隐性位,用于与后面的帧结束隔开。
- ACK确认位:
EOF段( End Of Frame ):
- 帧结束,帧结束段由发送节点发送的 7 个隐性位表示结束。
扩展帧:
- SRR(Substitute Remote Request Bit)替代远程请求位(RTR),隐性信号。
- IDE表示扩展帧还是标准帧。
- 18位扩展ID。
- RTR表示数据帧还是远程帧。
- R1R0保留位。
3.2 远程帧(遥控帧)
远程帧用于接收单元向具有相同id的发送单元请求发送数据。
远程帧与数据帧相比没有数据段。
3.3 错误帧
错误帧当检测出错误时向其他单元通知错误的帧。
3.4 过载帧
过载帧并不常用,因为当今的CAN控制器会非常智能化地避免使用过载帧。
3.5 帧间隔
用于将数据帧及遥控帧与前面的帧分离开来的帧
其中错误帧、过载帧、帧间隔都是由硬件自动完成的,没有办法用软件来控制。对于一般使用者来说,只需要掌握数据帧与遥控帧。数据帧和遥控帧有标准格式与扩展格式。标准格式有11位标识符,扩展格式有29位标识符。
3.6 CAN总线仲裁
CAN总线处于空闲状态的时候,最先发送消息的单元获得发送权。
多个单元同时开始发送时,从仲裁段(报文id)的第一位开始进行仲裁。连续输出显性电平最多的单元可以继续发送,即首先出现隐性电平的单元失去对总线的占有权变为接收。(即报文id小的优先级高)。
竞争失败,会自动检测总线空闲,在第一时间再次尝试发送。
3.7 位时序
CAN中提出了位同步的方式来确保通讯时序。
一帧中包含了很多个位。
CAN把每1位分为4段(从时间角度划分):
- 同步段(SS:Synchronization Segment)。
- SS 段的大小固定为 1Tq。
- 若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的范围之内,则表示节点与总线的时序是同步的。
- 传播时间段(PTS:Propagation Time Segment)。
- CAN总线上数据的传输会受到各种物理延迟。
- 比如发送单元的发送延迟、总线上信号的传播延迟、接收单元的输入延迟等。
- PTS段就是用来补偿这些因素产生的时间延迟。
- PTS段长度至少为1个Tq。一般1-8Tq。
- 相位缓冲段 1(PBS1:Phase Buffer Segment 1)。
- 主要用来补偿边沿阶段的误差。
- 它的时间长度在重新同步阶段的时候可以被自动加长。
- PBS1段的初始大小可以为1~8Tq。
- 相位缓冲段 2(PBS2:Phase Buffer Segment 2)。
- 另一个相位缓冲段,也是用来补偿边沿阶段误差的。
- 它的时间长度在重新同步阶段时可以缩短。
- PBS2 段的初始大小可以为 2~8Tq。
4段的总时间段构成了位时间(Bit Time),就是传输一个位所需的总时间。
位时间通常被分为若干等长的时间单元,称为时间量化器(Time Quanta, Tq)。
一个Tq的长度可以根据传输速率的需要设置。
在STM32的CAN外设中,通过设置波特率分频器的值来确定Tq的大小。
采样点:
- 位于PBS1和PBS2的交界处。
3.8 数据同步
根据同步方式差异,CAN 的数据同步分为硬同步和再同步。
硬同步:
- 当一个节点检测到起始位时,它会执行硬同步,以便将其内部的时间基准与数据帧的时间基准对齐。
- 在硬同步过程中,控制器的时间基准会立即调整为与检测到的边沿对齐。
再同步:
- 在检测到总线上的时序与节点使用的时序有相位差时(即总线上的跳变沿不在节点时序的 SS 段范围)。
- 通过延长 PBS1 段或缩短 PBS2 段,来获得同步。
所有的同步都是由CAN控制器硬件自动完成的。
3.8 CAN的波特率
各个通讯节点约定好1个Tq 的时间长度以及每一位占据多少个 Tq,就可以确定CAN通讯的波特率。
假设图中的1Tq=1us,而每个数据位由20个Tq 组成,则传输一位数据需要时间为20us,从而每秒可以传输的数据位个数为:
10^6 / 20 = 50,000
这个每秒可传输的数据位的个数即为CAN通讯的波特率。比如上面的波特率就是50kbps。
4. STM32的CAN外设
STM32的芯片中具有bxCAN控制器(Basic Extended CAN),它支持CAN协议2.0A 和2.0B Active标准。
CAN2.0A只能处理标准数据帧且扩展帧的内容会识别错误。而CAN2.0 B Active可以处理标准数据帧和扩展数据帧。CAN2.0 B Passive只能处理标准数据帧而扩展帧的内容会被忽略。
- 该CAN控制器支持最高的通讯速率为1Mb/s。
- 可以自动地接收和发送CAN报文,支持使用标准ID和扩展ID的报文。
- 外设中具有3个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间。
- 具有2个3级深度的接收FIFO,可使用过滤功能只接收或不接收某些ID号的报文。
- 可配置成自动重发。
- 不支持使用DMA进行数据收发。
4.1 三种工作模式
CAN控制器有3种工作模式:初始化模式、正常模式、睡眠模式。
上电复位后CAN控制器默认会进入睡眠模式,作用是降低功耗。当需要将进行初始的时候(配置寄存器),会进入初始化模式。当需要通讯的时候,就进入正常模式。
4.2 三种测试模式
CAN控制器有3种测试模式:静默模式、环回模式、环回静默模式。
当控制器进入初始化模式的时候才可以配置测试模式。
- 静默模式:
只收不发。
可以用于检测总线的数据流量。
- 环回模式:
只发不收。
可以用于自检(影响总线)。
- 环回静默模式:
自发自收。
也是用于自检,不会影响到总线。
4.3 功能框图
- 主动内核:
含各种控制/状态/配置寄存器,可以配置模式、波特率等。在STM32CubeMx中可以非常方便的配置。
- 发送邮箱:
用来缓存待发送的报文,最多可以缓存3个报文。发送调度决定报文的发送顺序。
- 接收FIFO:
共有2个接收FIFO,每个FIFO都可以存放3个完整的报文。它们完全由硬件来管理。从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。
- 接收滤波器(过滤器):
作用:对接到的报文进行过滤,最后放入FIFO 0或FIFO 1。
当总线上报文数据量很大时,总线上的设备会频繁获取报文,占用CPU。过滤器的存在,选择性接收有效报文,减轻系统负担。
有2种过滤模式:
标识符列表模式,它把要接收报文的ID列成一个表,要求报文ID与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理。
掩码模式(屏蔽位模式),它把可接收报文ID的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收FIFO。
如果使能了过滤器,且报文的ID与所有过滤器的配置都不匹配,CAN外设会丢弃该报文,不存入接收FIFO。
每个CAN提供了14个位宽可变的、可配置的过滤器组(13~0)。每个过滤器组x由2个32位寄存器,CAN_FxR1和 CAN_FxR2组成。
说明:
当工作于32位屏蔽位模式时,FR1保存标识符,FR2保存屏蔽。FR2某位是1表示来的ID的这位必须和FR1中对应的位一致,FR2某位是0,表示ID的这位不关心。
当工作于32位标识符模式时。FR1和FR2分别保存两个标识符。这意味着将来只有两个ID会匹配成功。
筛选优先级规则:
根据筛选组合的不同,可能存在一个标识符成功通过了几个筛选器的情况。在这种情况下,接收邮箱中存储的筛选器匹配值会根据以下优先级规则来选择:
32位筛选器比16位筛选器优先。
对于相同尺度的筛选器,标识符列表模式比标识符掩码模式优先。
对于相同尺度和模式的筛选器,优先级由筛选器编号决定(编号越小,优先级越高)。
4.4 位时序
STM32的位时序:把标准位时序的传播时间段和相位缓冲段1做了合并。
4.5 标志与中断
四个中断向量是专门用于bxCAN的。每个中断来源都可以通过CAN中断使能寄存器(CAN_IER)独立地开启或关闭。
传输中断可由以下事件生成:
- 发送邮箱 0 变为空,CAN_TSR寄存器集中的 RQCP0 位。
- 发送邮箱 1 变为空,CAN_TSR寄存器集中的 RQCP1 位。
- 发送邮箱 2 变为空,CAN_TSR寄存器集中的 RQCP2 位。
FIFO 0 中断可由以下事件生成:
接收新消息时,CAN_RF0R寄存器中的 FMP0 位不是 00。
FIFO0 完全条件,CAN_RF0R寄存器集中的 FULL0 位。
FIFO0 溢出条件,CAN_RF0R寄存器集中的 FOVR0 位。
FIFO 1 中断可由以下事件生成:
- 接收新消息时,CAN_RF1R寄存器中的 FMP1 位不是 00。
- FIFO1 完整条件,CAN_RF1R寄存器集中的 FULL1 位。
- FIFO1 溢出条件,CAN_RF1R寄存器集中的 FOVR1 位。
错误和状态更改中断可由以下事件生成:
- 错误条件,有关错误条件的更多详细信息,请参阅 CAN 错误状态寄存器(CAN_ESR)。
- 唤醒条件,在 CAN Rx 信号上监控 SOF。
- 进入睡眠模式。