STM32的CAN应用指南

发布者:数字火花最新更新时间:2015-09-08 来源: eefocus关键字:STM32  CAN  应用指南 手机看文章 扫描二维码
随时随地手机看文章
CAN基本知识:

CAN协议的特点:

1、  多主机控制。在总线空闲时,所有单元都可以发送消息,若两个以上同时开始发送消息,根据标识符来决定优先级。优先级高的先发送。

2、  系统的若软性。与总线相连的单元没有类似地址的信息。因此在总线上增加单元时,应用层程序基本不需要改变。

3、  通信速度快,通信距离远。最高1Mbps(距离小于40M),最远可达10Km(速率低于5Kbps)。

4、  具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误,检测出错误的单元会立即同时通知其他所有单元,正在发送消息的单元一旦检测出错误,会强制结束当前的发送。前置结束发送的单元会不断反复地重新发送该消息直到发送成功。

5、  故障封闭功能。CAN可以判断出错误的类型是总线上的数据错误还是持续的数据错误。由此功能,当总线上发生持续数据错误时,可以将引起此故障的单元从总线上隔离出去。

6、  连接节点多。CAN总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。单实际上受到时间延迟和电气负载的限制。降低通信速度,可连接单元增加。反之,反之。

 

STM32的CAN 时间特性(有关波特率):

与CAN2.0B的协议内容相比,STM32的CAN时间特性稍微有些区别。STM32把传播时间段和相位缓冲段1合并了,因此STM32的CAN一个位只有3段:同步段(SYNC_SEG)、时间段1(BS1)和时间段2(BS2)。STM的BS1段可以设置为1-16个时间单元,刚好等于传播时间段和相位缓冲段1之和。

波特率=1/正常的位时间

正常的位时间=1×tq+tbs1+tbs2

其中:tbps1=tq×(TS1[3:0]+1)

           tbps2=tq×(TS2[3:0]+1)

      tq=(BRP[9:0]+1)×tpclk

                   tq是一个时间单元

                   tpclk是APB时钟的时间周期

因此,我们只需要知道BS1和BS2的设置,以及APB1的时钟频率(一般为36MHz),就可以方便的计算出波特率。比如设置TS1=6,TS2=7和BRP=4,在APB1频率为36MHz的条件下,即可得到CAN通信的波特率=36000/[(7+8+1)*5]=450Kbps。

要用到的寄存器:

主控制寄存器CAN_MCR:控制进退初始化,发送FIFO优先级。

时序寄存器CAN_BTR:用来设置分频、Tbps、Tbs2以及Tsjw等非常重要的参数,直接决定了CAN的波特率。另外还可以设置工作模式(静默模式、环回模式)等。

发送邮箱标识符寄存器CAN_TIxR:该寄存器用来设置标识符(包括扩展标识符),另外还可以设置帧类型。

发送邮箱数据长度和时间戳寄存器CAN_TDTxR:用来设置数据长度。

发送邮箱低字节数据寄存器CAN_TDLxR:用来存储将要发送的数据,只能存储低4个字节。

发送邮箱高字节数据寄存器CAN_TDHxR:用来存储将要发送的高4个字节。

接收FIFO邮箱标识符寄存器CAN_RIxR:该寄存器用来保存接收到的报文标识符等信息,通过读该寄存器获取相关信息。

接收FIFO邮箱数据长度和时间戳寄存器CAN_RDTxR;接收FIFO邮箱低字节数据寄存器CAN_RDLxR;接收FIFO邮箱高字节数据寄存器CAN_RDHxR,同发送。

过滤器模式寄存器CAN_FM1R:设置各滤波器组的工作模式,对28个滤波器组的工作模式,都可以通过该寄存器设置,不过该寄存器必须在滤波器处于初始化模式下才可以设置。

过滤器位宽寄存器CAN_FS1R:用于设置各滤波器组的位宽。其他同上。

上述两个寄存器用来设置过滤器。

如FSCx=1,FBMx=0:那么其中第x个寄存器组就被设置为1个32位过滤器-标识符屏蔽,此时本滤波器组可以设置成1个过滤器。(见参考手册P432)

如FSCx=1,FBMx=1:那么其中第x个寄存器组就被设置为2个32位过滤器-标识符列表,此时本滤波器组可以设置成2个过滤器。

