你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32实例-CAN通信②-STM32F1 CAN 介绍

[复制链接]
STMCU小助手 发布时间:2022-6-26 18:06
    STM32F1 芯片自带 bxCAN 控制器 (Basic Extended CAN),即基本扩展 CAN,可与 CAN 网络进行交互,它支持 2.0A 和 B 版本的 CAN 协议。旨在以最少的CPU 负载高效管理大量的传入消息,并可按需要的优先级实现消息发送。在攸关安全性的应用中,CAN 控制器提供所有必要的硬件功能来支持 CAN 时间触发通信方案。
    STM32F1 的 bxCAN 的主要特性有:
·支持 CAN 协议 2.0A 和 2.0B 主动模式
·波特率最高达 1Mbps
·支持时间触发通信
·具有 3 个发送邮箱
·具有 3 级深度的 2 个接收 FIFO
·可变的过滤器组( 互联网产品中有 28 个, CAN1 和 CAN2 共享,其他STM32F103xx 有 14 个)
    我们使用的 STM32F103ZET6自带 1 个 CAN 控制器,而 STM32F105/STM32F107互联网型含有 2 个 CAN 控制器,互联网型只是比 STM32F103 多一个而已。下面我们就来看下互联网型它内部结构,如下图所示:

微信图片_20220626180610.png

    从CAN 内部结构图可以看出,CAN1 是主设备,CAN2 是从设备。框图中的“存储访问控制器”是由 CAN1 控制的,CAN2 无法直接访问存储区域,所以如果使用 CAN2 的时候必须先使能CAN1 外设的时钟,我们使用的 STM32F103ZET6只含有 CAN1。框图中主要包含 CAN 控制内核、发送邮箱、接收 FIFO 以及验收筛选器,下面我们就依次进行简单介绍。
(1)标号 1:CAN 控制内核
    CAN 控制内核包含了各种控制/状态寄存器,我们主要讲解其中的主控制寄存器 CAN_MCR 及位时序寄存器 CAN_BTR。
①控制寄存器 CAN_MCR主控制寄存器 CAN_MCR 负责管理 CAN 的工作模式,寄存器如下:

微信图片_20220626180605.png

②位时序寄存器(CAN_BTR)
    CAN 外设中的位时序寄存器 CAN_BTR 用于配置测试模式、波特率以及各种位内的段参数。该寄存器如下:

微信图片_20220626180600.png

1.测试模式
    为方便调试,STM32 的 CAN 提供了测试模式,配置位时序寄存器 CAN_BTR的 SILM 及 LBKM 寄存器位可以控制使用正常模式、静默模式、回环模式及静默回环模式。下面我们就来介绍下这几种工作模式:
A.正常模式一旦初始化完成,软件必须向硬件请求进入正常模式,这样才能在 CAN 总线上进行同步,并开始接收和发送。进入正常模式的请求可通过将 CAN_MCR 寄存器的 INRQ 位清零来发出。
bxCAN 进入正常模式,并与 CAN 总线上的数据传输实现同步后,即可参与总线活动。执行这一步时,需要等待出现一个由 11 个连续隐性位(总线空闲状态)组成的序列。硬件通过将 CAN_MSR 寄存器的 INAK 位清零,来确认切换到正常模式。
B.静默模式可以通过将 CAN_BTR 寄存器的 SILM 位置 1,将 bxCAN 置于静默模式。在静默模式下, bxCAN 可以接收有效数据帧和有效遥控帧,但仅在 CAN 总线上发送隐性位,并且无法启动发送。如果 bxCAN 必须发送一个显性位( ACK 位、溢出标志、活动错误标志),该位将在内部被改道发送,以便 CAN 内核可以监视该显性位,但 CAN 总线可以保持隐性状态。静默模式可用于分析 CAN 总线上的流量,同时又不会因发送显性位(确认位、错误帧)对其造成影响。该模式下的bxCAN如下:

微信图片_20220626180550.png

C.回环模式
    可以通过将 CAN_BTR 寄存器的 LBKM 位置 1,将 bxCAN 置于环回模式。在环回模式下,bxCAN 将其自身发送的消息作为接收的消息来处理并存储(如果这些消息通过了验收筛选)在接收邮箱中。该模式下的 bxCAN 如下:


    该模式为自检功能提供。为了不受外部事件的影响, CAN 内核在环回模式
下将忽略确认错误(在数据/远程帧的确认时隙不对显性位采样)。在此模式下,bxCAN 将执行从发送输出到接收输入的内部反馈。bxCAN 将忽略 CANRX 输入引脚的实际值。从 CANTX 引脚可以监视发送的消息。
D.静默回环模式可以通过将 CAN_BTR 寄存器的 LBKM 和 SILM 位置 1,将环回模式和静默模式组合起来。该模式可用于“热自检”,也就是说, bxCAN 可以像在环回模式下一样进行检测, 同时又不会影响与 CANTX 和 CANRX 引脚相连接的运行中的CAN 系统。在此模式下, CANRX 引脚与 bxCAN 断开连接, CANTX 引脚则保持隐性。该模式下的 bxCAN如下:

微信图片_20220626180546.png

    上述说的各个模式,是不需要修改硬件接线的,如当输出直连输入时,它是在 STM32F1 芯片内部连接的,传输路径不经过 STM32 的 CAN_Tx/Rx 引脚,更不经过外部连接的 CAN 收发器,只有输出数据到总线或从总线接收的情况下才会经过 CAN_Tx/Rx 引脚和收发器。

2.位时序及波特率
    STM32F1 的 CAN 控制器定义的位时序与前面我们介绍的 CAN 标准位时序有一点区别,STM32F1 把传播时间段和相位缓冲段 1( STM32F1 称之为位段 1)合并了, 所以 STM32F1 的 CAN 一个位只有 3 段。分别是:同步段 (SYNC_SEG)、位段 1 (BS1)、位段 2 (BS2)。STM32F1 的 CAN 的位时序如下图所示:

微信图片_20220626180537.png

    这三段的工作过程如下:
● 同步段 (SYNC_SEG):位变化应该在此时间段内发生。它只有一个时间片
的固定长度(1 x tCAN)。
● 位段 1 (BS1):定义采样点的位置。它包括 CAN 标准的 PROP_SEG 和
PHASE_SEG1。其持续长度可以在 1 到 16 个时间片之间调整(刚好等于我们前面介绍的传播时间段和相位缓冲段 1 之和),但也可以自动加长,以补偿不同网络节点的频率差异所导致的正相位漂移。
● 位段 2 (BS2):定义发送点的位置。它代表 CAN 标准的 PHASE_SEG2。
其持续长度可以在 1 到 8 个时间片之间调整,但也可以自动缩短,以补偿负相位漂移。
    了解了 STM32F1 的 CAN的位时序后,我们就可以配置波特率了。通过配置位时序寄存器 CAN_BTR(为了避免编程错误,位时序寄存器 (CAN_BTR) 只能在器件处于待机模式时进行配置) 的 TS1[3:0]及 TS2[2:0]寄存器位设定 BS1 及BS2 段的长度后,我们就可以非常方便的计算 CAN 通信波特率,计算公式如下:

微信图片_20220626180534.png

    其中的 tPCLK 指 APB1 时钟,默认值为 36MHz,现在我们只要知道 BS1 和BS2 的设置值就可以计算出波特率。比如设置 TS1=7、 TS2=8 和 BRP=3, 在 APB1频率为 36Mhz 的条件下,即可得到 CAN 通信的波特率
BoundRate=36000/[(8+9+1)*4]=500Kbps。
(2)标号 2:发送邮箱
    在STM32F1 的 CAN 结构框图中,标号 2 是 CAN 的发送邮箱,它含有 3个发送邮箱,软件可通过三个发送邮箱设置消息。发送调度程序负责决定首先发送哪个邮箱的内容。CAN 邮箱寄存器可在中文参考手册查找。
(3)标号 3:验收筛选器
    互联网型产品的 bxCAN 提供了 28 个可调整/可配置的标识符筛选器组,我们使用的 STM32F103ZET6 只有 14 个,用于选择软件所需的传入消息并丢弃其余消息。每个筛选器组由 2 个 32 为寄存器,CAN_FxR1 和 CAN_FxR2 组成。
    为了根据应用程序的需求来优化和调整筛选器, 每个筛选器组可分别进行伸缩调整。根据筛选器尺度不同,一个筛选器组可以:
● 为 STDID[10:0]、 EXTID[17:0]、 IDE 和 RTR 位提供一个 32 位筛选
器。
● 为 STDID[10:0]、 RTR、 IDE 和 EXTID[17:15] 位提供两个 16 位筛选
器。
    此外,筛选器还可配置为掩码模式或标识符列表模式。
    在掩码模式下,标识符寄存器与掩码寄存器关联,用以指示标识符的哪些位“必须匹配”,哪些位“无关”。而在标识符列表模式下,掩码寄存器用作标识
符寄存器。这时,不会定义一个标识符和一个掩码,而是指定两个标识符,从而使单个标识符的数量加倍。传入标识符的所有位都必须与筛选器寄存器中指定的位匹配。
    通过 CAN_FMR 寄存器,可以配置过筛选器组的位宽和工作模式,如下图所示。

