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 怎么设置作业形式
固件接口如下:
/**
*@briefSelectstheCANOperaTIonmode.
*@paramCAN_OperaTIngMode:CANOperaTIngMode.
*Thisparametercanbeoneof@refCAN_OperaTIngMode_TypeDefenumeration.
*@retvalstatusoftherequestedmodewhichcanbe
*-CAN_ModeStatus_Failed:CANfailedenteringthespecificmode
*-CAN_ModeStatus_Success:CANSucceedenteringthespecificmode
*/
uint8_tCAN_OperatingModeRequest(CAN_TypeDef*CANx,uint8_tCAN_OperatingMode);
CAN_operating_mode如下界说:
/**
*@defgroupCAN_operating_mode
*@{
*/
#defineCAN_OperatingMode_Initialization((uint8_t)0x00)/*!
#defineCAN_OperatingMode_Normal((uint8_t)0x01)/*!
#defineCAN_OperatingMode_Sleep((uint8_t)0x02)/*!
4 怎么设置测验形式
/**@defgroupCAN_operating_mode
*@{
*/
#defineCAN_Mode_Normal((uint8_t)0x00)/*!
#defineCAN_Mode_LoopBack((uint8_t)0x01)/*!
#defineCAN_Mode_Silent((uint8_t)0x02)/*!
#defineCAN_Mode_Silent_LoopBack((uint8_t)0x03)/*!
在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