STM32 CAN外设1

目录

0.本节学习内容对应数据手册STMF10xxx中的控制器局域网(bxCAN)

[1.STM32 CAN外设简介](#1.STM32 CAN外设简介)

2.CAN网拓扑结构

3.CAN收发器电路

4.CAN框图

5.CAN基本结构

6.发送过程

7.接收过程

8.发送和接收配置位


0.本节学习内容对应数据手册STMF10xxx中的控制器局域网(bxCAN)


1.STM32 CAN外设简介

STM32内置bxCAN外设(CAN控制器),支持CAN2.0A和2.0B,可以自动发送CAN报文和按照过滤器自动接收指定CAN报文,程序只需处理报文数据而无需关注总线的电平细节

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

3个可配置优先级的发送邮箱

2个3级深度的接收FIFO

14个过滤器组(互联型28个)时间触发通信、自动离线恢复、 自动唤醒、禁止自动重传、 接收FIFO溢出处理方式可配置、 发送优先级可配置、双CAN模式

STM32F103C8T6 CAN资源:CAN1


2.CAN网拓扑结构

CAN引脚的重定义实际上CAN引脚是可以重定义到PB8和PB9的


3.CAN收发器电路

图一是商家资料里提供的模块原理图


图二是TJA1050芯片手册里给的应用参考电路


图三是收发器实物图


(图一原理图不是对应图三实物图的,但是电路接法是一样的)
图一原理图:R1、R2、C5、C6过滤噪声,可以让波形更平滑一些;R3的120Ω电阻,这个电阻是终端电阻,可以看到这里每个收发器模块自带一个终端电阻,当两个模块相连时,正好是两个终端电阻,但是,如果,三个及以上的模块相连就会有更多的终端电阻,不符合协议的要求了,所以,当三个及更多收发器相连时,我们得把收发器中间的终端电阻去除。本实验是没有去除这个终端电阻的因为这个是贴片电阻不好去除,我们是应用3个收发器模块连接的,实际上3个终端电阻也没事,但是实际项目中必须一个按照协议要求


4.CAN框图

本实验没有CAN2,CAN2就是辅助CAN1共同管理CAN总线

CAN 2.0B主动核心里面的寄存器,程序通过读写寄存器来操纵电路的运行

主发送邮箱,有3个,每个邮箱可以存入一个CAN报文,如果想发出一个报文,就把这个报文写入到其中一个空置邮箱,之后设置寄存器请求发送,即可,然后,剩下的所有步骤,比如:等待总线空闲、操作引脚输出波形、进行位同步、仲裁等等,这些步骤,全部由硬件电路自动执行

接收部分:主接收FIFO 0、主接收FIFO 1、接收滤波器;当CAN总线上出现一个数据帧或者遥控帧时,CAN硬件电路都会把这个报文缓存下来,这个报文能不能保留下来,就要看能不能通过过滤器,过滤器内,可以设置过滤规则,告诉硬件想要什么ID的报文,如果硬件收到了这些ID的报文,就可以存入FIFO,没有通过过滤器的报文,会被丢弃,通过过滤器的报文会自动存入主接收FIFO 0和主接收FIFO 1,FIFO意思是先进先出寄存器,也可以称为队列,说人话就是排队,通过过滤器的报文要进队伍0或队伍1里面排队,等待CPU读取,两个队伍每个队伍有3个邮箱,最大存入3个报文,如果接收报文很快。CPU无法及时读走,那报文就可以在FIFO 0或者FIFO 1里面排队,这样一定程度上可以避免报文丢失


5.CAN基本结构

CAN_TX对应PA12,CAN_RX对应PA11,引脚内部首先配置GPIO,CAN_TX是输出,引脚控制权在CAN外设,所以配置为复用推挽输出模式,CAN_RX是输入,配置为上拉输入,引脚进来后由这个发送和接收控制器全权管理,非常强大的管理员,告诉它想发什么报文会发出去,接收的报文会自动和配置的过滤器进行比较,符合过滤器的报文,自动存入FIFO队列中,CPU直接读取FIFO即可

发送邮箱:想发出报文时,只需要将报文的各个参数(比如:ID、Data、IDE、RTR等)写入到其中一个发送邮箱,然后给一个请求发送的命令,之后这个管理员就会等待总线空闲,然后自动把这个报文广播到总线上,如果三个邮箱都有报文,总线空闲,管理员会通过发送选择策略发送报文,这个发送选择策略,可以配置,先请求先发送(先来后到,如果有多个待发的报文,那么谁先请求,谁就会优先发出),或者按ID号优先发送(ID号最小的先发)

接收部分:当CAN总线出现任何一个数据帧或遥控帧的报文波形时,会经过我们配置的过滤器,根据ID号判断是否通过,一共14个过滤器,不配置默认失能不进行工作,可以根据需要配置多个过滤器,配置过滤器时,可以配置加入哪一个FIFO排队,然后,排队会从邮箱0一直排满到邮箱2,可以配置FIFO锁定,如果锁定后,FIFO排队满了,就会将新数据丢弃,如果配置不锁定,新数据就会自动替换邮箱2


6.发送过程

基本流程:选择一个空置邮箱→写入报文 →请求发送

RQCP:请求完成,置1表示请求完成

TXOR:发送完成,置1表示发送完成

TME:发送邮箱空,置1表示处于空闲状态


7.接收过程

基本流程:接收到一个报文→匹配过滤器后进入FIFO 0或FIFO 1→CPU读取

FMP:报文数目

FOVR:FIFO溢出

还有一个寄存器位叫FULL(图中没显示):置1,FIFO存满


8.发送和接收配置位

NART:置1,关闭自动重传,CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失);置0,自动重传,CAN硬件在发送报文失败时会一直自动重传直到发送成功

TXFP:置1,优先级由发送请求的顺序来决定,先请求的先发送;置0,优先级由报文标识符来决定,标识符值小的先发送(标识符值相等时,邮箱号小的报文先发送)

RFLM:置1,接收FIFO锁定,FIFO溢出时,新收到的报文会被丢弃;置0,禁用FIFO锁定,FIFO溢出时,FIFO中最后收到的报文被新报文覆盖

相关推荐
HanLop1 小时前
51单片机入门
单片机·嵌入式硬件·51单片机
Bona Sun10 小时前
单片机手搓掌上游戏机(十一)—esp8266运行gameboy模拟器之硬件连接
c语言·c++·单片机·游戏机
云山工作室10 小时前
基于物联网的智能楼宇门禁系统
单片机·物联网·毕业设计·课程设计·毕设
猪八戒1.011 小时前
onenet接口
开发语言·前端·javascript·嵌入式硬件
d111111111d11 小时前
SPI通信协议--在STM32中介绍(学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习
电子科技圈12 小时前
IAR与Quintauris携手推进RISC-V汽车实时应用的功能安全软件开发
嵌入式硬件·安全·设计模式·编辑器·汽车·risc-v
up向上up13 小时前
基于STM32的电子钟万年历Proteus仿真设计_LCD1602显示
stm32·单片机·proteus
q***071414 小时前
SocketTool、串口调试助手、MQTT中间件基础
单片机·嵌入式硬件·中间件
新晨单片机设计14 小时前
【S001A】基于STM32单片机视力保护仪【Proteus仿真+Keil程序+报告+原理图】
stm32·单片机·proteus