2017网站开发新技术,黄浦品牌网站建设,全美东莞网站建设,东莞网站推广推广软件文章目录 0. 前言1. CAN简介2. 主流通讯协议对比3. CAN 硬件电路4. CAN 电平标准5. CAN 收发器 0. 前言
博客内容来自B站上CAN总线入门教程视频讲解#xff0c;博客中的插图和内容均为视频中的内容。视频链接 CAN总线入门教程
1. CAN简介 先来看看一它名字的意思#xff0c… 文章目录 0. 前言1. CAN简介2. 主流通讯协议对比3. CAN 硬件电路4. CAN 电平标准5. CAN 收发器 0. 前言
博客内容来自B站上CAN总线入门教程视频讲解博客中的插图和内容均为视频中的内容。视频链接 CAN总线入门教程
1. CAN简介 先来看看一它名字的意思can总线英文全称是 Controller Area Network Bus 直译是控制器局域网总线简称 C A N 总线一般就读作CAN总线从名字也可以看出来CAN总线构建的是一种局域网网络每个挂载在 CAN 总线的设备都可以利用这个局域网去发送自己的消息也可以接收局域网的各种消息每个设备都是平等的都在共享这个局域网的通信资源。这是CAN总线的设计理念。
CAN 总线是由 BOSCH 公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通讯总线广泛应用于汽车、嵌入式、工业控制等领域。CAN总线最初就是为了汽车而设计的所以其对可靠性和稳定性的要求非常高。 待会我们也可以了解到CAN总线的差分信号、应答机制、 CRC 校验、错误处理等设计无处不体现出其严谨和安全。
在满足这么多功能和性能的同时CAN 总线仍然能保持一个非常简洁易用的硬件电路所以说CAN 总线的设计还是非常成功的。现在 CAN 总线已经成为一种通用的通信方式不仅限于汽车领域在其他很多领域也都有 CAN 总线的身影。另外近几年新能源汽车的火热发展也促使了很多人来学习CAN总线。
接下来概括的看一下 CAN 总线的特性
CAN 总线只有两根通信线CAN_High和CAN_Low简称CAN_H 和CAN_L线路少且无需共地。也就是说CAN 总线总共就只需要两根线就能实现任意设备的互相通信了而且不需要共地因为它是差分信号所以CAN 总线的线路非常少。 比如说 I2C 通信它也只有两根通信线 SCL 、SDA但是 I2C 是单端信号必须得共地所以实际上 I2C 至少得 3 根线。 CAN 总线采用差分信号通信CAN_H 和CAN_L 就是一对差分线差分线的好处就是抗干扰能力强。如果线路产生干扰则一般两根线的电压都会同时出现波动但是两根线的电压差值仍然是不变的所以利用这个电压插值来传递数据就能极大地避免干扰。 目前 CAN 总线分为了两种标准高速 CAN 和低速 CAN。高速 CAN 在国际标准中叫 ISO 11898其传输速率为 125k ~ 1Mbps传输距离 40m。低速 CAN 叫 ISO 11519传输速率为10k ~ 125 kbps 传输距离 1 km。可以看出高速 CAN传出快但是距离较短低速CAN传速慢但是距离很远这个可以根据应用场景选择。当然本课程侧重学习的是高速 CAN 这个应用广一些。低速CAN也有涉及所以着重学习高速 CAN即可。 CAN总线是异步的无需时钟线通讯速率由设备各自约定。这点和串口非常类似。 CAN总线是半双工的不可以同时发送和接收。CAN总线可挂载多设备每个设备都可以占用CAN总线来发送自己的数据多设备同时发送数据时会通过仲裁判断先后顺序。也就是让大家排好队消息都是可以发出去的这个后续还会详细介绍。 11位 /29位 报文 ID 用于区分消息功能同时决定优先级。CAN总线是通过发送方广播自己的消息来实现多设备互相通信。每个设备都可以广播消息那自然每个消息也最好都加一个 ID用于区分功能。否则谁知道每个消息都什么意思呢对吧 报文 ID 有11位的叫标准格式后来又扩增至29位叫扩展格式。同时报文 ID 不仅可以区分消息功能当不同消息想要同时占用总件发送时报文 ID 还决定优先级 ID 号小的优先发送这是报文 ID 的作用。 CAN总线的一个数据帧可以配置 1~ 8 字节的有效载荷。这个类比串口串口一次只能发一个字节而CAN总线比较强大它最大一次可以发 8 个字节并且可以灵活指定数据长度1~8字节随意配展。 CAN 总线可以实现广播式和请求式两种传输方式。刚那么看到示例属于广播式传输方式就是一个设备发送数据其他所有设备都能收到然后接收方根据报文 ID 来决定用不用这个数据。大概的场景就是发送方说管你们要不要我反正把数据发出去了你们谁要谁拿走这是广播式也是CAN总线最常用的方式我们主要学习广播式即可。 除了广播式CAN总线还可以有请求式请求式的场景是数据发送方不会主动广播自己的数据而是只有收到接收方发出的请求发送方才会发数据这样一个数据的传输就需要先请求再接收一来一回两个过程这是请求式。 CAN总线的设计还包括应答、 CRC 校验、位填充、位同步、错误处理等诸多特性这里简介大家有个印象就行接下来再慢慢细说。
2. 主流通讯协议对比 回顾一下其他主流的通信协议有 UART 串口、I2C 和 SPI。
CAN 总线的设计跟这些协议有诸多相似的地方。尤其是 UART 和 I2C。在我看来 CAN 总线就是 UART 和 I2C 的结合体当然需要再加一点点细节。 CAN 总线既继承了 UART 的方便易用又拥有像 I2C 一样的多主机特性。在差分信号的设计上又和 RS485 异曲同工。可以说如果你对 UART 串口和 I2C 很熟悉那么 CAN总线 就已经学会一半了。 但是如果你不会 UART 和 I2C那本课程理解起来可能有点困难不过也不要害怕虽然原理部分你可能不能完全理解但是本课程只要你有个大体上的概念即可因为CAN 总线的底层操作STM32 都已经包办了最终写程序的时候并不需要你对底层原理完全了解那 UART 和 I2C 的知识点这里就不再讲了。 对比这几种通信协议我总结了它们的一般应用场景 比如串口就是点对点的两个设备互相通信。左下角这个图是串口的电路比如单片机和电脑的串口助手点对点通信或者单片机和一些模块点对点通信串口的使用是最简单的但是串口的弊端就是只能两个设备点对点的通信。 下一个 I2C 通信它的电路是中间这个图一般的应用场景就是一个单片机当作主控然后外挂多个被动的传感器、存储器等模块。虽然 I2C 也有和 CAN 类似的多主机设计但是 I2C 的多主机不太方便应用也不多。所以 I2C 的主要场景还是一主多从。 然后 SPI 通信协议的场景和 I2C 类似也是一主多从的模型其通信电路如右下图所示SPI 的线路更多但是其通信速率是最快的轻松达到 Mbps 比本节我们讲的 CAN 总线还快。SPI 主要应用于高速通信的场景。 那么总结以上场景I2C 和 SPI 一般都是一主多从的只能有一个主控。 UART 虽然两个设备都可以是主控但是它只能点对点的通信主控的数量有限。所以如果我的应用场景是需要有很多个主控单片机互相进行通信比如5个或10个 STM 32它们之间想任意互相传数据这该怎么办呢 显然以上三种通信协议都难以胜任这个工作而我们本节所讲的CAN总线最大的优势就是可以实现多个主控互相通信。它的应用场景就是超过两个的单片机主控系统之间进行通信我们可以用两根线的CAN总线将每个主控串起来这样就直接可以实现任意的数据传输了。 CAN 总线的设计目的以及什么场景下需要用CAN总线我们就清楚了。
接下来本节课的内容主要分为 5 章
第 1 章是 CAN 总线的硬件电路如何接线、电平标准是什么CAN 收发器有什么用以及CAN 物理层特性的总表。第 2 章是 CAN总线的帧格式也就是如何将要发送的数据编码为CAN总线上的时序波形这里主要学习 CAN 总线的 5 种帧类型数据帧、遥控帧、错误帧、过载帧以及帧间隔之后了解位填充的规则就可以分析CAN总线的实际波形了。第 3 章是 CAN 总线接收方要考虑的问题发送方发出一段波形接收方该如何采样得到数据呢首先抛出两个问题之后针对这两个问题CAN 总线定义位时序并且设计了硬同步和再同步的规则来解决以上两个问题。最后波特律的计算方法也了解一下。第 4 章是 CAN 总线多设备同时发送的处理方法两个设备想同时发送但是CAN 总线只能承载一个波形如何分配通信资源这是CAN总线要考虑的。在这里 CAN 总线定义有先占先得和非破坏性仲裁 两个资源分配规则其中仲裁过程以及各类型帧的优先级也会学习。第 5 章是CAN 总线的错误处理总共有哪些错误以及如何处理这些错误。
3. CAN 硬件电路
下面这两个图就是CAN 总线的电路接法 左图为闭环 CAN 总线是高速 CAN的接法。右图为开环 CAN总线是低速CAN的接法重点学习高速 CAN。
每个设备通过 CAN 收发器挂载在 CAN 总线网络上。 这里画了3个设备作为 CAN 的节点每个设备都可以是一个 CAN 的主控系统比如 STM32、单片机有更多的设备也都是类似的接法。那每个设备都得通过一个CAN 收发器接入到 CAN 总线CAN收发器就是一个芯片主要实现电平转换、输出驱动和输入采样几个功能。 CAN 控制器引出的 TX 和 RX与 CAN 收发器相连CAN 收发器引出的CAN_H 和CAN_L 分别与总线的CAN_H 和CAN_L 相连。 下图也可以看出在每个CAN 节点里的主控设备会内置有 CAN 控制器比如 STM32 中的CAN外设电路CAN 控制器只会引出 TX 和 RX 两个端口这两个端口不能直接接到 CAN 总线必须要借助 CAN 收发器来接入CAN 收发器会有 TX 、RX 、 CAN_H 和CAN_L 等引脚。CAN 控制器的TX、RX 就和收发器相连TX 接 TXRX 接 RX无需交叉。然后 CAN 收发器的CAN_H 和CAN_L就直接和 CAN 总线相连。CAN_H 接CAN_HCAN_L 接 CAN_L 这样每个节点就成功挂载到了总得 CAN 总线上。 ~ 下面这两根线就是串联各个节点的CAN 总线CAN 总线里走的是差分信号一般会用双绞线作为载体避免干扰 高速 CAN使用闭环网络CAN_H 和CAN_L两端添加120Ω 的终端电阻。可以看到这两根 CAN主线串联每个节点后它的两端要分别接一个120Ω 的电阻使 CAN 主线形成一个闭合的环路。所以叫闭环 CAN 总线。 那加这两个终端电阻主要作用有两个 第一个作用是防止回拨反射尤其是高频信号远距离传输的场景回拨反射是不能忽略的问题。关于回波反射具体原因可以学学传输电理论这里仅解释现象。如果不加终端电阻信号波形会在线路终端反射进而干扰原始信号最终的波形可能是当信号跳变时它会在边沿震荡几下这会干扰数据的正确传输。 ~ 如果加上终端电阻且阻抗匹配则信号的跳变沿就会变得非常平稳这是终端电阻的第一个作用。 ~ 第二个作用是在没有设备操作时将两根差分线的电压收紧使其电压一致。这里我用一个比较直白的词“收紧”。它的意思就是在没有设备操作总线的情况下这个电阻就像一根弹簧一样会将两根线的电压拉到同一水平也就是所说的收紧。 这一点其实和 I2C 的上拉电阻一样I2C 是这样的两根通信线各加一个上拉电阻默认拉高至高电平。当有设备想发送 0 时就把线路强制拉低至低电平当有设备发送 1 时不是把线路强制拉高至高电平而是不去碰这个线路。 ~ 线路由上拉电阻默认拉高至高电频这样的好处是可以防止电平冲突同时这还能实现线与的特性对总监仲裁十分重要。 那这个上拉电阻就也类似一个弹簧默认把电压拉高至高电平在CAN总线这里也采用了类似的设计因为 CAN 总线是差分信号有两根线所以两边的终端电阻可以将两根线收紧至电压一致状态代表的就是默认的1状态并且这两个电阻的阻值并不大所以这个收紧的速度是比较快的使得CAN总线支持的最大速率也比较快但是代价是CAN总线的功耗也会比较大这里当某个设备想要发送0时它就会操作总线把发动线拉开使其呈现 0 状态。当设备想发送 1 时就不去碰总线总线在终端电阻的收缩下自动归位默认状态1这一点尤其重要。
一定要注意当设备想发送 1 时它无需对动线进任何操作因为总线的默认状态就是1。 这是高速 CAN的电路以及高速 CAN如何发送0和1的操作方式。 低速 CAN 使用开环网络CAN_H 和CAN_L 其中一端添加 2.2 kΩ 的终端电阻也就是右下角这样两根线没有形成环路所以叫开环CAN总线。 其中这个电阻的接法比较特殊其一端接到总线另一端是悬空的根据电路的原理这个电阻应该是没有任何作用的因为电路只有形成回路才有效。但在这里它可以有防止回波反射的作用。 另外这个电阻没有连接两根线所以这两个电阻并没有收紧作用。以上就是 CAN 的硬件电路。
对于其连接方式和要点大家务必掌握因为用 CAN 总线肯定避免不了接线。那线路看好了我们再看一下CAN 的电平标准。
4. CAN 电平标准 CAN 总线采用差分信号即两线电压差VCAN_H - VCAN_L 传输数据位。 刚才我们也形象地介绍了如何利用这两根线传输 1 和 0现在来看一下它的具体规定。首先高速 CAN 的规定是电压差为 0 V时表示逻辑1隐性电平电压差为 2V 时表示逻辑 0(显性电平。 这里注意一下逻辑1又称隐性电平逻辑0又称显性电平这个定义是反直觉的正常的想法应该1表示显性0表示隐性那为什么这里是反着定义的1表示隐性而0却表示显性呢 我们对照下面这个图分析一下这里有两种波形表示方式一种是逻辑电平表示高电频表示逻辑1低电频表示逻辑0。 一种是查分电平表示这里有两根线红线表示CAN_H 线的电压蓝线表示CAN_L 线的电压。当 CAN_H 和CAN_L 对地的电压都为 2.5V 时两线电压相等电压差为 0V表示当前CAN总线处于逻辑1的状态。当CAN_H 对地电压3.5VCAN_L对地电压1.5V时两线电压差为2V表示当前CAN总线处于逻辑0的状态。 比如 CAN总线想发送101的数据流那么CAN总线就会呈现出两线收紧两线张开两线收紧这样的状态。 当然这里逻辑表示和差分表示完全等效在CAN总线里实际传输的是差分电平而在STM32的引脚以及常见的时序画法里会出现逻辑电平表示因为实际画时序波形的时候总是画两根线难免比较麻烦。况且这两根线实际只有1和0两种状态所以我们就可以简化一下画个逻辑表示就行了比如后面的帧时序为了简便使用的都是逻辑电平画法时许里只有一根高低电平的线但是大家要知道它这里画的高低电瓶并不直接表示CAN总线里传输的是高低电平而是表示总线收紧还是总线张开的状态这一点要注意一下然后继续看这里总线收紧状态称为隐性电平总线张开状态称为显性电平。 因为总线收紧状态被定义为了逻辑1所以就会出现1又称隐性电平的反逻辑显性和隐性表示的是总线的状态两线收紧没有电压差是默认状态所以叫隐性。两线张开产生电压差是需要设备干预的状态所以叫显性。这样定义显性、隐性是符合常识的。 在和逻辑电平的对应上因为电路约定俗成的习惯就是默认状态为高电平1所以默认的隐性电平就和逻辑1绑定了显性和0绑定另外显性电平和隐形电平同时出现时总线会表现出显性电平状态这也能对应电路中常用的0强于1的规定。 这是一对应隐性0对应显性的设计原因。简单来说显隐性描述的是总线的状态1和0是为了与电路约定俗成的规则对应。这就是高速 CAN的电平标准定义。 低速CAN的电平规定电差为-1.5V时表示逻辑1隐性电平。电压差为3V时表示逻辑0显性电平。 右下角是低速CAN的波形图当低速CAN想要发送101的数据流时总线就会呈现这样的状态CAN_L 为3.25 VCAN_H 为1.75 V电压差为-1.5 V时表示1。CAN_L 为1VCAN_H 为4V电压差为3V时表示 0 。在规定上其实和高速 CAN差不多但是低速CAN 传输距离更远。 考虑线路会有压降所以把1和0电平电压的差距加大了由此1和0变化的行程更长了这样即使有一些压降也能明显地区分出1和0的电平差异。同时也看出低速CAN默认的逻辑1隐性电平 CAN_H 和 CAN_L 电压并不相等所以对应起电路总线两端就不能用终端电阻闭合连在一起了。如果像高速 CAN 一样连在一起了那么终端电阻就有收紧两线电压的趋势这样就和低速CAN默认两线电压不相等的设计相悖了对于高速 CAN 默认的隐性电平两线电压就是相等的所以总线两端加闭合的终端电阻就更有利于总线快速回归隐形电平。
高速CAN总线回归隐形电平快传输速度就会快低速CAN总线回归隐性电平慢传输速度自然就慢。这是高速 CAN和低速CAN的设计思路。
5. CAN 收发器
好电平标准定义看完了接着简单看一下CAN 收发器的内部框图。 刚才我们说了每个 CAN 设备都得通过 CAN 收发器挂在总线上那CAN收发器有什么用 可以干哪些工作呢
看一下这个框图就知道了这里介绍的CAN收发器型号是 TJA1050是一个高速 CAN的收发器左边是芯片内部框图右上角是芯片的引脚布局右下角是引脚描述。
这个芯片总共有8个角GND和 VCC 需要提供5V的供电。TXD 和RXD 与设备的CAN控制器相连CAN_H 和 CAN_L 与CAN总线相连Vref是参考电压输出可以不用 。S是高速模式还是静默模式可以理解为是一个开关也可以不用所以这个芯片的接线非常简单一看就懂然后看这个芯片内部可以干点啥呢
首先右边CAN_H和 CAN_L 就是CAN总线左边接收器可以时刻检测总线电压差并输出到左边这根线如果总线有电压差就输1如果总线没有电压差就输出0这个1和0通过两个场效应管的输出驱动器输出到 RXD 引脚。这两个管可当成是电子开关右边为1时上管断开下管导通输出0。右管为0时上管导通下管断开输出1所以这两个管还有个电瓶反向的功能。最终整体上看当CAN总线有电压差时输出RXD 引脚为低电平0表示显性电平。CAN总线没有电压差时输出RXD 引脚为高电平1表示隐性电平所以RXD 这一块就是输入部分。那上面 TXD 这一块就输出部分了当 TXD 为1时后面这个驱动器就会让这边两个场效应管都断开。相当于不对总线进任何操作总线在外边终端电阻的收紧作用下呈现默认的隐形电平。
另外可以看出内部这里还有两个电阻这个电阻叫“中拉电阻”通过这两个电阻可以把CAN_H和CAN_L 两根线都拉到0.5倍 VCC 的中间电平也就是CAN_H和CAN_L 的默认对地电压都是2.5伏左右。
同时这两个电阻也有一定的收紧作用不过它们的阻值比较大所以收紧作用主要还是靠外面的终端电阻来实现这是这个问题。
当 TXD 给 0 时后面这个驱动器就会让这边两个场效应管都导通这就相当于有两只手上面的手将CAN_H 电压拽高下面的手将 CAN_L 的电压拽低这样两线就会分开产生电压差总线呈现显性电平0的状态这就是发送0的操作。
最后这里还有几块左边这个是电流源上拉类似于上拉电阻作用是如果 TXD 悬空了那么这里会保持默认输入1的状态防止输入引脚电平不确定造成误操作。然后这里是 TXD 显性超时计时器作用是如果 TXD 出现异常始终输入显性电平0始终拽着总线不放那么CAN总线将始终呈现显性电平0状态这样整条总线将会瘫痪并且没有设备可以阻止这一情况所以在这里收发器加了一层保险如果设备异常始终拽着总线不放那么等一段时间后收发器将会自动去释放总线防止总线瘫痪。
然后这个是一个开关控制 S引脚可以选择是否静默S 引脚有个下拉的电流源可以看出如果 S 悬空则会默认输入0最后这个是温度保护如果温度异常则会控制驱动器切断输出以免干扰CAN总线那这一块就输出部分了。
整体来说就是如果 TXD 给1则不会对总线进行任何操作总线呈现默认的隐形电平1如果 TXD 悬空则默认也是给1。如果 TXD 给0则驱动器会把CAN_H 拉高 CAN_L 拉低输出显性电平 0。
如果 TXD 一直给0出错了则显性超时收发器会主动释放CAN总线。好这就是收发器的全部内容。 最后通过这个CAN 物理层特性的表来总结下第一章的内容。 首先 ISO 11898 是高速 CAN最高1Mbps最长40米总线最高挂载30个节点设备隐性电平时CAN_H和CAN_L的对地电压均为2.5V。电压差为0表示的是隐性电平逻辑1。显性电平时CAN_H 3.5VCAN_L 1.5V电压差为2V表示的是显性电平逻辑0。当然这些电压都会有一些容差范围在这个范围内均可高速 CAN的差分信号一般使用双绞线传输是闭环总线阻抗120Ω终端电阻也是120Ω。 然后右边是 ISO11519-2杠几就是标准的第几次修订板哈。那它是低速CAN最高125kbps最大长度1 km当然在最大长度时其速率只能支持到40 kbps低速CAN 最高挂载20个节点设备其使用的也是双绞线不过是开环的总线阻抗是120Ω终端电阻是2.2 kΩ其他的参数自己看。
好这是 CAN 总线的第一章CAN 物理层的全部规定了。CAN 物理层规定了硬件电路该怎么接电平定义是什么以及如何发送显性电平0和隐性电平1。至此我们就学会了CAN总线是如何发送一个数据位的那实际应用中我们肯定不满足于只发送一位数据对吧
这样就需要连续发送多位数据来组成数据流既然需要发送数据流那每一位都是什么意思谁先发谁后发该如何编码和解析数据这是第二章 CAN 总线帧格式所要规定的内容。