如FSCx=0,FBMx=1:那么其中第x个寄存器组就被设置为2个16位过滤器-标识符屏蔽,此时本滤波器组可以设置成2个过滤器。

如FSCx=0,FBMx=0:那么其中第x个寄存器组就被设置为4个16位过滤器-标识符列表,此时本滤波器组可以设置成4个过滤器。

28个过滤器组可以被设置为远大于28个过滤器数目。

每个FIFO各自对其关联的过滤器进行编号。过滤器组关联设置通过寄存器CAN_FFA1R即过滤器FIFO关联寄存器来设置。

过滤器激活寄存器CAN_FA1R:该寄存器来控制过滤器的激活与否。1开启0关闭。

过滤器组i的寄存器x CAN_FiRx:用来存放过滤参数。

 

STM32 CAN总线初始化步骤:

1、  配置相关引脚的复用功能,使能CAN时钟。

使能CAN时钟,通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,设置为上拉输入(CAN_RX),设置为复用输出(CAN_TX),并使能PA口的时钟。

2、  设置CAN工作模式及波特率等。

先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其他相关控制位,再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。最后设置INRQ为0,退出初始化模式。

3、  设置滤波器。

设置CAN_FMR的FINIT位,让过滤器组工作在初始化模式下,然后设置滤波器组0的工作模式以及标识符ID和屏蔽为。最后激活滤波器。并退出滤波器初始化模式。如果用到中断,还要配置中断模式。

 

具体的:

 

如何初始化CAN:

1、  使能相关时钟(PORTA时钟,CAN时钟),初始化引脚RX和TX。

2、  设置CAN_MCR,退出睡眠模式,同时设置参数。基本是所有位清零。关于睡眠模式,CAN在复位后都是进入睡眠模式,当然也可以设置自动唤醒模式等。

3、  请求CAN进入初始化模式,对CAN_MSR的位0置1。等待进入初始化,检验MCR位0 INAK的值,当真正变为1的时候,在进行下一步。因为这个过程可能不是瞬间完成的,如果当前有CAN活动,就会等到本次活动结束后再进入初始化模式,硬件对INAK位置1。

4、  设置CAN_MCR的各位,位2-位7。设置位时序寄存器CAN_BTR的各位,在这里可以设置静默模式、环回模式、波特率。

5、  请求CAN退出初始化模式。设置MCR的位0.等待完全退出初始化模式,通过检验MSR的位。

6、  初始化过滤器(初始化寄存器不是在CAN初始化模式下进行的,而是过滤器组工作到初始化模式)。设置过滤器主控寄存器CAN_FMR的位0,使过滤器组工作在初始化模式。

7、  设置过滤器激活寄存器CAN_FA1R来禁用相应的过滤器,因为只有对相应位清零或者对CAN_FME的FINIT位设置位1,才能修改相应的过滤器寄存器CAN_FiRx。

8、  设置过滤器模式CAN_FM1R(标识符屏蔽模式or标识符列表模式);设置过滤器位宽寄存器CAN_FS1R(1个32位的过滤器or2个16位的过滤器);设置过滤器FIFO关联寄存器CAN_FFA1R(过滤器关联到FIFO0还是FIFO1当中)。

9、  填写过滤器标识和屏蔽。通过设置寄存器CAN_FiR1和CAN_FiR2来设置标识(ID)和屏蔽(MASK)。

10、              激活过滤器,CAN_FA1R位0设置为1。

11、              过滤器进入正常工作模式,CAN_FMR位0清零

 

如何发送一个报文:

1、  判断三个邮箱中哪个为空(CAN_TSR的位26 位27 位28),哪个为空用哪个?如果没有空邮箱,则退出本次发送过程。

2、  清除发送邮箱标识符寄存器(因为要填写新的标识符)。

3、  设置发送邮箱的标识符寄存器CAN_TIxR。

4、  设置发送邮箱的数据长度和时间戳寄存器CAN_TDTxR。

5、  填写要发送的数据,即设置发送邮箱高低字节数据寄存器CAN_TDHxR和CAN_TDLxR。

6、  对标识符寄存器CAN_TIxR的位0即TXRQ位置1,来请求发送邮箱的数据。当数据发送完成后,硬件对其清零。

