目录
1、简介
bxCAN中bx表示支持扩展格式
STM32波特率最高达1Mbps,可使用高速CAN
FIFO:(First Input First Output)先进先出寄存器
2、CAN网拓扑结构
使用F103c8t6将CAN收发器的RX和TX引脚接在PA11和PA12时,USB和CAN无法同时使用
可以映射到PB8和PB9
3、CAN收发电路
4、CAN基本结构
(1)GPIO:CAN_Tx配置为复用推挽输出,CAN_Rx配置为上拉输入。
(2)发送和接收控制器:只需把想发的报文告诉他,他就自动给你发出去,当他接收到一个报文后,就自动与你配置的过滤器进行比对,符合过滤器的报文自动存入FIFO的队列中,CPU直接读取FIFO即可。
(3)邮箱:将想发送的报文存入邮箱,控制器自动广播,为避免长时间等不到总线空闲,导致报文在邮箱滞留很久造成的CPU等待,因此设置了3个发送邮箱,提供缓冲区,CPU可以不用等待,向其他邮箱写入报文。
发送哪个邮箱的报文可根据先来后到(TXFP=0),也可按照ID号优先级处理(TXFP=1)。可由TXFP进行配置
(4)接收过滤器:可根据ID号对报文进行过滤,不是想要的报文会被直接丢弃。一共14个过滤器,在程序中可对任意一个过滤器进行配置,把想要接收的报文ID规则写入过滤器中,我们想要的报文会通过过滤器进入后续的FIFO中,进而被CPU读取。
如果只需要几种类型的报文ID,使用一两个过滤器即可满足要求,不被配置的过滤器默认处于失能状态。
硬件设计的过滤器可节省软件对报文ID比对的工作
(5)接收FIFO:FIFO0和FIFO1,每个FIFO有3个邮箱,可容纳3个报文排队。过滤器可指定进那个FIFO队伍。
处理报文排满问题:若同一个FIFO因没有被CPU及时读取而满了,STM32可配置FIFO的锁定状态,来处理FIFO满之后新的报文该怎么存:若配置FIFO锁定(RFLM=1),新的报文会被直接丢弃;若配置FIFO不锁定(RFLM=0),FIFO满之后,新的报文会把邮箱2的数据踢出去,自己占据邮箱2的位置。
若邮箱0报文被读取,邮箱1的数据就会存入邮箱0,邮箱2存入邮箱1。
5、发送过程
RQCP=x 表示任意值
TME=1 ,表示当前邮箱是空置状态
TXRQ=1,表示产生这个发送请求,邮箱进入挂号状态
CAN总线 = IDLE(空闲)
发送失败 = NART
NART = 0 表示使用自动重传,发送失败的报文会回到预定状态,下次总线空闲会再次发送;
NART = 1 表示禁止自动重传,发送失败后直接回到空置状态,TXOK=0
ABRQ = 1,可终止挂号状态和预定状态的发送,终止发送后状态和发送失败是一样的
6、接收过程
FIFO存满后,FOVR=1,FULL置1
溢出状态和挂号3状态其实是一个状态,溢出状态释放一个邮箱后会进入挂号2状态