我们的CAN控制器支持最高的通讯速率为1Mb/s,可以自动地接收和发送CAN报文,支持使用标准ID和扩展ID地报文,外设中具有3个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间,具有两个3级深度的接收FIFO,可使用过滤功能只接受或不接收某些ID号,可配置成自动重发,不支持使用DMA进行数据收发。
在上图中,我们可以发现STM32是有两组CAN,其中这个CAN1是主设备,我们这个CAN2是从设备,其中这个"存储器访问控制器"是由CAN1控制的,要是我们的CAN2想使用的话,我们就要打开CAN1的外设时钟才可以使用,
第一个是控制内核,第二个是发送邮箱,第三个是接收FIFO,第四个是验收筛选器。
下面我们就对这个几个部分分别介绍一下了
1.CAN控制内核
在CAN的控制内核中,包含着各种控制寄存器和状态寄存器,这次我们主要学习一下其中的主控制寄存器CAN_MCR以及位时序寄存器CAN_BTR。
主控制寄存器CAN_MCR
主控制器寄存器CAN_MCR负责管理CAN的工作模式,它使用以下寄存器位实现控制。
(1)DBF调试冻结功能
使用这个可设置我们CAN处于工作状态或禁止收发的状态,处于程序调试的时候才使用的。
置0的话就表示我们CAN处于工作状态
置1的话就表示我们CAN处于接收/发送冻结状态。接收FIFO仍可正常访问/控制
(2)TTCM时间触发模式
这个是用于配置CAN的时间触发通信模式,在此模式下,CAN使用它内部定时器产生时间戳,并把它保存在CAN_RDTxR , CAN_TDTxR寄存器中。内部定时器在每个CAN位时间累加,在接收和发送的帧起始位被采样,并生成时间戳。利用这个可以实现ISO 11898-4CAN标准的分时同步通信功能。
(3)ABOM自动离线管理
它用于设置是否使用自动离线管理功能,当节点检测到它发送错误或接收错误超过一定值时,会自动进入离线状态,在离线状态中,CAN不能接收或发送报文。处于离线状态的时候,可以软件控制恢复或者直接使用这个自动离线管理功能,它会在适当的时候自动恢复。
(4)AWUM自动唤醒
CAN外设可以使用软件进入低功耗的睡眠模式,如果使能这个自动唤醒功能,当CAN检测到总线活动的时候会自动唤醒。
(5)NART自动重传
设置了这个动能后,当报文发送失败时会自动重传至成功为止。若不使用这个功能,消息只发送一次。
(6)RFLM锁定模式
该功能用于锁定接收FIFO,锁定后,当接收FIFO溢出时,会丢弃下一个接收的报文。
如果不锁定,我们下一个接收的报文会覆盖原来报文。
(7)TXFP报文发送优先级的判定方法
当CAN外设的发送邮箱中有多个待发送报文时,本功能可以控制它是根据报文的ID优先级还是报文存进邮箱的顺序来发送。
位时序寄存器(CAN_BTR)及波特率
CAN_BTR寄存器可用于配置测试模式,波特率以及各种位内的段参数
(1)测试模式
为方便调试,STM32的CAN提供了测试模式,我们配置位时序寄存器CAN_BTR的SILM和LBKM寄存器位可以控制使用正常模式,静默模式,回环模式,及静默回环模式。
如上图,各种模式介绍如下:
1.正常模式
正常模式下就是一个正常的CAN节点,可以向总线发送数据和接收数据。
2.静默模式
在静默模式下,它自己的输出端的逻辑0会直接传输到它自己的输入端,逻辑1可以被发送到总线,所以它是不能向总线发送显性位(逻辑0),只能发送隐性位(逻辑1).输入端可以从总线接收内容.;由于它只发送隐性位不会强制影响总线的状态,所以我们称它为静默模式.
这种模式一般用于监测,它可以分析总线上的流量,但又不会因为发送显性位而影响总线.
3.回环模式
回环模式下,它自己的输出端的所有内容都直接传输到自己的输入端,输出端的内容同时也会被传输到总线上,即也可使用总线监测它的发送内容.输入端只接受自己发送端的内容,不接收来自总线上的内容.可以使用回环模式可以进行自检.
4.回环静默模式
这是回环模式和静默模式的结合,自己输出的端的所有内容都直接传输到自己的输入端,并且不会向总线发送显性位影响总线,不能通过总线监测它的发送内容,输入端只接受自己发送端的内容,不接收来自总线上的东西.这种方式一般在"热自检"时使用,即自我检查的时候,不会干扰总线
以上的四种模式都是不用修改硬件接线的.
(2)位时序及波特率
STM32外设定义的位时序和我们前面解释的CAN标准时序有一点区别,
STM32的CAN外设位时序中只包含3段,分别是同步段SYNC_SEG,位段BS1及位段BS2,这个BS1段可以理解成前面介绍的PTS段与PBS1段合在一起的.
采样点位于BS1和BS2段的交界处,其中同步段SYNC_SEG固定为1Tq,而这个BS1和BS2段可以在位时序寄存器CAN_BTR设置它们的时间长度,它们可以在重新同步期间增长或缩短,该长度SJW也可在位时序寄存器中配置.
了解了位时序以后,我们就可以配置波特率了.通过配置位时序寄存器CAN_BTR的的TS1[3:0]以及TS2[2:0]寄存器位设定BS1及BS2段的长度后,我们就可以确定每个CAN数据位的时间:
BS1段时间:
Ts1 = Tq ✖ (TS1[3:0]+1),
BS2段时间:
Ts2 = Tq ✖ (TS2[3:0]+1),
一个数据位的时间:
T1bit = 1Tq+Ts1+Ts2 = 1+(TS1[3:0]+1)+(TS2[2:0]+1) = NTq
其中这个Tq时间片的长度与CAN外设的所挂载的时钟总线及分频器配置有关,CAN1和CAN2外设都是挂载在APB1总线上,而我们CAN_BTR中的BRP[9:0]寄存器位可以设置CAN外设时钟的分频值,所以:
Tq = (BRP[9:0]+1)✖Tpclk
其中的PCLK指APB1时钟,默认值为45Mhz.
最终可以计算出CAN通讯的波特率:
BaudRate = 1/N Tq;
如下表有一种波特率为1Mbps的方式,说明了一种把波特率配置为1Mbps的方式
理解一下就是 总的 9Tq, 45Mhz 拿来5分频就是9Mhz,波特率就是9Tq除以9Mhz等于1Mbps.
(3)CAN发送邮箱
我们STM32一共有3个发送邮箱,即最多可以缓存3个待发送的报文,
在每个发送邮箱中包含标识符寄存器CAN_TIxR,数据长度控制寄存器CAN_TDTxR及2个数据寄存器CAN_TDLxR,CAN_TDHxR,它们的功能见表发送邮箱的寄存器
当我们要使用CAN外设发送报文时,把报文的各个段分解,按位置写入到这些寄存器中,并对标识符寄存器CAN_TIxR中的发送请求寄存器位TMIDxR_TXRQ置1,即可把数据发送出去.
其中标识寄存器CAN_TIxR 将它的TXRQ置1 就可以发送出去数据,有一个地方比较特殊,就是当IDE置0的时候就是标准标识符,置1的时候就是扩展标识符,我们在标准标识符的时候因为总位数是11位数据,所以我们这个CAN_TIxR的寄存器只用在前11位,当我们是扩展标识符的时候,我们总位数是29位,所以就前29位完整的用起来了.
(4)CAN接收FIFO
看在我们STM32的CAN外设有两个接收FIFO,每个FIFO中有3个邮箱,即最多可以缓存6个接收到的报文,当接收到报文时,FIFO的报文计数器会自增,而我们STM32内部读取FIFO数据之后,报文计数器会自减,我们通过状态寄存器可获知报文计数器的值,
和发送邮箱类似,每个接收FIFO中包含有标识寄存器CAN_RIxR,数据长度控制寄存器CAN_RDTxR及2个数据寄存器CAN_RDLxR,CAN_RDHxR,它们的功能如下图
我们读取这些寄存器的值即可把接收到的报文加载到STM32的内存中
(5)验收筛选器
我们一共28个筛选器组,每个筛选器组有2个寄存器,CAN1和CAN2公用的筛选器.
在CAN协议中,消息的标识符与节点地址无关,但是和消息内容有关.因此,发送节点将报文广播给所有接收器时,接收节点会根据报文标识符的值来确定软件是否需要该消息,
为了简化软件的工作.STM32的CAN外设接收报文前会先使用验收筛选器检查,只接收需要的报文到FIFO中.
筛选器工作的时候,可以调整筛选ID的长度以及过滤模式.根据筛选ID长度来分类有以下两种:
(1)检查STDID[10:0],EXTID[17:0],IDE和RTR位,一共31位
(2)检查STDID[10:0],RTR,IDE和EXTID[17:15],一共16位
通过配置筛选尺度寄存器CAN_FSIR的FSCx位可以设置筛选器工作在哪个尺度
而根据过滤的方法分为以下两种模式:
(1)标识符列表模式,它要把接收报文的ID列成一个表,要求报文ID与列表中的某一个标识符完全相同才可以接收,白名单管理
(2)掩码模式,它把可接受收报文ID的某几位作为列表,这几位被称为掩码,可以理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到FIFO
通过配置筛选尺度寄存器CAN_FSIR的FBMx位可以设置筛选器工作在哪个模式
具体全部总结如下图
每组筛选器包含2个32位的寄存器,分别位CAN_FxR1和CAN_FxR2,他们用来存储要筛选的ID或掩码,各个寄存器位代表的意义与下图所示一致
我们举个例子,大概理解一下
就像这个表格,
在掩码模式下的时候,第一个寄存器存储的就是要筛选的ID,第二个寄存器存储的掩码,
这个掩码为1的地方,表示该位必须与ID中的内容一样,而0的话就是表示该位可以是0也可以是1
最后筛选的ID 就是第三行所示
如果是标识符模式,2个寄存器存储的都是要筛选的ID,不一样的直接丢弃掉.