7、  查询发送状态,通过查询发送状态寄存器CAN_TSR。基本查询三个状态参数。位0 RQCP1邮箱0(不一定是0,看使用的是哪个邮箱了)请求完成;位1 TXOK0邮箱0发送成功;位26 发送邮箱0位为空,没有等待发送的报文。当这三项都成功后,返回发送成功。

如何接收一个报文:

1、  查询FIFO里面是否存在有效报文,查询接收FIFO0寄存器CAN_RF0R的位1:0 当前接收FIFO中存放的报文数目。如果有数据,下一步将数据读出。

2、  判断标识符类型,接收来的报文是采用标准标识符还是扩展标识符。CAN_RIxR的位2 IDE。

3、  根据不同类型的标识符来做不同的操作。具体可查看CAN_RIxR的位31:3。扩展标识符低字节存在位20:3。扩展标识符或标准标识符存在位31:21。扩展标识符39位,标准标识符11位。

4、  查询CAN_RIxR的位1 来判定是数据帧还是远程帧。

5、  查询CAN_RDTxR位3:0 获取数据帧的数据长度。

6、  读取接收FIFO邮箱高低字节数据寄存器CAN_RDLxR和CAN_RDHxR。

7、  释放FIFO邮箱。CAN_RF0R的位5。

 

如何使CAN接收工作在中断模式下:

1、  通过寄存器CAN_IER来设置中断使能,正常情况下使用位1,FMPIE0:FIFO0消息挂号中断使能置1。

2、  中断分组

3、  写中断处理函数(较自由)。可以通过设置中断使能来屏蔽有写中断,如果中断都打开的话就需要在中断处理函数里面来进行判断处理。因为每个CAN只有4个主中断,即发送中断、接收FIFO0中断、接收FIFO1中断和SCE中断。

关键字:STM32  CAN  应用指南 引用地址:STM32的CAN应用指南

上一篇:keil中调试中无法添加变量到watch
下一篇:STM32的CAN应用尝试

推荐阅读最新更新时间:2024-03-16 14:30

