stm32的can总线

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

  • 波特率最高可达1兆位/秒,高速CAN波特率为125K~1MBps,可支持高速CAN

  • 意思就是发送的时候有3个缓存区,可以存入3个待发报文,

  • 2个3级深度的接收FIFO,这是接收的缓存区,总共可以缓存2*3=6个报文

  • 14个过滤器组(互联型28个),看芯片是不是互联型,这个过滤器,就是用来过滤接收报文ID的,所有挂载在CAN总线的报文,都是广播发出来的,每个设备都能收到,各种报文都混杂在 起,都在总线上传输,但是对于某个特定的设备而言,它往往只需要接收部分ID的报文,这样我们就可以配置这个过滤器,让CAN外设,只接收我想要的报文,无关报文直接就过滤掉,这样就非常方便

  • STM32 CAN外设额外的一些特色功能:时间触发通信、自动离线恢复、自动唤醒、禁止自动重传、接收FIFO溢出处理方式可配置、发送优先级可配置、双CAN模式

一、CAN网拓扑结构

这里每个CAN节点都挂载在CAN总线上,对于其中一个CAN节点,都由CAN控制器和CAN收发器组成,CAN控制器一般集成在MCU,也就是单片机里面,然后STM32引出CAN_RX和CAN_TX引脚,与CAN收发器连接,之后CAN收发器引出CAN_High和CAN_LOW,与CAN总线相连

stm32的can就两个引脚CAN_RX、CAN_TX

二、CAN收发器电路

VCC供电必须接5V,不能接3.3V,因为协议规定,CAN_H引脚在显性电平时电压为3.5V,要是供电只有3.3V,那么CAN总线的电压,就没法符合规范了。

TXD和RXD,和左边的CAN控制器相连,T接T,R接R,不用交叉,这一点别和串口搞混了

SJA1000这个芯片,是一个独立的CAN控制器,比如如果你用一些低端的单片机,,它没有内置CAN控制器,那么就可以通过外置这个SJA1000,实现CAN通信

模块中间的R3是120Ω电阻,这个电阻就是终端电阻了,可以看到,这里每个收发器模块,自带的就有一个终端电阻,所以当两个模块相连时,正好是两个终端电阻,但是如果三个或更多模块相连,那么终端电阻就也会有3个或更多,这一点,不符合协议的要求,所以,当3个或更多收发器模块相连时,我们得把中间模块的终端电阻去掉,这才是符合协议的做法

三、STM32的CAN基本结构

发送邮箱有3个,每个邮箱可以存入一个CAN报文,如果我们想发出一个报文,那我们就把这个报文写入到其中一个空置邮箱,之后设置寄存器请求发送,就完事了,然后剩下的所有步骤,比如等待总线空闲,操作引脚输出波形,进行位同步和仲裁等等,这些步骤,全都由硬件电路自动执行,所以使用起来,其实非常简单。

接收部分的接收过滤器和2个FIFO,当CAN总线上出现一个数据帧或者遥控帧时,CAN硬件电路都会把这个报文缓存下来,至于是不是要保留这个报文,那得看它能不能通过过滤器,过滤器内,我们可以设置过滤规则,告诉硬件,我们想要什么ID的报文,如果硬件收到了这些旧的报文,就可以把它存入FIFO,如果收到的报文,无法通过任何一个过滤器,说明这个D的报文,我们并不需要,那硬件就直接就把它扔掉,别来烦我们,这样可以减轻软件的负担。然后,通过过滤器的报文会自动存入主接收FIFO 0或者主接收FIFO 1,FIFO的意思是先进先出寄存器,你也可以把它称为队列,通过过滤器的报文,要进队伍0或者队伍1里面排队,等待CPU读取,这里设计了两个队伍,每个队伍有3个邮箱,也就是最大存入3个报文,如果接收报文很快,CPU无法及时读走,那报文就可以在FIFO 0或者FIFO1里面排队,这样在一定程度上,可以避免报文丢失。

波特率计算

STM32中的位时序

计算出来的波特率一定要在高速或低速CAN总线的范围内,如果不在其范围内,则要调整。

相关推荐
我不是程序猿儿14 小时前
【嵌入式】面向 STM32 的 ADC 与 DMA 学习路线
linux·stm32·单片机·嵌入式硬件·学习
一支闲人14 小时前
研究STM32库函数 如何操作寄存器
stm32·单片机
rit843249915 小时前
基于STM32的触控USB鼠标设计
stm32·嵌入式硬件·计算机外设
天狼IoT15 小时前
STM32-keil+CubeMX快速开发:GPIO功能
stm32·单片机·嵌入式硬件
芯岭技术15 小时前
PY32C673单片机特性,应用场景介绍,最高主频可达 72 MHz
单片机·嵌入式硬件
ytttr87315 小时前
STM32 独立看门狗(IWDG)程序设计与实现
stm32·单片机·嵌入式硬件
木下~learning15 小时前
嵌入式Linux 小项目:RK3399 基于 MPlayer 实现视频播放器(从环境搭建到完整播放列表)
linux·运维·嵌入式硬件·音视频
学习噢学个屁15 小时前
基于51单片机心率仪—体温心率血氧蓝牙
c语言·单片机·嵌入式硬件·51单片机
济61715 小时前
FreeRTOS 通信任务设计(2)----UART+DMA 环形缓冲 + 空闲中断+ 流缓冲区--- 高效接收方案详解
stm32·单片机·嵌入式·freertos
QH1392923188016 小时前
是德科技KEYSIGHT N5183B 9 kHz~40 GHz微波模拟信号发生器
网络·数据库·科技·嵌入式硬件·集成测试