1 bxCAN工作模式
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总线的活动,而不会对总线造成影响-显性位(确认位、错误帧)不会真正发送到总线上。
图1
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
3 如何设置工作模式
固件接口如下:
/**
* @brief Selects the CAN Operation mode.
* @param CAN_OperatingMode: CAN Operating Mode.
* This parameter can be one of @ref CAN_OperatingMode_TypeDef enumeration.
* @retval status of the requested mode which can be
* - CAN_ModeStatus_Failed: CAN failed entering the specific mode
* - CAN_ModeStatus_Success: CAN Succeed entering the specific mode
*/
uint8_t CAN_OperatingModeRequest(CAN_TypeDef* CANx, uint8_t CAN_OperatingMode);
CAN_operating_mode如下定义:
/**
* @defgroup CAN_operating_mode
* @{
*/
#define CAN_OperatingMode_Initialization ((uint8_t)0x00) /*!< Initialization mode */
#define CAN_OperatingMode_Normal ((uint8_t)0x01) /*!< Normal mode */
#define CAN_OperatingMode_Sleep ((uint8_t)0x02) /*!< sleep mode */
4 如何设置测试模式
/** @defgroup CAN_operating_mode
* @{
*/
#define CAN_Mode_Normal ((uint8_t)0x00) /*!< normal mode */
#define CAN_Mode_LoopBack ((uint8_t)0x01) /*!< loopback mode */
#define CAN_Mode_Silent ((uint8_t)0x02) /*!< silent mode */
#define CAN_Mode_Silent_LoopBack ((uint8_t)0x03) /*!< loopback combined with silent mode */
在CAN初始化函数接口CAN_Init调用时,使用CAN_TypeDef类型的CAN_Mode定义了CAN的测试模式,其值如上所定义。如下所示:
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
//...
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//正常模式,或者设置为测试模式
//...
if (CAN_Init(CAN1,&CAN_InitStructure) == CANINITFAILED)
{
//...
}
//...
5 控制和状态寄存器
5.1 CAN主控制寄存器 (CAN_MCR)
地址偏移量: 0x00
复位值: 0x0001 0002
图4
位31:16 |
保留,硬件强制为0。 |
位15 |
RESET: bxCAN 软件复位
0: 本外设正常工作;
1: 对bxCAN进行强行复位,复位后bxCAN进入睡眠模式(FMP位和CAN_MCR寄存器被初始化为其复位值)。此后硬件自动对该位清0。 |
位14:8 |
保留,硬件强制为0。 |
位7 |
TTCM: 时间触发通信模式
0: 禁止时间触发通信模式;
1: 允许时间触发通信模式。
注: 要想了解关于时间触发通信模式的更多信息,请参考21.4.2:时间触发通信模式。 |
位6 |
ABOM: 自动离线(Bus-Off)管理
该位决定CAN硬件在什么条件下可以退出离线状态。
0: 离线状态的退出是在,软件对CAN_MCR寄存器的INRQ位进行置1随后清0后,一旦硬件检测到128次11位连续的隐性位,就退出离线状态;
1: 一旦硬件检测到128次11位连续的隐性位,自动退出离线状态。 |
位5 |
AWUM: 自动唤醒模式
该位决定CAN处在睡眠模式时由硬件还是软件唤醒
0: 睡眠模式通过清除CAN_MCR寄存器的SLEEP位,由软件唤醒;
1: 睡眠模式通过检测CAN报文,由硬件自动唤醒。唤醒的同时,硬件自动对CAN_MSR寄存器的SLEEP和SLAK位清0 。 |
位4 |
NART: 禁止报文自动重传
0: 按照CAN标准,CAN硬件在发送报文失败时会一直自动重传直到发送成功;
1: CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失)。 |
位3 |
RFLM: 接收FIFO锁定模式
0: 在接收溢出时FIFO未被锁定,当接收FIFO的报文未被读出,下一个收到的报文会覆盖原有的报文;
1: 在接收溢出时FIFO被锁定,当接收FIFO的报文未被读出,下一个收到的报文会被丢弃。 |
位2 |
TXFP: 发送FIFO优先级
当有多个报文同时在等待发送时,该位决定这些报文的发送顺序
0: 优先级由报文的标识符来决定;
1: 优先级由发送请求的顺序来决定。 |
位1 |
SLEEP: 睡眠模式请求
软件对该位置1可以请求CAN进入睡眠模式,一旦当前的CAN活动(发送或接收报文)结束,CAN就进入睡眠。
软件对该位清0使CAN退出睡眠模式。
当设置了AWUM位且在CAN Rx信号中检测出SOF位时,硬件对该位清0。
在复位后该位被置1-CAN在复位后处于睡眠模式。 |
位0 |
INRQ: 初始化请求
软件对该位清0可使CAN从初始化模式进入正常工作模式:当CAN在接收引脚检测到连续的11个隐性位后,CAN就达到同步,并为接收和发送数据作好准备了。为此,硬件相应地对CAN_MSR寄存器的INAK位清0。
软件对该位置1可使CAN从正常工作模式进入初始化模式:一旦当前的CAN活动(发送或接收)结束,CAN就进入初始化模式。相应地,硬件对CAN_MSR寄存器的INAK位置1。 |
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位隐性位。 |
分享到:
相关推荐
stm32cubeide-1.13.1版本 2023/9/11 download
stm32-can-bootloader-master STM32F1XX 系列MCU bootloader CAN 通讯升级,只需要更改APP跳转地址和CANH,CANL 定义口就可以使用了,调试通过
keil.stm32f4xx-dfp.2.15.0.pack/Keil.STM32F1xx-DFP.1.0.5.pack
STM32之CAN ---CAN ID过滤器分析.mht STM32之CAN---TTCAN模式浅析.mht ...STM32之CAN---工作-测试模式浅析.mht STM32之CAN---接收管理分析.mht STM32之CAN---配置波特率.mht STM32之CAN---错误管理分析.mht
stm32f407 can升级固件,测试通过
基于STM32的CAN-USB转换模块.pdf
stm32_f105-07_f2_f4_usb-host-device_lib STM32_USB-Host-Device_Lib_V2.2.0 内含自定义HID,复合设备例程
stm32f4 can总线 mdk514
STM32之CAN过滤器分析。在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。为了让大家更加了解CAN接受过滤机制,本文主要讲解过滤器概念、寄存器及相关寄存器的配置。
stm32f411开发板详细说明手册 Programming-with-Stm32-Getting-Started-with-the-Nucleo.pdf
STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验例程
stm32单片机NEO-6M GPS模块stm32单片机NEO-6M GPS模块stm32单片机NEO-6M GPS模块
STM32_USB-Host-Device_Lib_V2.1.0 虚拟串口
STM32_CAN_Bus调试心得 菜鸟级别讲解CAN-bus协议学习心得 在例程中学习CAN是比较简单方便快捷的了!
STM32 Virtual COM Port Driver V1.5.0 https://www.st.com/zh/development-tools/stsw-stm32102.html ...
两块STM32,一个做主机一个做从机,能够实现主机发送数据以及主机读取从机数据。通过串口调试,以及LED灯来提示工作状态。
STM标准库的STM32F103USB设备模式下的标准库驱动程序。 该资源包的文件目录结构: - STM32_USB-FS-Device_Lib_V4.1.0 -- _htmresc -- Libraries --- CMSIS --- STM32_USB-FS-Device_Driver --- STM32F10x_StdPeriph_...
Linux下用于串口下载stm32固件的程序, Usage: ./stm32flash [-bvngfhc] [-[rw] filename] /dev/ttyS0 -b rate Baud rate (default 57600) -r filename Read flash to file -w filename Write flash to file -u ...
基于STM32+NB-IOT的风机环境监控系统可实现检测温度,气压,风机工作电压电流,风机转速,并显示在液晶显示屏上。通过NB-IOT实现远程云端监控,手机电脑端监控。 系统硬件主要包括stm32f1主控,NB-IOT模块BC95,BMP...