STM32-CAN通信协议

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的位时序。

再同步

    数据格式

    若干个最小时间量子Tq构成了1个位时序,若干个位时序组合又构成了消息帧。
    CAN协议规定了以下四种帧

    作用
    数据帧 发送单元向接收单元传送的数据
    遥控帧 接收单元向发送单元请求数据
    错误帧 检测出错误时向其他单元通知错误
    过载帧 接收单元通知发送单元尚未做好接收准备

    数据帧

    在CAN协议中有标准格式和扩展格式两种数据帧格式,扩展格式在标准格式前增加了一些位来扩展ID,其他区别不大。下图是标准格式时序图。

    错误帧

    错误帧由6位的错误标志和8位的错误界定符组成,错误标志分为主动错误标志和被动错误标志两种,当为主动错误标志时,这6个位均为显性位;反之,均为隐性位。错误界定符由8个隐性位组成。下图为错误帧示意图。

    • TEC
    • (TEC>127 &&TEC127 &&REC
    • TEC>255,为总线关闭状态

    过载帧

    由6位过载标志位和8位过载界定符组成,当过载标志位均为显性位时表示过载,过载界定符由8个隐性位构成。


    数据链路层

    数据链路层将物理层的信 组织为有一定格式的数据,完成控制数据传输,错误控制等流程,如消息的帧化、仲裁、错误检测、错误 告、应答等。
    因为数据链路层的很多东西都已经在前面介绍过了,所以就不再赘述,给出数据链路层的基本参照模型。

    发送信箱及接收FIFO

    发送邮箱

    由上面的bxCAN框架可知,bxCAN有3个发送邮箱,bxCAN在发送 文时,只需要设置邮箱格式(标识符,数据长度,待发送数据),然后将寄存器CAN_TIxR中的TXRQ位置1,来请求发送。之后该邮箱进入挂 状态,直到成为最高优先级的邮箱后,待总线空闲, 文则马上就会被发送,发送完毕后则该邮箱变为空邮箱。下图是发送邮箱状态图。

    • RFLM=1,最后收到的 文会被新的 文覆盖,新的 文被保留下来
    • RFLM=0,已经接收到的 文不变,新 文被丢弃。

    过滤器

    我们前面说过,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初始化结构体:

    • 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时序时钟分频因子

    波特率配置(1Mbps):

    • 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进行处理,非常感谢!

上一篇 2021年7月18日
下一篇 2021年7月18日

相关推荐