STM32 USB CDC 驱动问题
问题: STM32的 USB CDC 工程使用STM32Cube 生成,编译下载后,插上USB发现如下图问题: 在设备管理器显示黄色感叹号,驱动不正常。 原因: 由于SMT32 USB 部分的代码用到了 malloc 和 free 这种标准库(#include 解决: 将STM32 工程中的startup_stm32fxxxxx.s 启动文件里的 Heap_Size 改大点,我这里设置Heap_Size为 0x400后,USB工作正常,收发数据OK。 这时PC设备管理器中的 USB CDC设备已经枚举成功,如下图: 建议: 在单片机这种不带MMU的平台上编程时,尽量少用 标准库
[单片机]
<font color='red'>STM32</font> USB CDC 驱动问题
STM32利用Flymcu进行烧录
烧录教程 刻录也叫烧录,就是把数据通过刻录机等工具刻制到光盘,烧录卡(GBA)等介质中,即大家说的下载。目前大家手中没有J-link和ST-link等其他仿真器,只能用串口烧录的仿真软件FlyMcu。 提前在A盘(资料盘)解压后,找到它 因为他是利用串口烧录的,就要下载串口的驱动。 1.串口驱动安装 驱动同样在A盘(资料盘),路径如下: 点击setup。 接着我们在STM32上USB_TTL处插入USB线,并连接上电脑,如果之前没有安装过CH340的驱动(如果安装过,则应该在设备管理器看到USB串口, 如果不能则先卸载之前的驱动,卸载完后重启电脑,再重新安装),则电脑会提示找到新硬件。 不用理会这个提示,直接
[单片机]
<font color='red'>STM32</font>利用Flymcu进行烧录
STM32串口如何代码实现更稳定的接收消息
在 《STM32串口向世界问好》介绍过如何发送消息,那么又如何接收消息呢? 也很简单,只需要配置好串口接收,配置好中断,并在串口中断函数里面进行数据接收就可以了。通用配置代码如下: /** * @brief 初始化IO 串口1 * @param bound:波特率 * @retval None */void USART1_Debug_Init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;
[单片机]
<font color='red'>STM32</font>串口如何代码实现更稳定的接收消息
CAN总线技术在工业码垛机器人控制系统中的应用研究
目前在用的工业码垛机器人种类繁多,但根据其多轴控制系统的技术特点一般可分为三种类型:1)基于PLC的多轴控制系统;2)基于PC的多轴控制系统;3)基于总线的多轴控制系统。其中,总线控制系统具有数字信号传输、系统完全开放等优点,得到广泛的应用。笔者通过研究发现,基于现场总线,尤其是CAN总线的工业码垛机器人在实际应用中具有便于组网、性价比高、扩展性强等特点,在大工业生产中具有广阔的发展前景。 工业码垛机器人 笔者所在科研团队开发的新型工业码垛机器人(机构简图如图1所示),其主体机械结构是基于平衡吊原理的七杆机构,具有承载力大、稳定性好、结构紧凑、节省能耗等特点。机器人的动力由四台交流伺服电机提供,分别负责机器人沿水平方向、沿垂直方
[工业控制]
<font color='red'>CAN</font>总线技术在工业码垛机器人控制系统中的<font color='red'>应用</font>研究
基于嵌入式系统原型设计的STM32开放式开发环境详解
市场上涌现各种价格亲民的经济型微控制器,助力新一代开发者创造令人兴奋的新型嵌入式应用。如今的开发工具非常好用,软硬件均呈现模块化趋势,插接安装简单容易,使得产品设计评估和原型开发周期大幅缩短。STM32开放式开发环境是业内独一无二的软硬件开发平台,堆叠式插接电路板集成各种模块化硬件,同时模块化软件覆盖从驱动程序到应用层的全部软件,帮助设计人员将创意快速变成产品原型,顺利转化成最终设计。 STM32开放式开发环境是什么? STM32开放式开发环境 是意法半导体开发的嵌入式系统原型设计开发环境,以简化嵌入式项目设计为目标,通过开源形式提供全部重要功能模块,组件包括: -价格极低的STM32 Nucleo开发板(STM32微控制
[单片机]
基于嵌入式系统原型设计的<font color='red'>STM32</font>开放式开发环境详解
几步实现stm32上面移植mqtt
最近项目需要,stm32上面使用到mqtt了,百度了下,发现网上资料还是挺少的,虽然有几份相关的资料,下载下来之后,看到了mqtt的底层代码竟然还有错误,这个问题导致了我后面一直调试不通,后来,我直接从官方下载了mqtt的源码用比较器比较后找到了原因,最后果断将官方的mqtt底层代码移植上来,mqtt的发布还是比较顺利,订阅虽然可以收到消息,但是由于没有移植os,发布消息时,订阅接受有时无法收到消息,这个还在优化,我使用的是stm32f103c8t6平台+w5500.其实只要带以太网接口就行。 首先我们从mqtt官方下载源码 http://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.e
[单片机]
STM32标准库、HAL库特点与应用
新手在入门STM32的时候,一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。 对于刚入门的朋友可能没法直观了解这些不同开发发方式彼此之间的区别,本文试图以一种非常直白的方式,用自己的理解去将这些东西表述出来。 配置寄存器 不少先学了51的朋友可能会知道,会有一小部分人或是教程是通过汇编语言直接操作寄存器实现功能的,这种方法到了STM32就变得不太容易行得通了。 因为STM32的寄存器数量是51单片机的十数倍,如此多的寄存器根本无法全部记忆,开发时需要经常的翻查芯片的数据手册,此时直接操作寄存器就变得非常的费力了。也有人喜欢去直接操作寄存器,因为这样更接近原理,代码更少,知其然也知其所以然。
[单片机]
<font color='red'>STM32</font>标准库、HAL库特点与<font color='red'>应用</font>
如何使用STM32实现systick的精确延时
SYSTICK寄存器初始化 void SysTick_Configuration(void) { if (SysTick_Config(SystemCoreClock / 100)) { while (1); } NVIC_SetPriority(SysTick_IRQn, 0x0); } SysTick_Config默认时钟为SysTick_CLKSource_HCLK,所以在这之前使用SysTick_CLKSourceConfig()选择系统时钟不会改变systick的时钟 static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks 》 Sys
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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