微信图片_20220626180526.png

    为了过滤出一组标识符,应该设置筛选器组工作在掩码模式。
    为了过滤出一个标识符,应该设置筛选器组工作在标识符列表模式。
    应用程序不用的过滤器组,应该保持在禁用状态。
    筛选器组中的每个筛选器, 都被编号为(叫做筛选器号, 上图中的 n)从 0 开始,到某个最大数值-取决于筛选器组的模式和位宽的设置。
    举个简单的例子,我们设置筛选器组 0 工作在:1 个 32 位筛选器-标识
符掩码模式,然后设置 CAN_F0R1=0XFFFF0000, CAN_F0R2=0XFF00FF00。其中存放 到 CAN_F0R1 的 值 就 是 期 望 收 到 的 ID , 即 我 们 希 望 收 到 的 ID( STID+EXTID+IDE+RTR)最好是:0XFFFF0000。而 0XFF00FF00 就是设置我们需要必须关心的 ID,表示收到的 ID,其位[31:24]和位[15:8]这 16 个位的必须和 CAN_F0R1 中对应的位一模一样,而另外的 16 个位则不关心,可以一样,也可以不一样,都认为是正确的 ID,即收到的 ID 必须是 0XFFxx00xx,才算是正确的( x 表示不关心)。
(4)标号 4:CAN 接收FIFO
    硬件使用两个接收 FIFO 来存储传入消息。每个 FIFO 中有三个邮箱用于存储三条完整消息。FIFO 完全由硬件管理。
    FIFO 开始时处于空状态,在接收的第一条有效消息存储在其中后,变为
Pending_1 状态。硬件通过将 CAN_RFR 寄存器的 FMP[1:0] 位置为 01b 来指示该事件。消息将在 FIFO 输出邮箱中供读取。软件将读取邮箱内容,并通过将CAN_RFR 寄存器的 RFOM 位置 1,来将邮箱释放。FIFO 随即恢复空状态。如果同时接收到新的有效消息, FIFO 将保持 Pending_1 状态,新消息将在输出邮箱中供读取。
    如果应用程序未释放邮箱,下一条有效消息将存储在 FIFO 中,使其进入
Pending_2 状态(FMP[1:0] = 10b)。下一条有效消息会重复该存储过程,同时将FIFO 变为 Pending_3 状态(FMP[1:0] = 11b)。此时,软件必须通过将 RFOM 位置 1 来释放输出邮箱,从而留出一个空邮箱来存储下一条有效消息。否则,下一次接收到有效消息时,将导致消息丢失。
    一旦 FIFO 处于 Pending_3 状态(即三个邮箱均已满),则下一次接收到
有效消息时,将导致上溢并丢失一条消息。硬件通过将 CAN_RFR 寄存器的 FOVR位置 1 来指示上溢状况。丢失的消息取决于 FIFO 的配置:
● 如果禁止 FIFO 锁定功能( CAN_MCR 寄存器的 RFLM 位清零),则新传
入的消息将覆盖 FIFO 中存储的最后一条消息。在这种情况下,应用程序将始终能访问到最新的消息。
● 如果使能 FIFO 锁定功能( CAN_MCR 寄存器的 RFLM 位置 1),则将丢
弃最新的消息,软件将提供 FIFO 中最早的三条消息。
    消息存储到 FIFO 中后,FMP[1:0] 位即会更新,如果 CAN_IER 寄存器的
FMPIE 位置 1,将 产生中断请求。FIFO 存满消息(即存储了第三条消息)后,CAN_RFR 寄存器的 FULL 位置 1,如果 CAN_IER 寄存器的 FFIE 位置 1,将产生中断。出现上溢时,FOVR 位将置 1, 如果 CAN_IER 寄存器的 FOVIE 位置 1,将产生中断。
(5)标号 5:CAN2整体控制逻辑
    CAN2与CAN1是一样的, 它们共用验收筛选器且由于存储访问控制器由 CAN1控制,所以要使用 CAN2 的时候必须要使能 CAN1 的时钟。
    由于篇幅限制,并没有对 STM32F1 的 CAN 相关寄存器进行介绍,大家可
以参考《STM32F10x 中文参考手册》-22 控制器区域网络(bxCAN)章节,里面有详细的讲解。CAN 总线内部还是比较复杂的,如果看不懂的可以暂时放下,因为我们使用的是库函数开发,只需简单配置下即可使用。

微信图片_20220626180520.png
收藏 评论0 发布时间:2022-6-26 18:06

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版