bxCAN有3个主要的工作模式:初始化模式正常模式睡眠模式

在硬件复位后,bxCAN工作在睡眠模式以节省电能,同时CANTX引脚的内部上拉电阻被激活。软件通过对CAN_MCR寄存器的INRQ或SLEEP位置’1’,可以请求bxCAN进入初始化或睡眠模式。一旦进入了初始化或睡眠模式,bxCAN就对CAN_MSR寄存器的INAK或SLAK位置’1’来进行确认,同时内部上拉电阻被禁用。

当INAK和SLAK位都为’0’时,bxCAN就处于正常模式。在进入正常模式前,bxCAN必须跟CAN总线取得同步;为取得同步,bxCAN要等待CAN总线达到空闲状态,即在CANRX引脚上监测到11个连续的隐性位。

1.1 初始化模式

软件初始化应该在硬件处于初始化模式时进行。设置CAN_MCR寄存器的INRQ位为’1’,请求bxCAN进入初始化模式,然后等待硬件对CAN_MSR寄存器的INAK位置’1’来进行确认。
    清除CAN_MCR寄存器的INRQ位为’0’,请求bxCAN退出初始化模式,当硬件对CAN_MSR寄存器的INAK位清’0’就确认了初始化模式的退出。
    当bxCAN处于初始化模式时,禁止报文的接收和发送,并且CANTX引脚输出隐性位(高电平)。初始化模式的进入,不会改变配置寄存器。

软件对bxCAN的初始化,至少包括位时间特性(CAN_BTR)和控制(CAN_MCR)这2个寄存器。
在对bxCAN的过滤器组(模式、位宽、FIFO关联、激活和过滤器值)进行初始化前,软件要对CAN_FMR寄存器的FINIT位设置’1’。对过滤器的初始化可以在非初始化模式下进行。
注:当FINIT=1时,报文的接收被禁止。可以先对过滤器激活位清’0’(在CAN_FA1R中),然后修改相应过滤器的值。如果过滤器组没有使用,那么就应该让它处于非激活状态(保持其FACT位为清’0’状态)。

1.2 正常模式

在初始化完成后,软件应该让硬件进入正常模式,以便正常接收和发送报文。软件可以通过对CAN_MCR寄存器的INRQ位清’0’,来请求从初始化模式进入正常模式,然后要等待硬件对CAN_MSR寄存器的INAK位置’1’的确认。在跟CAN总线取得同步,即在CANRX引脚上监测到11个连续的隐性位(等效于总线空闲)后,bxCAN才能正常接收和发送报文。

不需要在初始化模式下进行过滤器初值的设置,但必须在它处在非激活状态下完成(相应的FACT位为0)。而过滤器的位宽和模式的设置,则必须在初始化模式中进入正常模式前完成。

1.3 睡眠模式(低功耗)

bxCAN可工作在低功耗的睡眠模式。软件通过对CAN_MCR寄存器的SLEEP位置’1’,来请求进入这一模式。在该模式下,bxCAN的时钟停止了,但软件仍然可以访问邮箱寄存器。
当bxCAN处于睡眠模式,软件必须对CAN_MCR寄存器的INRQ位置’1’并且同时对SLEEP位清’0’,才能进入初始化模式。
有2种方式可以唤醒(退出睡眠模式)bxCAN:通过软件对SLEEP位清’1’,或硬件检测到CAN总线的活动。
如果CAN_MCR寄存器的AWUM位为’1’,一旦检测到CAN总线的活动,硬件就自动对SLEEP位清’0’来唤醒bxCAN。如果CAN_MCR寄存器的AWUM位为’0’,软件必须在唤醒中断里对SLEEP位清’0’才能退出睡眠状态。

注:如果唤醒中断被允许(CAN_IER寄存器的WKUIE位为’1’),那么一旦检测到CAN总线活动就会产生唤醒中断,而不管硬件是否会自动唤醒bxCAN。
在对SLEEP位清’0’后,睡眠模式的退出必须与CAN总线同步,当硬件对SLAK位清’0’时,就确认了睡眠模式的退出。

2 测试模式

通过对CAN_BTR寄存器的SILM和/或LBKM位置’1’,来选择一种测试模式。只能在初始化模式下,修改这2位。在选择了一种测试模式后,软件需要对CAN_MCR寄存器的INRQ位清’0’,来真正进入测试模式。

2.1 静默模式

