推荐阅读:【stm32f407】CAN总线_Wireless_Link的博客-CSDN博客
1. CAN寄存器
1.1 can波特率寄存器
根据图中信息,tPCLK = 1/APB1_CLK;所以can波特率的计算公式如下:
CAN_Baudrate = 1/(tq + tBS1 + tBS2) = 1/(tq*(1 + CAN_BS1 + CAN_BS2))
CAN_Baudrate = APB1_CLK / CAN_Prescaler / (1 + CAN_BS1 + CAN_BS2)
参考:STM32中CAN波特率的计算_Nan_Key的博客-CSDN博客_stm32can波特率计算
CAN_BS1和CAN_BS2是设置CiA(采样点)的,而CiA是影响can通信稳定性的。
CiA计算方式:(1+CAN_BS1)/(1+CAN_BS1+CAN_BS2)
CiA推荐值表 | |
---|---|
CiA | 波特率 |
75% | >800K |
80% | >500K |
87.5% | <=500K |
1.2 can过滤器
1.2.1 接收过滤器
- 互联型产品中有28个位宽可变/可配置的标示符过滤器组;其它f103系列中有14个位宽可变/可配置的标示符过滤器组;
- 每个过滤器组x由2个32位寄存器, CAN_FxR0和CAN_FxR1组成
- 可变的位宽
每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:- 1个32位过滤器,包括: STDID[10:0]、 EXTID[17:0]、 IDE和RTR位
- 2个16位过滤器,包括: STDID[10:0]、 IDE、 RTR和EXTID[17:15]位
- 此外,过滤器可配置为屏蔽位模式或标志符列表模式
- 在屏蔽位模式下,由标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。
例如:屏蔽位寄存器位为0,表示对应标志符寄存器的位不用关心;屏蔽位寄存器为1,表示标志位寄存器的位一定要为1; - 在标识符列表模式下,每个Bank可以是过滤2个(29b)或4个ID(14b), 使用的时候可以分别填写不同的值。
不过需要注意的是, 如果仅需要过滤1个ID(29b)的时候或者仅需要过滤1-3个ID(14b)的时候,应该使用这个ID将该Bank 的其他寄存器填满。
- 在屏蔽位模式下,由标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。
- 注意
对于标识符列表模式下的过滤器(非屏蔽方式的过滤器),软件不需要直接跟标识符进行比较。
对于屏蔽位模式下的过滤器,软件只须对需要的那些屏蔽位(必须匹配的位)进行比较即可。
1.2.2 标示符过滤
1.2.3 过滤器寄存器CAN_FMR
2. can工作模式
2.1 初始化模式
- 软件对can初始化需要处于初始化模式。CAN_MCR的INRQ位置1请求进入初始化模式,然后等待CAN_MSR的INAK置1就进入了初始化模式。退出则是对CAN_MCR的INRQ位置0。
- 软件对can的初始化至少包括时间特性(CAN_BTR)和控制(CAN_MCR)两个及寄储器;
- can的过滤器组(模式、位宽、FIFO关联、激活和过滤器值);对过滤器值可以在非初始化模式下设置,但模式、位宽则必须在初始化模式设置。
2.2 正常模式
- 正常模式下才能发送和接收报文。软件对CAN_MCR的INRQ位清0请求进入正常模式,然后等待CAN_MSR的INAK置1就进入正常模式。
2.3 睡眠模式
- 在睡眠模式下,can的时钟停止了,但软件可以访问邮箱寄存器。
3. can测试模式
- 对CAN_BTR的SILM或LBKM置1,来选择一种测试模式,只能在初始化模式下修改这两位。
- 选择一种测试模式后通过对CAM_MCR的INRQ清0,来进入测试模式。
3.1 静默模式
- 对CAN_BTR的SILM置1来设置静默模式。可以接收数据帧和远程帧,但只能发出隐性位,不能发送报文。该模式通常用于分析CAN总线的活动。
3.2 环回模式
- 对CAN_BTR的LBKM置1来设置环回模式,改模式下can自发自收,当然过滤器也要设置成可接收自己。
3.3 环回静默模式
- 对CAN_BTR的SILM和LBKM同时置1,该模式用于“热自测试”;
4. MCU处于调试模式时can功能正常运行或处于停止状态
调试模式的can状态依赖于can寄存器CAN_MCR的DBF位和调试配置寄存器DBGMCU_CR中的 DBG_CAN1_STOP 和DBG_CAN2_STOP位。
5. 功能描述
5.1 can发送处理
- 3个发送邮箱,即最多只能缓存3条待发送数据;当邮箱有数据待发送,就不能再对邮箱操作;
- 发送成功时,CAN_TSR的RQCP和TXOK置1;
- 发送失败时,由仲裁引起的就对CAN_TSR的ALST置1;由于发送错误引起的就对TERR置1;
5.2 can接收管理
- 接收到的报文,先缓存在3级邮箱缓存的FIFO中;所谓3级,其实就是可以缓存3条有效的报文;
-
can总共有28个过滤单元,每个过滤单元只能关联一个FIFO;
即如果只使用一个过滤单元,则只能使用一个FIFO,最多只能缓冲3条数据帧;
- 溢出,当接收缓存FIFO中已经有3条报文时,再来一条报文就会溢出;
- 溢出后的处理方式有两种,1是丢弃新收到的报文,2是丢弃最后收到的一条旧报文插入一条新报文;可配置(CAN_MCR的RFLM位)。
5.3 出错管理
- 离线恢复
当TEC大于255时, bxCAN就进入离线状态,同时CAN_ESR寄存器的BOFF位被置’1’。在离线状态下, bxCAN无法接收和发送报文。
如果ABOM位为’1’, bxCAN进入离线状态后,就自动开启恢复过程。
如果ABOM位为’0’,软件必须先请求bxCAN进入然后再退出初始化模式,随后恢复过程才被开启。
6. can1和can2区别
- can1是主,can2是从;
- 由图中信息可知,can1作为主can管理着从can(can2)和sram的通信;can2不能单独访问sram
如果单独使用can2需要注意两点:
- 打开can1时钟,原因看上图;
- can2只能使用14~27过滤器;但普通单片机只有can1且只有0~13号过滤器,互联型才有can2和14~27号过滤器;