目录
0.本节学习内容对应数据手册STMF10xxx中的控制器局域网(bxCAN)
[1.STM32 CAN外设简介](#1.STM32 CAN外设简介)
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中最后收到的报文被新报文覆盖