通过对CAN_BTR寄存器的SILM位置’1’,来选择静默模式。
在静默模式下,bxCAN可以正常地接收数据帧和远程帧,但只能发出隐性位,而不能真正发送报文。如果bxCAN需要发出显性位(确认位、过载标志、主动错误标志),那么这样的显性位在内部被接回来从而可以被CAN内核检测到,同时CAN总线不会受到影响而仍然维持在隐性位状态。因此,静默模式通常用于分析CAN总线的活动,而不会对总线造成影响-显性位(确认位、错误帧)不会真正发送到总线上。

2.2 环回模式

通过对CAN_BTR寄存器的LBKM位置’1’,来选择环回模式。在环回模式下,bxCAN把发送的报文当作接收的报文并保存(如果可以通过接收过滤)在接收邮箱里。

环回模式可用于自测试。为了避免外部的影响,在环回模式下CAN内核忽略确认错误(在数据/远程帧的确认位时刻,不检测是否有显性位)。在环回模式下,bxCAN在内部把Tx输出回馈到Rx输入上,而完全忽略CANRX引脚的实际状态。发送的报文可以在CANTX引脚上检测到。

2.3 环回静默模式

通过对CAN_BTR寄存器的LBKM和SILM位同时置’1’,可以选择环回静默模式。该模式可用于“热自测试”,即可以象环回模式那样测试bxCAN,但却不会影响CANTX和CANRX所连接的整个CAN系统。在环回静默模式下,CANRX引脚与CAN总线断开,同时CANTX引脚被驱动到隐性位状态。

3 如何设置工作模式

固件接口如下:

[cpp] view plaincopy

  1. uint8_t CAN_OperatingModeRequest(CAN_TypeDef* CANx, uint8_t CAN_OperatingMode);

CAN_operating_mode如下定义:

[cpp] view plaincopy

  1. #define CAN_OperatingMode_Initialization  ((uint8_t)0x00)
  2. #define CAN_OperatingMode_Normal          ((uint8_t)0x01)
  3. #define CAN_OperatingMode_Sleep           ((uint8_t)0x02)

4 如何设置测试模式

[cpp] view plaincopy

  1. #define CAN_Mode_Normal             ((uint8_t)0x00)
  2. #define CAN_Mode_LoopBack           ((uint8_t)0x01)
  3. #define CAN_Mode_Silent             ((uint8_t)0x02)
  4. #define CAN_Mode_Silent_LoopBack    ((uint8_t)0x03)

在CAN初始化函数接口CAN_Init调用时,使用CAN_TypeDef类型的CAN_Mode定义了CAN的测试模式,其值如上所定义。如下所示:

[cpp] view plaincopy

  1. CAN_DeInit(CAN1);
  2. CAN_StructInit(&CAN_InitStructure);
  3. //...
  4. CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//正常模式,或者设置为测试模式
  5. //...
  6. if (CAN_Init(CAN1,&CAN_InitStructure) == CANINITFAILED)
  7. {
  8. //...
  9. }
  10. //...

5 控制和状态寄存器

5.1 CAN主控制寄存器 (CAN_MCR)

地址偏移量: 0x00
复位值: 0x0001 0002

位31:12 保留位,硬件强制为0
位11 RX: CAN接收电平
该位反映CAN接收引脚(CAN_RX)的实际电平。
位10 SAMP: 上次采样值
CAN接收引脚的上次采样值(对应于当前接收位的值)。
位9 RXM: 接收模式
该位为1表示CAN当前为接收器。
位8 TXM: 发送模式
该位为1表示CAN当前为发送器。
位7:5 保留位,硬件强制为0。
位4 SLAKI: 睡眠确认中断
当SLKIE=1, 一旦CAN进入睡眠模式硬件就对该位置1,紧接着相应的中断被触发。软件可对该位清0,当SLAK位被清0时硬件也对该位清0。
注: 当SLKIE=0, 不应该查询该位,而应该查询SLAK位来获知睡眠状态。
位3 WKUI: 唤醒中断挂号
当CAN处于睡眠状态,一旦帧起始位(SOF)被检测到,硬件就对该位置1;并且如果CAN_IER寄存器的WKUIE位为1,则相应的中断被触发。
该位由软件清0。
位2 ERRI: 出错中断挂号
当由于检测到出错而对CAN_ESR 寄存器的某位置1,并且CAN_IER 寄存器的相应中断使能位也被置1时,硬件对该位置1;并且如果CAN_IER寄存器的ERRIE位为1则错误中断被触发。
该位由软件清0。
位1 SLAK: 睡眠模式确认
当CAN进入睡眠模式时硬件就对该位置1,从而供软件进行状态查询。该位是对软件请求进入睡眠模式的确认(对CAN_MCR寄存器的SLEEP位置1)。当CAN退出睡眠模式时硬件对该位清0 (需要跟CAN总线同步)。 这里跟CAN总线同步是指,硬件需要在CAN的RX引脚上检测到连续的11位隐性位。
注: 通过软件或硬件对CAN_MCR 的SLEEP位清0,是开启退出睡眠模式过程的唯一途径。有关清除SLEEP位的详细信息,参见CAN_MCR寄存器的AWUM位的描述。
位0 INAK: 初始化确认
当CAN进入初始化模式时硬件就对该位置1,从而供软件进行状态查询。该位是对软件请求进入初始化模式的确认(对CAN_MCR寄存器的INRQ位置1)。
当CAN退出初始化模式时硬件对该位清0 (需要跟CAN总线同步)。这里跟CAN总线同步是指,硬件需要在CAN的RX引脚上检测到连续的11位隐性位。

