STM32 高级 物联网通信之CAN通讯
目录
CAN通讯介绍
物理层
协议层
CAN的帧(报文)种类
1 数据帧(发送单元->接受单元)
2 远程帧(接受单元->发送单元)
3 错误帧(发送方发送数据错误会发送的状态帧)
4 过载帧(接收方放不下会发送到的状态帧)
5 帧间隔(状态)
数据帧介绍
远程帧介绍
CAN总线仲裁
CAN的位时序
STM32的CAN外设
CAN外设(CAN控制器)介绍
CAN控制器的3种工作模式
CAN控制器的3种测试模式
功能框图
主动内核
发送邮箱
接收FIFO
接收滤波器(过滤器)
STM32中 CAN的位时序
CAN通讯介绍
参考:CAN协议|Kvaser中文官网免费CAN协议教程
CAN(Controller Area Network 控制器局域网,简称CAN或者CAN bus)是一种功能丰富的车用总线标准。被设计用于在不需要主机(Host)的情况下,允许网络上的单片机和仪器相互通信。
它基于消息传递协议(给消息添加了类型),设计之初在车辆上复用通信线缆,以降低铜线使用量,后来也被其他行业所使用。
CAN拥有了良好的弹性调整能力,可以在现有网络中增加节点而不用在软、硬件上做出调整。除此之外,消息的传递不基于特殊种类的节点,增加了升级网络的便利性。
物理层
CAN网络节点
一个CAN控制器:
一般由MCU提供,STM32内部提供了一个CAN控制器
一个CAN收发器:
收发器一般需要专门芯片提供。这里采用PD1050收发器芯片
控制器和收发器之间通过CAN_Tx及CAN_Rx信号线相连。
收发器与CAN总线之间使用CAN_High及CAN_Low信号线相连。
这两根线做一个差值来表示收发和发
流程:
发数据:。。。
收数据:。。。
CAN总线网络
闭环总线网络:遵循ISO 11898标准的高速短距离,最高传输距离40m,通讯速度最高为1Mbps,总线两端要求有一个120Ω的电阻。
开环总线网络:遵循ISO11519-2标准的低速、远距离。最高传输距离1Km,通讯速度最高为125Kbps,两根总线串联两个2.2KΩ的电阻。
差分信号:
两根信号线:振幅相同,相位相反,然后进行相减,
再电路板要求:差分走线必须是等长、等宽、紧密靠近、且在同一层面的两根线。
优点:抗干扰能力强。能有效抑制电磁干扰(EMI)
缺点:差分信号一定要走两根等长、等宽、紧密靠近、且在同一层面的线。对电路板比较小,走线比较紧张的情况下,给布线带来挑战。差分信号线具有这些优点,在 USB 协议、485 协议、以太网协议及 CAN 协议的物理层中,都使用了差分信号传输。
举例
逻辑1(隐性电平)
CAN_High =CAN_Low = 2.5V
电压差 VH-VL=0V
逻辑 0 (显性电平)
CAN_High=3.5V,CAN_Low =1.5V
电压差为 VH-VL=2V
协议层
CAN的帧(报文)种类
CAN总线是广播类型的总线。这意味着所有节点都可以侦听到所有传输的报文。无法将报文单独发送给指定节点;所有节点都将始终捕获所有报文。但是CAN硬件能够提供本地过滤功能,让每个节点对报文有选择性地做出响应。
CAN使用短报文,最大实用负载是94位。报文中没有任何明确的地址;相反,可以认为报文是通过内容寻址,也就是说,报文的内容隐式地确定其地址。
CAN总线上有5种不同的报文类型(或“帧”):数据帧、远程帧、错误帧、过载帧和帧间隔。
1 数据帧(发送单元->接受单元)
数据帧是最常见的报文类型,用于发送单元向接收单元发送数据。
2 远程帧(接受单元->发送单元)
远程帧用于接收单元向具有相同id的发送单元请求发送数据。
3 错误帧(发送方发送数据错误会发送的状态帧)
错误帧当检测出错误时向其他单元通知错误的帧。
4 过载帧(接收方放不下会发送到的状态帧)
过载帧并不常用,因为当今的CAN控制器会非常智能化地避免使用过载帧。
5 帧间隔(状态)
用于将数据帧及遥控帧与前面的帧分离开来的帧
其中错误帧、过载帧、帧间隔都是由硬件自动完成的,没有办法用软件来控制。对于一般使用者来说,只需要掌握数据帧与遥控帧。数据帧和遥控帧有标准格式与扩展格式。标准格式有11位标识符,扩展格式有29位标识符。
数据帧介绍
标准帧(11位消息准类)
帧起始:Start Of Frame-SOF:
1位,显性信号(逻辑0)。
表示数据帧(或远程帧)的开始。
只能在总线空闲的时候(检测到7位1表示空闲)才可以发送帧起始。
仲裁段(Arbitration Field)包括两部分:
标识符位(Identifier field-ID):11位
远程发送请求位(Remote Transfer Request-RTR):1位,用于区分该帧是数据帧还是远程帧:显性信号(0)代表数据帧(Data Frame),隐性信号(1)代表远程帧(Remote Frame)
控制段(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,用于校验传输是否正确。
界定符:隐性位,表示校验码的结束。
ACK段(ACK Field):包含2部分
ACK确认位:发送端的ACK确认位是隐性位,接收端收到正确的CRC校验位后,把这一位置为显性位(相当于一个插槽)
界定符:1位隐性位,用于与后面的帧结束隔开。
EOF段( End Of Frame )
帧结束,帧结束段由发送节点发送的 7 个隐性位表示结束
扩展帧(29位2的29次方=512M信息准类)
远程帧介绍
远程帧与数据帧相比没有数据段。
CAN总线仲裁
CAN总线处于空闲状态的时候,最先发送消息的单元获得发送权。
多个单元同时开始发送时,从仲裁段(报文id)的第一位开始进行仲裁。连续输出显性电平最多的单元可以继续发送,即首先出现隐性电平的单元失去对总线的占有权变为接收。(即报文id小的优先级高)。
竞争失败,会自动检测总线空闲,在第一时间再次尝试发送。
CAN的位时序
位同步:CAN中提出了位同步的方式来确保通讯时序。
一帧中包含了很多个位。
CAN把每1位分为4段(从时间角度划分)
同步段(SS:Synchronization Segment)
传播时间段(PTS:Propagation Time Segment)
相位缓冲段 1(PBS1:Phase Buffer Segment 1)
相位缓冲段 2(PBS2:Phase Buffer Segment 2)
4段的总时间段构成了位时间(Bit Time),就是传输一个位所需的总时间。
位时间通常被分为若干等长的时间单元,称为时间量化器(Time Quanta, Tq)。
一个Tq的长度可以根据传输速率的需要设置。
在STM32的CAN外设中,通过设置波特率分频器的值来确定Tq的大小。
同步段(SS:Synchronization Segment):做同步的,
SS 段的大小固定为 1Tq。
若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的范围之内,则表示节点与总线的时序是同步的
传播时间段(PTS:Propagation Time Segment):解决如果没有同步,照样捕捉,会提示后面进行处理。
传播时间段(PTS:Propagation Time Segment)
比如发送单元的发送延迟、总线上信号的传播延迟、接收单元的输入延迟等。
PTS段就是用来补偿这些因素产生的时间延迟。
PTS段长度至少为1个Tq。一般1-8Tq。
相位缓冲段 1(PBS1:Phase Buffer Segment 1),也就是延长取样。
主要用来补偿边沿阶段的误差。
它的时间长度在重新同步阶段的时候可以被自动加长。
PBS1段的初始大小可以为1~8Tq。
相位缓冲段 2(PBS2:Phase Buffer Segment 2),下一位的同步段会提前。
另一个相位缓冲段,也是用来补偿边沿阶段误差的
它的时间长度在重新同步阶段时可以缩短
PBS2 段的初始大小可以为 2~8Tq。
采样点:采样点位于PBS1和PBS2的交界处。
数据同步:根据同步方式差异,CAN 的数据同步分为硬同步和再同步。
硬同步:当一个节点检测到起始位时,它会执行硬同步,以便将其内部的时间基准与数据帧的时间基准对齐。在硬同步过程中,控制器的时间基准会立即调整为与检测到的边沿对齐。
再同步:在检测到总线上的时序与节点使用的时序有相位差时(即总线上的跳变沿不在节点时序的 SS 段范围)通过延长 PBS1 段或缩短 PBS2 段,来获得同步。
所有的同步都是由CAN控制器硬件自动完成的。
CAN的波特率:各个通讯节点约定好1个Tq 的时间长度以及每一位占据多少个 Tq,就可以确定CAN通讯的波特率。
位填充:发送方再发送过程时,若持续0或1时,发送方会在固定位填充一个跳变沿。
STM32的CAN外设
CAN外设(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进行数据收发。
CAN控制器的3种工作模式
CAN控制器有3种工作模式:初始化模式、正常模式、睡眠模式。
上电复位后CAN控制器默认会进入睡眠模式,作用是降低功耗。当需要将进行初始的时候(配置寄存器),会进入初始化模式。当需要通讯的时候,就进入正常模式。
CAN控制器的3种测试模式
CAN控制器有3种测试模式静默模式、环回模式、环回静默模式。当控制器进入初始化模式的时候才可以配置测试模式。
静默模式(只收不发)可以用于检测总线的数据流量。
环回模式(对外只发不收,且自发自收)可以用于自检(影响总线)。
环回静默模式(对外不发不收,且自发自收)也是用于自检,不会影响到总线。
功能框图
主动内核
含各种控制/状态/配置寄存器,可以配置模式、波特率等。在STM32CubeMx中可以非常方便的配置。
发送邮箱
用来缓存待发送的报文,最多可以缓存3个报文。发送调度决定报文的发送顺序。
接收FIFO
共有2个接收FIFO,每个FIFO都可以存放3个完整的报文。它们完全由硬件来管理。从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。
接收滤波器(过滤器)
作用:对接到的报文进行过滤,最后放入FIFO 0或FIFO 1。
当总线上报文数据量很大时,总线上的设备会频繁获取报文,占用CPU。过滤器的存在,选择性接收有效报文,减轻系统负担。
有2种过滤模式:
(1)标识符列表模式,它把要接收报文的ID列成一个表,要求报文ID与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理。
(2)掩码模式(屏蔽位模式),它把可接收报文ID的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收FIFO。
如果使能了过滤器,且报文的ID与所有过滤器的配置都不匹配,CAN外设会丢弃该报文,不存入接收FIFO。
每个CAN提供了14个位宽可变的、可配置的过滤器组(13~0)。每个过滤器组x由2个32位寄存器,CAN_FxR1和 CAN_FxR2组成。
STM32中 CAN的位时序
stm32中的位时序,将传播时间段和相位缓冲段1做了合并。
作者:雁过留声花欲落