收藏 分享(赏)

STM32的CAN总线使用指南.docx

上传人:hyngb9260 文档编号:6371399 上传时间:2019-04-09 格式:DOCX 页数:4 大小:21.76KB
下载 相关 举报
STM32的CAN总线使用指南.docx_第1页
第1页 / 共4页
STM32的CAN总线使用指南.docx_第2页
第2页 / 共4页
STM32的CAN总线使用指南.docx_第3页
第3页 / 共4页
STM32的CAN总线使用指南.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、CAN 基本知识:CAN 协议的特点:1、 多主机控制。在总线空闲时,所有单元都可以发送消息,若两个以上同时开始发送消息,根据标识符来决定优先级。优先级高的先发送。2、 系统的若软性。与总线相连的单元没有类似地址的信息。因此在总线上增加单元时,应用层程序基本不需要改变。3、 通信速度快,通信距离远。最高 1Mbps(距离小于 40M) ,最远可达 10Km(速率低于5Kbps) 。4、 具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误,检测出错误的单元会立即同时通知其他所有单元,正在发送消息的单元一旦检测出错误,会强制结束当前的发送。前置结束发送的单元会不断反复地重新发送该消息直到

2、发送成功。5、 故障封闭功能。CAN 可以判断出错误的类型是总线上的数据错误还是持续的数据错误。由此功能,当总线上发生持续数据错误时,可以将引起此故障的单元从总线上隔离出去。6、 连接节点多。CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。单实际上受到时间延迟和电气负载的限制。降低通信速度,可连接单元增加。反之,反之。STM32 的 CAN 时间特性(有关波特率):与 CAN2.0B 的协议内容相比, STM32 的 CAN 时间特性稍微有些区别。STM32 把传播时间段和相位缓冲段 1 合并了,因此 STM32 的 CAN 一个位只有 3 段:同步段(SYNC_S

3、EG) 、时间段 1(BS1)和时间段 2(BS2) 。STM 的 BS1 段可以设置为 1-16 个时间单元,刚好等于传播时间段和相位缓冲段 1 之和。波特率=1/ 正常的位时间正常的位时间=1tq+tbs1+tbs2其中:tbps1=tq (TS13:0+1)tbps2=tq(TS23:0+1)tq=(BRP9:0+1)tpclktq 是一个时间单元tpclk 是 APB 时钟的时间周期因此,我们只需要知道 BS1 和 BS2 的设置,以及 APB1 的时钟频率(一般为 36MHz) ,就可以方便的计算出波特率。比如设置 TS1=6,TS2=7 和 BRP=4,在 APB1 频率为 36M

4、Hz 的条件下,即可得到 CAN 通信的波特率=36000/(7+8+1)*5=450Kbps。要用到的寄存器:主控制寄存器 CAN_MCR:控制进退初始化,发送 FIFO 优先级。时序寄存器 CAN_BTR:用来设置分频、Tbps、Tbs2 以及 Tsjw 等非常重要的参数,直接决定了 CAN 的波特率。另外还可以设置工作模式(静默模式、环回模式)等。发送邮箱标识符寄存器 CAN_TIxR:该寄存器用来设置标识符(包括扩展标识符) ,另外还可以设置帧类型。发送邮箱数据长度和时间戳寄存器 CAN_TDTxR:用来设置数据长度。发送邮箱低字节数据寄存器 CAN_TDLxR:用来存储将要发送的数据

5、,只能存储低 4 个字节。发送邮箱高字节数据寄存器 CAN_TDHxR:用来存储将要发送的高 4 个字节。接收 FIFO 邮箱标识符寄存器 CAN_RIxR:该寄存器用来保存接收到的报文标识符等信息,通过读该寄存器获取相关信息。接收 FIFO 邮箱数据长度和时间戳寄存器 CAN_RDTxR;接收 FIFO 邮箱低字节数据寄存器CAN_RDLxR;接收 FIFO 邮箱高字节数据寄存器 CAN_RDHxR,同发送。过滤器模式寄存器 CAN_FM1R:设置各滤波器组的工作模式,对 28 个滤波器组的工作模式,都可以通过该寄存器设置,不过该寄存器必须在滤波器处于初始化模式下才可以设置。过滤器位宽寄存器

6、 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:那么其中第

7、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 位来设置。其次要

8、设置 CAN 的相关引脚为复用输出,设置为上拉输入(CAN_RX ) ,设置为复用输出(CAN_TX) ,并使能 PA 口的时钟。2、 设置 CAN 工作模式及波特率等。先设置 CAN_MCR 寄存器的 INRQ 位,让 CAN 进入初始化模式,然后设置 CAN_MCR 的其他相关控制位,再通过 CAN_BTR 设置波特率和工作模式(正常模式/环回模式)等信息。最后设置 INRQ 为 0,退出初始化模式。3、 设置滤波器。设置 CAN_FMR 的 FINIT 位,让过滤器组工作在初始化模式下,然后设置滤波器组 0 的工作模式以及标识符 ID 和屏蔽为。最后激活滤波器。并退出滤波器初始化模式。如

9、果用到中断,还要配置中断模式。具体的:如何初始化 CAN:1、 使能相关时钟(PORTA 时钟, CAN 时钟) ,初始化引脚 RX 和 TX。2、 设置 CAN_MCR,退出睡眠模式,同时设置参数。基本是所有位清零。关于睡眠模式,CAN 在复位后都是进入睡眠模式,当然也可以设置自动唤醒模式等。3、 请求 CAN 进入初始化模式,对 CAN_MSR 的位 0 置 1。等待进入初始化,检验 MCR 位 0 INAK 的值,当真正变为 1 的时候,在进行下一步。因为这个过程可能不是瞬间完成的,如果当前有 CAN 活动,就会等到本次活动结束后再进入初始化模式,硬件对 INAK 位置1。4、 设置 C

10、AN_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、 设

11、置过滤器模式 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

12、 位 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(不一定

13、是 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。扩展标识符或标准标识

14、符存在位 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 中断。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报