5.2 CAN主状态寄存器 (CAN_MSR)

地址偏移量: 0x04
复位值: 0x0000 0C02

图5

位31:12 保留位,硬件强制为0
位11 RX: CAN接收电平
该位反映CAN接收引脚(CAN_RX)的实际电平。
位10 SAMP: 上次采样值
CAN接收引脚的上次采样值(对应于当前接收位的值)。
位9 RXM: 接收模式
该位为1表示CAN当前为接收器。
位8 TXM: 发送模式
该位为1表示CAN当前为发送器。
位7:5 保留位,硬件强制为0。
位4 SLAKI: 睡眠确认中断
当SLKIE=1, 一旦CAN进入睡眠模式硬件就对该位置1,紧接着相应的中断被触发。软件可对该位清0,当SLAK位被清0时硬件也对该位清0。
注: 当SLKIE=0, 不应该查询该位,而应该查询SLAK位来获知睡眠状态。
位3 WKUI: 唤醒中断挂号
当CAN处于睡眠状态,一旦帧起始位(SOF)被检测到,硬件就对该位置1;并且如果CAN_IER寄存器的WKUIE位为1,则相应的中断被触发。
该位由软件清0。
位2 ERRI: 出错中断挂号
当由于检测到出错而对CAN_ESR 寄存器的某位置1,并且CAN_IER 寄存器的相应中断使能位也被置1时,硬件对该位置1;并且如果CAN_IER寄存器的ERRIE位为1则错误中断被触发。
该位由软件清0。
位1 SLAK: 睡眠模式确认
当CAN进入睡眠模式时硬件就对该位置1,从而供软件进行状态查询。 该位是对软件请求进入睡眠模式的确认(对CAN_MCR寄存器的SLEEP位置1)。当CAN退出睡眠模式时硬件对该位清0 (需要跟CAN总线同步)。 这里跟CAN总线同步是指,硬件需要在CAN的RX引脚上检测到连续的11位隐性位。
注: 通过软件或硬件对CAN_MCR 的SLEEP位清0,是开启退出睡眠模式过程的唯一途径。有关清除SLEEP位的详细信息,参见CAN_MCR寄存器的AWUM位的描述。
位0 INAK: 初始化确认
当CAN进入初始化模式时硬件就对该位置1,从而供软件进行状态查询。 该位是对软件请求进入初始化模式的确认(对CAN_MCR寄存器的INRQ位置1)。
当CAN退出初始化模式时硬件对该位清0 (需要跟CAN总线同步)。这里跟CAN总线同步是指,硬件需要在CAN的RX引脚上检测到连续的11位隐性位。

