STM32-(38):CAN总线(基本扩展bxCAN)

1、功能描述

bxCAN是基本扩展 CAN(Basic Extend CAN)的缩写,它支持CAN协议 2.0A和2.0B。它的设计目标是以最小的CPU负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。
CAN2.0B内核
bxCAN 模块可以完全自动地接收和发送CAN报文:且完全支持标准标识符(11位)和扩展标识符(29位)。

2、主要特性

  • 支持CAN协议2.0A和2.0B主动模式
  • 波特率最高可达1兆位/秒
  • 支持时间触发通信功能
发送
  • 3个发送邮箱
  • 发送报文的优先级特性可软件配置
  • 记录发送SOF时刻的时间
接收
  • 3级深度的2个FIFO
  • 14个位宽可变的过滤器组-由整个CAN共享
  • 标识符列表
  • FIFO溢出处理方式可配置
  • 记录接收SOF时刻的时间
可支持时间触发通信模式
  • 禁止自动重传模式
  • 16位自由运行定时器
  • 定时器分辨率可配置
  • 可在最后2个数据字节发送时间
管理
  • 中断可屏蔽
  • 邮箱占用单独1块地址空间,便于提高软件效率
接收过滤器
  • 共有14个位宽可变/可配置的标识符过滤器,软件通过对它们变成,从而在引脚收到的报文中选择她需要的报文,从而把其他报文丢掉。
接收FIFO
  • 共有2个接收FIFO,每个FIFO都可以存放3个完整的报文它们完全由硬件来管理。

bxCAN包含部件

控制、状态和配置寄存器

应用程序通过这些寄存器,可以:

  • 配置CAN参数,如波特率
  • 请求发送报文
  • 处理报文接收
  • 管理中断
  • 获取诊断信息
    在这里插入图片描述

bxCAN工作模式

bxCAN 由三个主要的工作模式:初始化、正常和睡眠模式。
还包括:测试模式、静默模式、环回模式、环回静默模式。
在这里插入图片描述
当按下 RESET 复位按键后,首先进入 SLEEP 模式,然后三个模式之间可通过配置 SLAK和INAK进行切换。

bxCAN的报文发送

在这里插入图片描述
简析:首先选择一个空邮箱,这时 TME =1,表示空邮箱,然后把一些数据(标识符ID、数据长度、真实数据等等)放进去,数据放进去之后,得告诉它数据应准备好,所以将 TME = 0,寄存器的对应为置1(TXRQ = 1),表示请求发送,然后进入一个挂号状态(PENDING),如果单签只有一个邮箱(否则按照优先级处理)在等待,就直接送到 (SCHEDULED),这里主要是进行打包、校验等操作,此时若 CAN Bus = IDLE ,总线处于空闲状态,就将打好的包发给发送寄存器(TRANSMIT),将数据发送出去,发送完成之后就有可能成功有可能失败,TME 最后状态都为1,表示邮箱为空,当 TXCK为0,表示发送失败,当 TXCK为1,表示发送成功。当在挂号(PENDING)或者打包(SCHEDULED)过程中,想撤销操作,可以由软件操作,将 ABRQ置1,然后邮箱就会被清空。若软件中设置了自动重传,当总线忙或者发送失败,会先回到 SCHEDULED中,待下次总线空闲再次发送。

bxCAN的报文接收

接收管理

接收到的报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了 CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。

有效报文

根据CAN协议,当报文被正确接收(直到EOF域的最后1位都没有错误),且通过了标识符过滤,那么该报文被认为是有效报文。

接收相关中断

一旦往FIFO存入1个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位为1,那么就会产生一个中断请求。
当FIFO变满时(即第3个报文被存入),CAN_RFxR寄存器的FULL位就被置1,并且如果CAN_IER寄存器的FFIE位为1,那么就会产生一个满中断请求。
在溢出的情况下,FOVR位被置1,并且如果CAN_IER寄存器的FOVIE位为1,那么就会产生一个溢出中断请求。

在这里插入图片描述
首先,若是一个空的FIFO,则FMP = 0X00,若接收到一个有效报文,则(一级深度) FMP = 0X01,若CPU将这个报文处理了,则又会释放这个报文,返回FMP = 0X00,仍然为空,如果CPU没有及时处理,并继续接收下一个有效报文,则(二级深度) FMP = 0X10,以此类推,当处于三级深度(FMP = 0X11)的时候,继续接收报文,FOVR = 1,表示溢出。这里是一个 队列,当一级深度接收第二个有效报文的时候,会先将第一个有效报文先送到二级深度,按照先后顺序排列处理。

