CAN控制器局域网学习笔记

can控制器局域网(controller area network),是由德国bosch公司制定,是工业以及汽车领域广泛使用的总线之一。当前许多嵌入式mcu的外设基本都具备有can外设。
一般在设计中如果需要用到can,并不是mcu具备can外设即可,还需要配备can收发芯片。因为mcu的tx/rx输出的can信号是ttl电平信号,要发送到总线上的话,需要将其转化为差分信号,所以外接的收发芯片的作用则是ttl信号和差分信号的相互转换。
下图是遵循iso11898标准的高速/短距离的“闭环总线网络”。首位两端各有一个120欧姆的匹配电阻(120欧姆的匹配电阻只是一个经典值,并非固定),总线阻抗测量应为60欧姆,该总线也是工业场景中常用的总线结构。
下图为遵循iso11519-2标准的低速,远距离“开环网络”。
总线上的匹配电阻的作用,主要有两个:一.提高抗干扰能力,确保信号快速进入隐形状态,更快地执行放电动作 二.提高信号质量,吸收信号传输到总线两端后的反射波。
如下图所示,能明显看到匹配电阻对信号的质量的实际改善。
上述,can有两个不同的通讯标准,不同的测试标准对于实际差分信号和逻辑电平的要求是不同的,如下图所示,因为canh/canl输出的是差分信号,当差分信号的电压差小于下表中的标准值,则认为是隐形电平,代表逻辑电平为1;同理,差分信号压差的电压差大于下表中标准值,则认为是显性电平,代表逻辑电平为0;
所以在实际使用过程中,可通过实际测量mcu出的tx/rx(逻辑电平)和收发芯片出的can h/canl(差分信号),来简易地判断板级can电路是否工作正常。
can的帧类型有数据帧/遥控帧/错误帧/过载帧四种主要帧类型,其中应用最广泛和最复杂的就是数据帧,其中大家比较熟悉的就是数据帧里的标准帧和拓展帧(帧构成区别如下图所示),对于开发者来说,标准帧和拓展帧最直观的区别就是标准帧的帧id范围:0~0x7ff,拓展帧的帧id范围:0~0x1fffffff,数据域的使用是一致的。
标准帧
拓展帧
接下来介绍的也是can的配置中最重要的一个内容,就是波特率的配置。can的波特率也就是can报文的传输数量,单位是bps(bits per second)每秒能传输的bit数目,目前常见的can 2.0理论最大支持到1m bps。接下来基于st库函数代码,来查看can的波特率配置过程有哪些变量是需要关注的,且它们的含义是什么。
如上述所言,can的波特率即是每秒可传输的bit个数,那么可知
baudrate = 1/bittime
因此如下图所示,当分别配置can的波特率为125kbps、250kbps以及1mbps时,可测得单个bit位的传输时长分别是8us、4us以及1us,因此这也是可用用作测试波特率是否配置正确的一种方法
如下所示,在实际开发过程中,以st为例can的配置结构体如下所示,其中与波特率相关的变量为can_prescaler/can_bs1/can_bs2,配置好这几个数值则可以完成目标波特率的配置。
那上述的这些变量具体可见下图,每个can报文的bit都可以拆成如下段,can报文也是通过如下段来决定如何对齐can时序、如何实现该bit位电平的采样。
如图所示一个bit位进一步拆分成ss段、pts段、pbs1段(can_bs1)、pbs2段(can_bs2),每个段的单位为1tq
tq = can_prescaler/can所在总线频率 = can_prescaler/fclk。
综上可计算公式:
bittime = (1+bs1+bs2)*tq = (can_prescaler)(1+bs1+bs2)/fclk
baudrate = 1/bittime = fclk/ (can_prescaler)(1+bs1+bs2)
举个例子,若当前can所在总线的频率为45mhz(即fclk = 45m),此时若想要配置得到1mbps的波特率,那么就需要凑出(can_prescaler)(1+bs1+bs2) = 45,如下可知通过选取bs1 = 5、bs2 = 3、can_prescaler = 5的形式来得到5*(1+5+3) = 45,来求的波特率是1mbps。
由此可知计算波特率的数值取值不是固定的,因为bs1= 6,bs2 = 2也是可得到同样的波特率,但是这个时候需要引入一个采样点的概念,即can的处理电路什么时候开始判断当前这个can bit是属于高电平还是低电平,这边不做更多延伸,采样点的计算公式如下
sample = (1+bs1)/(1+bs1 + bs2),所以例子中的采样率为(1+5)/(1+5+3) = 0.67,则采样率为67%,一般情况下采样率最好是配置在75%~85%之间。
不同的芯片厂商的库函数其含义有些许不同,有的厂商是需要寄存器需要配置的tseg1、tseg2,其实就是bs1和bs2,但是例如如果你要配置bs1 = 5,实际赋值需要为tseg1 = 4。区别就在于需要做加一或者减一的区别,下图即是公式,由于自己没有深究过这一块的区别,有研究的朋友欢迎评论交流。

华为正式新增了一家外投资企业中电仪器
创新科技是引领健康中国的有效途径,生物电子治疗颠覆慢性病领域
华为重获进入德国市场的机会
赛灵思:汽车驾驶员辅助系统之利用FPGA的处理能力
电子元器件烘干除潮中工艺问题及解决工艺措施
CAN控制器局域网学习笔记
马化腾互联网发展的前瞻;全真互联网
模拟输入测试的一个实际案例
老人不会用智能手机,就活该被淘汰吗?
功率继电器的原理_功率继电器的作用
于英涛:应对网络安全需要各方紧密协作 共同构筑起良好的生态系统
Mems电容式加速度计的种类(三)
华为首款5G双模手机跟普通5G手机有什么区别
速冷速热模温机的工作原理与应用分析
Cat.1模组再添新选择,利尔达推出NT26U提供多元应用思路
由555定时器构成的流水灯控制电路
电动汽车没电去加油站换电池就行!就这么简单
君正集成电路 X1000/E主板介绍
单片机之间UART通信示意图分享
深度模型Adan优化器如何完成ViT的训练