×
单片机 > 单片机程序设计 > 详情

stm32_CAN总线知识

发布时间:2020-06-09 发布时间:
|

一、CAN总线的特点:


bxCAN主要特点


● 支持CAN协议2.0A和2.0B主动模式

● 波特率最高可达1兆位/秒

● 支持时间触发通信功能

发送

● 3个发送邮箱

● 发送报文的优先级特性可软件配置

● 记录发送SOF时刻的时间戳

接收

● 3级深度的2个接收FIFO

● 可变的过滤器组:

─ 在互联型产品中,CAN1和CAN2分享28个过滤器组

─ 其它STM32F103xx系列产品中有14个过滤器组

● 标识符列表

● FIFO溢出处理方式可配置

● 记录接收SOF时刻的时间戳

时间触发通信模式

● 禁止自动重传模式

● 16位自由运行定时器

● 可在最后2个数据字节发送时间戳

管理

● 中断可屏蔽

● 邮箱占用单独1块地址空间,便于提高软件效率

双CAN

● CAN1:是主bxCAN,它负责管理在从bxCAN和512字节的SRAM存储器之间的通信

● CAN2:是从bxCAN,它不能直接访问SRAM存储器

● 这2个bxCAN模块共享512字节的SRAM存储器

注:在中容量和大容量产品中,USB和CAN共用一个专用的512字节的SRAM存储器用于数据的发送和接收,因此不同同时使用USB和CAN(共享的SRAM被USB和CAN模块互斥地访问)。USB和CAN可以同时用于一个应用中但不能在同一个时间使用。


CAN总线的拓扑结构 CAN控制器是stm32芯片自带的,CAN收发器是专门外接的芯片,野火的开发板上是带的TJA1050


stm32 互联型产品的双CAN框图:

发送报文流程:


应用程序选择1个空置的发送邮箱;设置标识符,数据长度和待发送数据;然后对CAN_TIxR寄存器的TXRQ位置’1’,来请求发送。TXRQ位置’1’后,邮箱就不再是空邮箱;而一旦邮箱不再为空置,软件对邮箱寄存器就不再有写的权限。TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的邮箱,参见发送优先级。一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。一旦邮箱中的报文被成功发送后,它马上变为空置邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一次成功发送。如果发送失败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置’1’,由于发送错误引起的就对TERR位置’1’。


发送报文的优先级:


由标识符决定

当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根据CAN协议,标识符数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号小的报文先被发送。

由发送请求次序决定

通过对CAN_MCR寄存器的TXFP位置’1’,可以把发送邮箱配置为发送FIFO。在该模式下,发送的优先级由发送请求次序决定。该模式对分段发送很有用。

接收管理

接收到的报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。


有效报文

根据CAN协议,当报文被正确接收(直到EOF域的最后一位都没有错误),且通过了标识符过滤,那么该报文被认为是有效报文

FIFO管理

FIFO从空状态开始,在接收到第一个有效的报文后,FIFO状态变为挂号_1(pending_1),硬件相应地把CAN_RFR寄存器的FMP[1:0]设置为’01’(二进制01b)。软件可以读取FIFO输出邮箱来读出邮箱中的报文,然后通过对CAN_RFR寄存器的RFOM位设置’1’来释放邮箱,这样FIFO又变为空状态了。如果在释放邮箱的同时,又收到了一个有效的报文,那么FIFO仍然保留在挂号_1状态,软件可以读取FIFO输出邮箱来读出新收到的报文。


如果应用程序不释放邮箱,在接收到下一个有效的报文后,FIFO状态变为挂号_2(pending_2),硬件相应地把FMP[1:0]设置为’10’(二进制10b)。重复上面的过程,第三个有效的报文把FIFO变为挂号_3状态(FMP[1:0]=11b)。此时,软件必须对RFOM位设置1来释放邮箱,以便FIFO可以有空间来存放下一个有效的报文;否则,下一个有效的报文到来时就会导致一个报文的丢失。为挂号_3状态(FMP[1:0]=11b)。此时,软件必须对RFOM位设置1来释放邮箱,以便FIFO可以有空间来存放下一个有效的报文;否则,下一个有效的报文到来时就会导致一个报文的丢失。


报文的溢出:


当FIFO处于挂号_3状态(即FIFO的3个邮箱都是满的),下一个有效的报文就会导致溢出,并且一个报文会丢失。此时,硬件对CAN_RFR寄存器的FOVR位进行置’1’来表明溢出情况。至于哪个报文会被丢弃,取决于对FIFO的设置:

● 如果禁用了FIFO锁定功能(CAN_MCR寄存器的RFLM位被清’0’),那么FIFO中最后收到的报文就被新报文所覆盖。这样,最新收到的报文不会被丢弃掉。

● 如果启用了FIFO锁定功能(CAN_MCR寄存器的RFLM位被置’1’),那么新收到的报文就被丢弃,软件可以读到FIFO中最早收到的3个报文。

接收相关的中断

一旦往FIFO存入一个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位为’1’,那么就会产生一个中断请求。当FIFO变满时(即第3个报文被存入),CAN_RFR寄存器的FULL位就被置’1’,并且如果CAN_IER寄存器的FFIE位为’1’,那么就会产生一个满中断请求。在溢出的情况下,FOVR位被置’1’,并且如果CAN_IER寄存器的FOVIE位为’1’,那么就会产生一个溢出中断请求。


标识符过滤

在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者乙广播的形式把报文发送给所有的接收者。节点在接收报文时-根据标识符的值-决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。在stm32普通产品中提供了14个位宽可变、可配置的过滤器(0~13),而互联产品则提供了28个位宽可变、可配置的过滤器(0~27),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。

过滤器可配置为,屏蔽位模式和标识符列表模式。

屏蔽位模式

在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。

标识符列表模式

在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。


过滤器组位宽和模式的设置

过滤器组可以通过相应的CAN_FMR寄存器配置。在配置一个过滤器组前,必须通过清除CAN_FAR寄存器的FACT位,把它设置为禁用状态。通过设置CAN_FS1R的相应FSCx位,可以配置一个过滤器组的位宽。通过CAN_FMR的FBMx位,可以配置对应的屏蔽/标识符寄存器的标识符列表模式或屏蔽位模式。

为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。

为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。

应用程序不用的过滤器组,应该保持在禁用状态。

过滤器组中的每个过滤器,都被编号为(叫做过滤器号)从0开始,到某个最大数值-取决于过滤器组的模式和位宽的设置。


过滤器优先级规则

根据过滤器的不同配置,有可能一个报文标识符能通过多个过滤器的过滤;在这种情况下,存放在接收邮箱中的过滤器匹配序号,根据下列优先级规则来确定:

● 位宽为32位的过滤器,优先级高于位宽为16位的过滤器

● 对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式

● 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高


位时间特性

简单的说就是在can寄存器配置的时候对于寄存器CAN_CJW、CAN_BS1、CAN_BAS2的设置值,以及CAN_Prescaler的设置,


波特率=clk/(CAN_CJW+CAN_BS1+CAN_BAS2)/CAN_Prescaler。


以上就是CAN总线的部分知识,还有一些没有粘贴在这里,可以在stm32手册中查找,另外对于can寄存器的设置都是以上介绍的代码实现,因此在寄存器设置中有不理解的地方可以参考can总线的介绍。

关键字:stm32  CAN总线 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32 USB HID 键盘