一、CAN外设简介
1、两个 CAN 与 2.0A 和 B (主动)规范兼容,比特率最高达 1 Mbit/s。
2、它们可接收和发送包含11 位标识符的标准帧和包含 29 位标识符的扩展帧。
3、每个 CAN 有三个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间;
4、具有两个3级深度的接收FIFO,28 个共享的可调整筛选器组用于过滤某些ID报文,即可控制只接收或不接收某些ID的报文 (即使只使用一个 CAN,也可使用所有这些)。
5、每个 CAN 都分配有 256 字节的 SRAM。
6、不支持使用DMA进行数据收发。
其中CAN1是主设备,框图中的“存储访问控制器”是由CAN1控制的,CAN2无法直接使用访问存储区域,所以使用CAN2的时候必须使能CAN1外设的时钟。
二、CAN控制内核
CAN控制内核包含了控制和状态寄存器以及筛选器寄存器:
1、主控制寄存器(CAN_MCR)
主控制寄存器 CAN_MCR 负责管理 CAN 的工作模式,它使用以下寄存器位实现控制:
(1) DBF :调试冻结 (Debug freeze)
0:调试期间 CAN 处于工作状态。
1:调试期间 CAN 处于接收/发送冻结状态。禁止收发时仍可正常访问/控制接收 FIFO中的数据。
这两种状态是当 STM32芯片处于程序调试模式时才使用的,平时使用并不影响,我们一般调试时也是需要CAN处于工作状态的,因此这里配置为 0 .
(2)TTCM:时间触发通信模式 (Time triggered communication mode)
0:禁止时间触发通信模式。
1:使能时间触发通信模式。 它用于配置 CAN 的时间触发通信模式,CAN外设内部有个自己的定时器,在使能此模式下,CAN会使用它内部的定时器产生时间戳,并把它保存在CAN_RDTxR、CAN_TDTxR 寄存器中。利用它可以实现 ISO 11898-4 CAN 标准的分时同步通信功能。
CAN外设内部的定时器是16位的,发送时其定时器值存储 CAN_TDTxR 寄存器中 TIME[15:0] 中。在发送帧时,会在进行 SOF(帧起始) 发送时对此字段进行捕获,然后将捕获到的 16 位定时器值作为发送时间戳。
只有硬件处于时间触发通信模式(CAN_MCR 寄存器的 TTCM 位置 1)时,TGT 位才会被激活。 该位激活就代表着:在发送帧中包含的数据时,会将 8 个字节数据的最后两个数据字节替换为发送时间戳 TIME[15:0] 的值。即数据字节 7 替换为TIME[7:0],数据字节 6 替换为TIME[15:8]。注意:DLC 必须编程为 8,才能通过 CAN 总线发送这两个字节。
在接收时,CAN_RDTxR寄存器中的 TIME[15:0] 存储着定时器的值,在检测 SOF(帧起始)时就会捕获此字段的值将其作为接收时间戳。
(3)ABOM :自动的总线关闭管理 (Automatic bus-off management)
当节点检测到它发送错误或接收错误超过一定值时,会自动进入离线状态,在离线状态中,CAN不能接收或发送报文。处于离线状态的时候,可以软件控制恢复或者直接使用这个自动离线管理功能。
置 0 时,需要软件先发出一个请求后,一旦监测到 128 次连续 11 个隐性位,并且软件将 CAN_MCR 寄存器的 INRQ 位先置 1 再清零,即退出离线状态。 置 1 时,一旦监测到 128 次连续 11 个隐性位,即通过硬件自动退出离线状态。
(4)AWUM : 自动唤醒模式 (Automatic wakeup mode)
此位控制 CAN 硬件在睡眠模式下接收到消息时的行为。
0:通过软件将 CAN_MCR 寄存器的 SLEEP 位清零后,退出睡眠模式。
1:一旦监测到 CAN 消息,即通过硬件自动退出睡眠模式。
(5)NART : 禁止自动重发送 (No automatic retransmission)
0:CAN 硬件将自动重发送消息,直到根据 CAN 标准消息发送成功。
1:无论发送结果如何(成功、错误或仲裁丢失),消息均只发送一次。
(6)RFLM : 接收 FIFO 锁定模式 (Receive FIFO locked mode)
0:接收 FIFO 上溢后不锁定。接收 FIFO 装满后,下一条传入消息将覆盖前一条消息。
1:接收 FIFO 上溢后锁定。接收 FIFO 装满后,下一条传入消息将被丢弃。
(7)TXFP : 发送 FIFO 优先级 (Transmit FIFO priority)
此位用于控制在几个邮箱同时挂起时的发送顺序。
0:优先级由消息标识符确定
1:优先级由请求顺序(时间顺序)确定
二、位时序与波特率
1、位时序
STM32外设定义的位时序与我们前面解释的 CAN 标准时序有一点区别:
STM32的 CAN外设位时序中只包含 3段,分别是同步段 SYNC_SEG、位段 BS1 及位段 BS2:
同步段 (SYNC_SEG):位变化应该在此时间段内发生。它只有一个时间片的固定长度(1 x tq)。
位段 1 (BS1):定义采样点的位置。它包括 CAN 标准的 PROP_SEG 和 PHASE_SEG1。其持续长度可以在 1 到 16 个时间片之间调整,但也可以自动加长,以补偿不同网络节点的频率差异所导致的正相位漂移。
位段 2 (BS2):定义发送点的位置。它代表 CAN 标准的 PHASE_SEG2。其持续长度可以在 1 到 8 个时间片之间调整,但也可以自动缩短,以补偿负相位漂移。
再同步跳转宽度 (SJW): 定义位段加长或缩短的上限。它可以在 1 到 4 个时间片之间调整。
2、波特率
单个时间片的长度 Tq与 CAN外设的所挂载的时钟总线及分频器配置有关,CAN1和 CAN2 外设都是挂载在 APB1总线上的,而位时序寄存器 CAN_BTR中的 BRP[9:0]寄存器位可以设置 CAN外设时钟的分频值 ,所以:Tq = (BRP[9:0]+1) x T PCLK ;其中的 PCLK指 APB1时钟。
三、CAN发送邮箱
CAN外设一共有三个发送邮箱,即最多可以缓存3个待发送的报文。每个发送邮箱中包含有标识符寄存器 (CAN_TIxR)、数据长度控制和时间戳寄存器 (CAN_TDTxR)、数据低位寄存器 (CAN_TDLxR) 、邮箱数据高位寄存器 (CAN_TDHxR)。
四、CAN接收FIFO
CAN外设一共有2个接收FIFO,每个FIFO中有3个接收邮箱,即最多可以缓存6个接收到的报文。当接收到报文后时,FIFO的报文计数器会自增,而STM32内部读取FIFO数据之后,报文计数器会自减,通过状态寄存器可获知报文计数器的值,而通过前面主控制寄存器的文章来源:https://www.toymoban.com/news/detail-606500.html
文章来源地址https://www.toymoban.com/news/detail-606500.html
到了这里,关于STM32——CAN的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!