stm32_CAN总线知识

发布者:素雅之韵最新更新时间:2019-12-11 来源: eefocus关键字:stm32  CAN总线 手机看文章 扫描二维码
随时随地手机看文章

一、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_CAN总线知识

上一篇:uCos 之 TaskIdle() 注意事项【worldsing笔记】
下一篇:Keil uCos 2.52 stm32 【worldsing笔记】

推荐阅读最新更新时间:2024-11-10 13:38

STM32-ucosii中的串口中断
C/OS中,中断服务子程序要用汇编语言来写。然而,如果用户使用的C语言编译器支持在线汇编语言的话,用户可以直接将中断服务子程序代码放在C语言的程序文件中。 再看《M3权威指南》2.11.2节与9.11节中讲到Cortex-M3在进入异常时自动压栈。。。。返回时自动出栈,再也不需要汇编语言编写了。也就是说我们可以使用C语言来编写中断服务程序。并且省去了上面程序清单的(1)(5)(6). 其实ucos中的终端和裸奔的中断写法基本一致,只是加了几条语句,如下为串口中断的写法: void USART1_IRQHandler(void) { uint8_t RxData; OS_CPU_SR cpu_sr;
[单片机]
STM32开发笔记64: STM32F4 UART4-5移植驱动程序应注意的问题
单片机型号:STM32F407VGT6 使用通用串口驱动程序分别运行UART1和UART4,则UART1正常,UART5不正常,本文解释具体原因。 先看STM32F407VGT6的串口配置情况,如下图所示,串口1、2、3、6为USART(同异步串口),串口4、5为UART(异步串口)。 在启动文件startup_stm32f407xx.s定义的中断矢量入口地址不同,可参看下面程序。 DCD USART1_IRQHandler ; USART1 DCD USART2_IRQHandler ; USA
[单片机]
<font color='red'>STM32</font>开发笔记64: STM32F4 UART4-5移植驱动程序应注意的问题
stm32 以太网启动后再插网线的问题
STM32加lwip, 在启动时没插网线,启动后再插网线,会发现网络功能无法使用,是因为启动过程中初始化网络失败。 这种情况,需要在CubeMX的lwip配置中,允许LWIP_NETIF_LINK_CALLBACK , 在主循环中加入函数 ethernetif_set_link(netif_default); 检查网线是否连接。 然后自己增加回调函数, void ethernetif_notify_conn_changed(struct netif *netif) { /* NOTE : This is function could be implemented in user file w
[单片机]
STM32上模拟Linux自动初始化
Linux中有很多编程思想可以学习,很多大佬把这些思想、机制运用到单片机的编程上。 下文,在STM32上模拟Linux kernel自动初始化流程。 通常我们写程序都是按照这个套路,一个函数一个函数按照顺序逻辑一个一个的执行下去。 如果逻辑非常复杂,涉及的模块比较多,那么这种顺序执行的代码就会比较臃肿,各模块耦合非常紧密。Linux kernel 中,有各种外设驱动,想按照一个顺序逻辑执行下去,几乎是不可能的。 而kenrel 代码能有这么大的代码量,大而不乱,把各层次,各模块有效的分离,而大量的代码又有逻辑的组织在一起,和这个initcall 有至关重要的作用。 通过模仿这种方式,最后把图片中main函数代码清空,分离这
[单片机]
在<font color='red'>STM32</font>上模拟Linux自动初始化
STM32 Systick定时器
Q:什么是SYSTick定时器? SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。 Q:为什么要设置SysTick定时器? (1)产生操作系统的时钟节拍 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 (2)便于不同处理器之间程序移植。 Cortex‐M3处理器内部包
[单片机]
STM32综合网上讲解的几种读保护措施
以下内容是在STM32F103系列单片机实验成功! STM32可以对存储在flash上的程序进行读保护. 启动读保护后,用户就不能再读写程序了. 所以,在烧写程序之前,需要程序调用关闭读保护.关闭读保护后,会自动清空flash上的程序 头文件位于:#include stm32f10x_flash.h 启动保护,用在main()函数初始化时调用: void Set_Protect(void) //启动保护 {   if(FLASH_GetReadOutProtectionStatus() != SET)   {     FLASH_Unlock(); //解锁     FLASH_ReadOutProtection(ENABLE
[单片机]
<font color='red'>STM32</font>综合网上讲解的几种读保护措施
CAN总线如何设计拓扑才最安全?
随着CAN总线的应用越来越广泛,工程师在面对各种不同工况下,如何选择合适的网络拓扑方式就变成了一个让人头疼的问题。这里介绍主流的几种总线拓扑方式,可以帮您完成快速了解进行选择。 一、直线型拓扑 图1 直线型拓扑 直线型拓扑也叫总线型拓扑,如图1所示,所有的节点都接到同一总线上,总线上任意节点发送信息,其他节点都能正常接收。 它的优势包括:  布线施工简单;  阻抗匹配固定规则(首尾各1个120欧电阻匹配);  接线操作简单方便;  由于这些优势,在很多领域里都获得了广泛应用,可以满足大多数领域的应用要求,但是随着行业应用的扩展,逐渐发现了总线型拓扑的缺点,比如:  如果节点数较多,
[嵌入式]
<font color='red'>CAN总线</font>如何设计拓扑才最安全?
STM32(cortex_m3) 的 Bit-Banding 怎样理解
Bit-Banding的意思:对Bit-Band区一个字的操作对应实际存储器中的一位。 在STM32F10xxx的技术参考手册中第2.3.3节,有这样的描述: Cortex-M3存储器映像包括两个位段(bit-band)区。这两个位段区将别名存储器区中的每个字映射到位段存储器区的一个位,在别名存储区写入一个字具有对位段区的目标位执行读-改-写操作的相同效果 。 即M3利用别名区简化了位操作了位段区的位操作(将一般的读-改-写简化为写)。 别名区空间大小是位段区的32倍(因为每1位映射为1字)。 在STM32F10x里存储器映像中包括2个位段区,分别是: SRAM区低1MB 0x2000 0000 - 0x200f ffff
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved