STM32——CAN通讯协议
CAN协议简述
- CAN—Controller Area Network(控制器局域 ),由Bosch开发的一种面向汽车的通信协议,这是目前应用最广泛的通信协议,更是尤其是在汽车电子行业。CAN的开发不仅极大增强了汽车电子系统的安全性和稳定性,也减少了汽车电子系统内线束数量
- 下面我们仅重点叙述CAN在物理层和数据链路层的规定。
物理层
-
CAN协议经过ISO标准化后有ISO11898和ISO11519-2两种标准。其区别仅于物理层不同,ISO11898是CAN闭环高速通信标准,而ISO11519-2是开环低速通信标准,下面仅重点叙述IS011898物理层特性。
-
为了增强总线抗干扰能力和安全性,我们来看下CAN总线在物理层上做的工作。
-
在物理层上,CAN总线定义了CAN_High和CAN_Low两条差分信 线,CAN总线的逻辑电平为两条线的电位差(CAN_High – CAN_Low)。那么这样定义会带来什么好处呢工业现场中,很多干扰都是共模干扰,如电磁干扰、机械振动等。当外界环境的共模干扰施加到CAN总线上时,CAN采用差分信 线,使得共模干扰得以抵消,不会影响CAN总线逻辑。这就从物理层上提高了总线的稳定性和安全性。
下图为ISO11898标准CAN协议拓扑图
-
从上表可以看出,电位差为0V时,表现为隐形电平1;电位差为2V时,为显性电平1。
-
由于ISO11519-2通信标准与ISO11898通信标准类似,就不再赘述,下面提供一个表格表示两种通信标准物理层差异:
物理层 | ISO11898 | ISO11519-2 |
---|---|---|
通信速度 | 125Kbps-1Mbps | 125Kbps |
总线长度 | 40m以下 | 1KM以下 |
连接单元数 | 不超30 | 不超20 |
阻抗 | 120Ω | 120Ω |
总线形式 | 闭环 | 开环 |
终端电阻 | 120Ω | 2.2kΩ |
位时序
同样为了提高数据传输的稳定性和安全性,CAN协议在位时序上也做了相应工作,CAN协议规定每一位由下面四段组成:
- 同步段(SS:Synchronization Segment),多个连接在总线上的单元通过此段实现时序调整,达到同步收发的目的。起始信 边沿变化正常情况下会出现在此段中。
- 传播时间段(PTS:Propagation Time Segment),用于平衡 络上的物理延迟,即发送单元输出延迟、总线信 传输延迟。该段时间为延时时间和的二倍。
- 相位缓冲段1(PBS1:Phase Buffer Segment 1),当信 边沿即电平变化的那个时刻不是出现在同步段中时,总线上各单元信 因为细微累计误差导致不同步,可以在该段进行补偿,具体如何补偿将在后面叙述。在PSB1段结束时刻即为采样时刻,采样时刻电平即为该位的电平。
- 相位缓冲段2(PBS2:Phase Buffer Segment 2),与PBS1段一起补偿信 误差。
- 再同步补偿宽度(SJW: Resynchronization Jump Width),该段不是位时序组成段,它是信 同步补偿限度,即当进行同步补偿时,每次补偿不能超过这个限度。
上面的SS、PTS、PSB1、PBS2、四段共同组成一个位,而这四段又由若干个最小时间单位Time Quantum(Tq)组成,CAN协议正是通过设置Tq大小,和每段Tq数量来设置通信速率和采样点。下表给出了每段Tq的数量范围:
段名称 | Tq数 |
---|---|
SS | 1 |
PTS | 1~8 |
PBS1 | 1~8 |
PBS2 | 2~8 |
SJW | 1~4 |
总段 | 8~25 |
由于波特率是每秒传输的位数,所以:波特率=1/(8~25)Tq。下图是10Tq的位时序。
再同步
- TEC
- (TEC>127 &&TEC127 &&REC
- TEC>255,为总线关闭状态
- RFLM=1,最后收到的 文会被新的 文覆盖,新的 文被保留下来
- RFLM=0,已经接收到的 文不变,新 文被丢弃。
- CAN_Mode 用于配置CAN模式,可选参数如下:
- CAN_Mode_Normal ,正常模式,回环自测结束后可使用该模式即可与其他设备通信
- CAN_Mode_LoopBack,回环模式,用于自测
- CAN_Mode_Silent,静默模式,用于分析CAN总线活动
- CAN_Mode_Silent_LoopBack,回环静默,可用于自测
- CAN_TTCM 用于设置是否使用时间触发功能,ENABLE 或 DISABLE
- CAN_ABOM 用于设置是否启用自动离线管理功能,单元出错后适时自动恢复,一般使能
- CAN_AWUM 用于设置是否启动自动唤醒功能,一般使能
- CAN_NART 用于设置是否自动重传,即 文发送失败后一直发送。
- CAN_RFLM 用于设置是否锁定接收FIFO,锁定FIFO后,若FIFO填满则丢弃新 文。不锁定FIFO,则丢弃最后接收的 文。
- CAN_TXFP 用于设置 文优先级判断方法,使能则按照 文存放邮箱的先后顺序发送 文,否则按照ID优先级发送 文,一般不使能。
- CAN_BS1 用以设置bxCAN位时序中的BS1段,可选参数有CAN_BS1_1tq~CAN_BS1_16tq
- CAN_BS2 用以设置bxCAN位时序中的BS2段,可选参数有CAN_BS2_1tq~CAN_BS2_8tq
- CAN_SJW 用以设置同步补偿限度,可选参数有CAN_SJW_1tq~CAN_SJW_4tq
- CAN_Prescaler 用以设置CAN时序时钟分频因子
- BS1段设置为4tq ,
- BS2段设置为3tq,
- 位时间=1tq+tBS1+tBS2=9tq;
- 设置分频因子CAN_Prescaler =4;
- CAN时钟频率=36M/4=9M, tq=1/(9M),9tq=1/M
- 波特率 = 1/(9tq) = 1Mbps
- CAN_FilterActivation 使能过滤器,可配置为ENABLE或DISABLE
- CAN_FilterMode 用于配置过滤器工作模式,有以下参数
- CAN_FilterMode_IdMask 过滤器工作在掩码模式
- CAN_FilterMode_IdList 过滤器工作在标识符列表模式
- CAN_FilterScale 用于配置过滤器位宽,可选以下参数
- CAN_FilterScale_16bit,
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!
- CAN_FilterScale_16bit,
数据格式
若干个最小时间量子Tq构成了1个位时序,若干个位时序组合又构成了消息帧。
CAN协议规定了以下四种帧
帧 | 作用 |
---|---|
数据帧 | 发送单元向接收单元传送的数据 |
遥控帧 | 接收单元向发送单元请求数据 |
错误帧 | 检测出错误时向其他单元通知错误 |
过载帧 | 接收单元通知发送单元尚未做好接收准备 |
数据帧
在CAN协议中有标准格式和扩展格式两种数据帧格式,扩展格式在标准格式前增加了一些位来扩展ID,其他区别不大。下图是标准格式时序图。
错误帧
错误帧由6位的错误标志和8位的错误界定符组成,错误标志分为主动错误标志和被动错误标志两种,当为主动错误标志时,这6个位均为显性位;反之,均为隐性位。错误界定符由8个隐性位组成。下图为错误帧示意图。
过载帧
由6位过载标志位和8位过载界定符组成,当过载标志位均为显性位时表示过载,过载界定符由8个隐性位构成。
数据链路层
数据链路层将物理层的信 组织为有一定格式的数据,完成控制数据传输,错误控制等流程,如消息的帧化、仲裁、错误检测、错误 告、应答等。
因为数据链路层的很多东西都已经在前面介绍过了,所以就不再赘述,给出数据链路层的基本参照模型。
发送信箱及接收FIFO
发送邮箱
由上面的bxCAN框架可知,bxCAN有3个发送邮箱,bxCAN在发送 文时,只需要设置邮箱格式(标识符,数据长度,待发送数据),然后将寄存器CAN_TIxR中的TXRQ位置1,来请求发送。之后该邮箱进入挂 状态,直到成为最高优先级的邮箱后,待总线空闲, 文则马上就会被发送,发送完毕后则该邮箱变为空邮箱。下图是发送邮箱状态图。
过滤器
我们前面说过,CAN协议里没有地址区分,也没有主从设备区别,各单元以并联形式连接到总线上,没有高低之分的,信息通过广播的形式发送给总线上的所有接收设备。那么,接收设备如何判断该 文是有效信息还是无效信息呢其实,在CAN中,ID既表示了优先级,同样也表示信息身份。在软件上,我们可以通过判断ID来决定是否接收该消息,但这样就会占用CPU,bxCAN设计目的就是用最小的CPU负荷来处理大量数据,所以STM32为我们提供了标识符过滤器。在stm32f103系列中共有14个可配置的过滤器组,每个过滤器由2个32位寄存器组成,分别是CAN_FxR1和CAN_FxR2,而这两个32位的寄存器又可以配置其位宽为16位还是32位,因此每个过滤器可以提供1个32位过滤器或2个16位过滤器。除此之外,每组过滤器工作模式可以配置为掩码模式或标识符列表模式。
所谓“掩码模式”,其实就相当于关键字检索,把带有符合条件的关键字的 文存入FIFO中,其余的过滤掉。“标识符列表模式”就相当于建立了一个数据库,如果该 文在建立的数据库中能全字匹配找到,则接收 文存入FIFO中,否则舍弃。
具体过滤器位宽配置和过滤器组工作模式关系看下图
回环模式
回环模式框图
bxCAN时序
bxCAN的位时序与CAN协议规定的位时序稍有不同,下图为bxCAN位时序。
STM32-CAN代码编写要点
实验平台:野火stm32f103霸道开发板(同系列最小系统板也可以,因为是自测模式)
实验目的:利用回环测试模式实现CAN收发,使用CAN中断进行数据的读取
GPIO配置(GPIO不配置同样可以做CAN测试实验)
GPIO部分配置较简单,CAN引脚配置根据官方手册,CAN_Tx引脚配置为复用推挽输出,CAN_Rx引脚配置为浮空输入。这里对引脚进行了重映射,将其映射到PB8和PB9上。注意开启相应时钟。代码如下
CAN模式配置
CAN初始化结构体:
波特率配置(1Mbps):
经过上述分析,该部分代码如下: