江协/江科大 STM32 CAN外设简介
6、STM32 CAN外设简介
STM32内置bxCAN外设(CAN控制器),bx(Basic Extended:支持扩展格式)支持CAN2.0A(标准格式)和2.0B(扩展格式),可以自动发送CAN报文和按照过滤器自动接收指定CAN报文,程序只需处理报文数据而无需关注总线的电平细节。
STM32的CAN外设参数:
波特率最高可达1兆位/秒(支持高速CAN);
3个可配置优先级的发送邮箱(发送的时候有3个缓存区,可以存入3个待发报文);
2个3级深度的接收FIFO(接收的缓存区,总共可以缓存2 * 3 = 6个报文);
14个过滤器组(互联型28个)(过滤器用来过滤接收报文ID);
时间触发通信、自动离线恢复、自动唤醒、禁止自动重传、接收FIFO溢出处理方式可配置、发送优先级可配置、双CAN模式。
STM32F103C8T6 CAN资源:CAN1,14个过滤器组
6.1 CAN网拓扑结构
每个CAN节点都挂载在CAN总线上,对于其中一个CAN节点,都由CAN控制器和CAN收发器组成,CAN控制器一般集成在MCU(单片机)内。
6.2 CAN收发器电路
此图为TJA1050收发器芯片手册给的应用参考电路,CAN_H和CAN_L直接连在CAN总线上,总线两端各加120欧的终端电阻,GND和S接地,VCC接5V供电,然后加一大一小两个电源滤波电容,Vref直接悬空,TXD和RXD和左边的CAN控制器SJA1000相连,TX0接TXD, RX0接RXD。STM32F103C8T6有内置CAN控制器,所以可以直接和TJA1050相连。
6.3 CAN框图
红线以上为主CAN1,红线以下为CAN1的从CAN2,CAN2辅助CANA1工作,共同管理一个CAN总线。只有互联型设备才有CAN2。
CAN2.0B主动核心内有很多寄存器,我们可以读写这些寄存器来对CAN总线电路进行配置。
发送邮箱有3个,每个邮箱可以存入一个CAN报文,如果想要发出一个报文,那就把这个报文写到其中一个空置邮箱,之后设置寄存器请求发送就行。
蓝框为接收部分,包括接收过滤器和2个FIFO,当CAN总线上出现一个数据帧或者遥控帧时,CAN硬件电路都会把这个报文缓存下来,至于是不是要保留这个报文,那得看它能不能通过过滤器。过滤器内,我们可以设置过滤规则,告诉硬件我们想要什么ID的报文,如果硬件收到了这些ID的报文,就可以把它存入FIFO,如果收到的报文无法通过任何一个过滤器,说明这个ID的报文我们并不需要,那硬件就直接把它扔了。通过过滤器的报文,会自动存入主接收FIFO 0或者FIFO 1 ,FIFO(First Input First Output)是先进先出寄存器,也叫队列,通俗讲就是排队,通过过滤器的报文要进队伍0或队伍1排队等待CPU读取,这里设计了两个队伍,每个队伍有3个邮箱,也就是最大存入3个报文,如果接收报文很快,CPU无法及时读走,那报文就可以在FIFO 0或者FIFO 1里排队,这样一定程度上,可以避免报文丢失。
作者:一个沉潜的人