bxCAN 有三种主要的工作模式:初始化、正常和睡眠。硬件复位后,bxCAN 进入睡眠模式以降低功耗,同时 CANTX 上的内部上拉电阻激活。软件将主控制寄存器(CAN_MCR---CAN master control register)的初始化请求位 (INRQ---Initialization request) 或睡眠模式请求位(SLEEP---Sleep mode request)置 1,以请求 bxCAN 进入初始化或睡眠模式。
一旦进入该模式,bxCAN 即将主状态寄存器(CAN_MSR---CAN master status register)的初始化确认位 ?(INAK---Initialization acknowledge) 或睡眠确认位(SLAK---Sleep acknowledge)置 1,以确认该模式,同时禁止内部上拉电阻。
如果主状态寄存器(CAN_MSR---CAN master status register)的初始化确认位(INAK---Initialization acknowledge) 和睡眠确认位(SLAK---Sleep acknowledge)均未置 1,则 bxCAN 将处于正常模式。进入正常模式之前,bxCAN 必须始终在 CAN 总线上实现同步。为了进行同步,bxCAN 将等待 CAN 总线空闲(即,已从CANRX上监测到 11 个连续的隐性位)。
当硬件处于初始化模式时,可以进行软件初始化。为进入该模式,采用软件将主控制寄存器(CAN_MCR---CAN master control register)的初始化请求位 (INRQ---Initialization request)置 1,并等待硬件将主状态寄存器(CAN_MSR---CAN master status register)的初始化确认位(INAK---Initialization acknowledge)置 1 来确认请求。
如想退出初始化模式,采用软件将主控制寄存器(CAN_MCR---CAN master control register)的初始化请求位 (INRQ---Initialization request)清零。一旦硬件将主状态寄存器(CAN_MSR---CAN master status register)的初始化确认位(INAK---Initialization acknowledge)清零,bxCAN 即退出初始化模式。
在初始化模式下,所有从 CAN 总线传入和传出的消息都将停止,并且 CAN 总线输出 CANTX 的状态为隐性(高)。
进入初始化模式不会更改任何配置寄存器。
为初始化 CAN 控制器,软件必须设置位时序寄存器 (CAN_BTR---CAN bit timing register) 和 主控制寄存器(CAN_MCR---CAN master control register)。
为初始化与 CAN 筛选器组相关的寄存器(模式、尺度、FIFO 分配、激活和筛选器值),软件必须将筛选器主寄存器(CAN_FMR---CAN filter master register)的筛选器初始化模式位 (FINIT---Filter init mode) 置 1。筛选器的初始化也可以在初始化模式之外进行。
注意: FINIT=1 时,CAN 接收停用。
筛选器值激活与否,也可通过设置筛选器激活寄存器(CAN_FA1R---CAN filter activation register)的相关筛选器激活位(FACTx---Filter active)来修改。
如果某个筛选器组未使用,建议将其保持未激活状态(将相应 FACT 位保持清零)。
一旦初始化完成,软件必须向硬件请求进入正常模式,这样才能在 CAN 总线上进行同步,并开始接收和发送。
进入正常模式的请求可通过将主控制寄存器(CAN_MCR---CAN master control register)的初始化请求位 (INRQ---Initialization request)清零来发出。bxCAN 进入正常模式,并与 CAN 总线上的数据传输实现同步后,即可参与总线活动。执行这一步时,需要等待出现一个由 11 个连续隐性位(总线空闲状态)组成的序列。硬件通过将主状态寄存器(CAN_MSR---CAN master status register)的初始化确认位(INAK---Initialization acknowledge)清零,来确认切换到正常模式。
筛选器值的初始化与初始化模式无关,但必须要在筛选器处于未激活状态(筛选器激活寄存器(CAN_FA1R---CAN filter activation register)的相关筛选器激活位(FACTx---Filter active)清零)时进行。筛选器尺度和模式配置必须在进入正常模式之前完成。
为降低能耗功耗,bxCAN 具有低功耗模式,称为睡眠模式。软件通过将主控制寄存器(CAN_MCR---CAN master control register)的睡眠模式请求位(SLEEP---Sleep mode request)置 1 而发出请求后,即可进入该模式。该模式下,bxCAN 时钟停止,但软件仍可访问 bxCAN 邮箱。
在 bxCAN 处于睡眠模式时,如果软件通过将主控制寄存器(CAN_MCR---CAN master control register)的初始化请求位 (INRQ---Initialization request) 置 1 来请求进入初始化模式,则必须同时将主控制寄存器(CAN_MCR---CAN master control register)的睡眠模式请求位(SLEEP---Sleep mode request)清零。
软件将主控制寄存器(CAN_MCR---CAN master control register)的睡眠模式请求位(SLEEP---Sleep mode request)清零或检测到 CAN 总线活动时,bxCAN 即被唤醒(退出睡眠模式)。
检测到 CAN 总线活动后,如果主控制寄存器(CAN_MCR---CAN master control register)的自动唤醒模式位(AWUM---Automatic wakeup mode)置 1,硬件将通过清零主控制寄存器(CAN_MCR---CAN master control register)的睡眠模式请求位(SLEEP---Sleep mode request)来自动执行唤醒序列。如果主控制寄存器(CAN_MCR---CAN master control register)的自动唤醒模式位(AWUM---Automatic wakeup mode)清零,在发生唤醒中断时,软件必须将主控制寄存器(CAN_MCR---CAN master control register)的睡眠模式请求位(SLEEP---Sleep mode request)清零才能退出睡眠模式。
注意: 如果使能唤醒中断(中断使能寄存器(CAN_IER---CAN interrupt enable register) 唤醒中断使能位(WKUIE---Wakeup interrupt enable)置 1),即使 bxCAN 自动执行唤醒序列,一旦检测到 CAN 总线活动,也会发生唤醒中断。
主控制寄存器(CAN_MCR---CAN master control register)的睡眠模式请求位(SLEEP---Sleep mode request)清零后,一旦 bxCAN 与 CAN 总线同步,即会退出睡眠模式,请参见图 225:bxCAN工作模式。一旦硬件将主状态寄存器(CAN_MSR---CAN master status register)的睡眠确认位(SLAK---Sleep acknowledge)清零,即会退出睡眠模式。