那怎么判断 Vaild Message 是有效的?
需要用到bxCAN 的标识符过滤

bxCAN 的标识符过滤

在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接受者。节点在接收报文时–根据标识符的值–决定软件是否需要该报文:如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。
为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。

可变的位宽

每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:

  1. 1个32位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位。
  2. 2个16位过滤器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位。
    此外过滤器可配置为,屏蔽位模式和标识符模式。
屏蔽位模式

在屏蔽位模式下,标识符寄存器和屏蔽位寄存器 一起,指定报文标识符的任何一位,应该按照“必须匹配”和“不用关系”处理。(比如上方的CAN_FxR0和CAN_FxR1 两个寄存器,一个作为标识符寄存器,另一个作为屏蔽位寄存器,可以设置哪些位需要处理,哪些位不用关心)

标识符列表模式

在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用1个标识符和1个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。(比如上方的CAN_FxR0和CAN_FxR1 两个寄存器,全部都作为标识符寄存器)

在这里插入图片描述
在这里插入图片描述
简析:收到消息之后,会先将 Identifier 先拿进来过滤下,如果过滤好了,后面的Ctrl 和 Data 才会进来。Identifier 进来过滤,会先经过 第一组的 0 号、1号、4号过滤器等等,这里与4号过滤器匹配了,就会告诉 FIFO ,把这个数据Data存储下来,存储的同时会将 4号保存到 FMI,如果第一组没有过滤成功,就会进入第二组进行过滤。第一组是标识符,第二组是标识符+掩码的方式,如果过滤成功,处理方式同上,如果没有成功,就会丢弃(Discarded)

BxCAN 过滤器的编号在STM32BXCAN中,另一个较难理解的是过滤器编号。过滤器编号用于加速CPU对收到报文的处理。当收到一个有效报文时,BxCAN会将收到的报文以及它所通过的过滤器编号,一起存入接收邮箱中。当CPU处理时,可以根据过滤器编号,快速地知道该报文的用途,从而作出处理。其实,不用过滤器编号也是可以的,这时CPU就要分析所收报文的标识符,从而知道报文的用途。由于标识符所含的信息较多,处理起来就相对要慢一些。

bxCAN的报文存储

邮箱是软件和硬件之间关于报文的接口。邮箱包含了所有跟报文有关的信息:标识符、数据、控制、状态和时间戳信息。

共有3个发送和2个接收邮箱。每个接收邮箱为3级深度的FIFO,并且只能访问FIFO中最先放到的报文。
每个邮箱包含4个寄存器。
在这里插入图片描述

发送邮箱

软件需要在一个空的发送邮箱中,把待发送报文的各种信息设置好(然后再发出发送的请求)。发送的状态可通过查询CAN_TSR寄存器获知。

接收邮箱(FIFO)

在接收到一个报文后,软件就可以访问接收FIFO的输出邮箱来读取它。一旦软件处理了报文(如把它读出来),软件就应该对CAN_RFxR寄存器的RFOM位进行置1,来释放该报文,以便为后面收到的报文留出存储空间。过滤器匹配序号存放在CAN_RDTxR寄存器的FMI域中。16位的时间戳存放在CAN_RDTxR寄存器的TIME[15:0]域中。
在这里插入图片描述
在这里插入图片描述

CAN的位时间特性

位时间特性逻辑通过采样来监视串行的CAN总线,并且通过跟帧起始位的边沿进行同步,及通过跟后面的边沿进行同步,来调整期采样点。
它的操作可以简单解释为,如下所述把名义上的每位的时间分为3段:
1.同步段(SYNC_SEG):通常期望位的变化发生在该时间段内。其值固定为1个时间单元(1 x t CAN).
2.时间段1(BS1):定义采样点的位置。它包含CAN标准里的PROP_SEG和PHASE_SEG1。其值可以变成为1到16个时间单元,但也可以被自动延长,以补偿因为网络中不同节点的频率差异所造成的相位的正向漂移。
2.时间段2(BS2):定义发送点的位置。它代表CAN 标准里的PHASE_SEG2。其值可以编程为1到8个时间单元,但也可以被 自动缩短以补偿相位的负向漂移。

重新同步跳跃宽度(SJW)定义了,在每位中可以延长或缩短多少个时间单元的上限。其值可以编程为1到4个时间单元。
在这里插入图片描述
如果系统时钟 频率为72MHz,则CAN波特率为36MHz/(N*(1+Ts1+Ts2))
N = BRP + 1

CAN的寄存器在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值