STM32之CAN---工作/测试模式浅析相关推荐

  1. STM32 CAN总线工作原理

    CAN总线工作原理 CAN是什么? CAN是Controller Area Network的缩写(以下称为CAN),是ISO*1国际标准化的串行通信协议. 在当前的汽车产业中,出于对安全性.舒适性.方 ...

  2. 基于STM32开发板CAN总线通信协议浅析

    基于STM32开发板CAN总线通信协议浅析 一.前言 控制器局域网(Controller Area Network,CAN),是由德国BOSCH(博世)公司开发,是目前国际上应用最为广泛的现场总线之一 ...

  3. STM32的下载及调试模式 接口

    使用的最多的调试方式莫过于 JTAG  和SWD方式. JTAG: JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主 ...

  4. 基于C8051F040单片机的CAN总线测试模式研究

    摘要:现场总线已成为数据总线领域中最为活跃的热点,CAN总线被公认为最有前途的现场总线之一,CAN总线节点的设计.调试是CAN总线通讯系统设计的重点.在此介绍了C8051F040单片机内部集成的CAN ...

  5. Android手机产线测试模块,基于Android平台智能手机可靠性生产测试模式的实现

    摘要: 随着通信技术的飞速发展,智能手机逐渐走进了普通大众的生活,未来它将成为人们获取信息的主要设备,这是一个不可阻挡的趋势.依托中国3G业务的发展,移动手机市场近几年来发展火爆全面智能化.但在我国手 ...

  6. 【蓝桥杯嵌入式】【STM32】13_PWM输入捕获模式

    文章目录 前言 1.PWM输入模式 2.硬件设计 3.软件设计 前言   STM32的定时器输入捕获模式可以通过更改输入捕获极性实现PWM的输入捕获,但实际上STM32也包含有非常方便的PWM输入捕获 ...

  7. windows测试模式

    测试模式通常意义就是让windows 操作系统在测试状态下运行,windows操作系统在这种模式下可以运行非官方或无数字签名的驱动程序 . 目录 1 定义 2 进入/退出windows测试模式方法 3 ...

  8. 浅谈STM32的三种Boot模式

    文章目录 一.关于BOOT模式的介绍 二.实际例子进行分析 三.分析上电启动流程 四.小结 五.参考资料 一.关于BOOT模式的介绍 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的 ...

  9. 法国敏捷开发与敏捷测试模式

    [本文未经作者同意,不得以任何形式转载或发布,本文作者版权归作者所有,若转载此文,请联系QQ 252413619,以前授权转载本博客文章的公司,若转载此文,请再与本人联系,谢谢,麻烦啦!] 作为一名有 ...

最新文章

  1. 关于lombok插件的使用,强大的简化代码工具
  2. 8月第一周国内搜索网站 排名顺序基本稳定
  3. Loj #6274. 数字 数位dp + 去重
  4. php 随机在文章中添加锚文本_锚文本对网站SEO优化有什么帮助?
  5. 从零开始学架构4 - 可扩展篇
  6. Ubuntu 下通过 ppa 安装 RabbitVCS
  7. 学好python需要哪些基础_学Python要避免哪些坑,如何巩固好基础
  8. 游戏用计算机配置表显卡,5000元电脑配置9代i5配GTX1660TI显卡配置清单(可装Win7)...
  9. Docker配置国内加速器加速镜像下载的方法
  10. 中国省市县地区代码一览表
  11. 数学建模——国赛写作模板篇
  12. html导航栏位置垂直居中,导航栏水平+垂直居中
  13. ubuntu18只进入安全模式_Ubuntu安装最佳实践(防踩坑指南)
  14. 【图像隐写数据集】图像隐写数据集整理
  15. 蓝桥杯 调和级数 Java
  16. 陈艾盐:春燕百集访谈节目第二十一集
  17. MyHDL中文手册(十)——转换成Verilog和VHDL
  18. Linux基础bash命令
  19. (模电笔记四 By Multisim)典型运算放大电路案例分析(同相反相差分)
  20. linux升级wine1.7,Wine 1.7.43 发布下载

热门文章

  1. 自学架构设计的一个好方法
  2. 让 CPU 告诉你硬盘和网络到底有多慢
  3. 跨域问题的前后端解决方案
  4. Android --- 使用纯java代码实现相对布局(通俗易懂)
  5. 输入年月日 输出该日期是星期几。javascript_快速提升拼音输入法的几个技巧 高手都会用!...
  6. C语言 int 转单精度浮点,单精度浮点数与十六进制转换 C语言程序 单片机也可用...
  7. Java高版本编译低版本运行_Java高版本编译低版本运行错误(ConcurrentHashMap.keySet)...
  8. HighNewTech:横向、纵向动图查看《Why资本寒冬》——根据中国四大行每年(2004年~2018年)贷款主要流向来看当下的资本寒冬
  9. Python 任意中文文本生成词云 最终版本
  10. 微信小程序图片轮转播放