大家好,由于近段时间有几个同事和小伙伴问到了CAN网络的问题,所以我打算还是先出一篇关于CAN网络协议的文章来交流与学习。
首先,关于CAN的一些基本定义我认为还是有必要写一下的,不管是对以后工作还是面试我认为都是有用的。总的来说, CAN总线有2种架构(ISO-11898 和 ISO-11519),CAN信号有2种形式(显和隐),CAN信号发送和接收2个过程,下面我们来一个一个说明。
- CAN总线协议是一种ISO 国际标准化的串行通信协议
- 有 ISO-11898 和 ISO-11519两个系列
- ISO-11898 定义了通信速率为 125 kbps ~1Mbps 的高速 CAN 通信标准,属于闭环总线,传输速率可达1Mbps,总线长度 ≤ 40米,ISO-11898总结:通信速率传输速率高长度短。这是我目前使用最多的系列
- ISO11519 定义了通信速率为 10~125 kbps 的低速 CAN 通信标准,属于开环总线,传输速率为40kbps时,总线长度可达1000米,ISO11519总结:通信速率传输速率低总线长度长。
3. CAN_H和CAN_L线是使用双绞屏蔽线,防止总线干扰过大
4. CAN总线上,信号表现为电压形式,通过CAN_H和CAN_L线上的电位差来表示CAN信号,分为显性电平(dominant)和隐性电平(recessive)两种类型。其中显性电平规定为逻辑0,隐性电平则为逻辑1。这个显现电平和隐线电平逻辑可能有点绕,我们字面一般逻辑显现为1,但是这里不是。怎么记住呢。我们可以这样记:隐性电平代表无数据传输,显性信号代表有数据传输
5. CAN总线上的所有节点没有主从之分,反应在数据传输上是:在总线空闲状态下,任意节点都可以向总线上发送信息。另外:最先向总线发送信息的节点获得总线的发送权;当多个节点同时向总线发送消息时,所发送消息的优先权高的那个节点获得总线的发送权。这个在没本书上面都有解释,也很好理解。
6. 在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。(简单一句话理解:双方必须需要在同一频道交流,不然沟通就有障碍)
7. 标准格式和扩展格式,至于这两种在我之前的文章中就有介绍。这里不做多解释
注意:帧起始位及时帧开始的段,1个位的显性位。为什么帧起始位为0,因为总线空闲时为隐性位,故帧起始以显性位非常好识别
仲裁段位表示就是根据报文ID来确定其发送优先级,从SOF位开始,从左往右 逐位比较,只要出现位不一样,比较就结束,显性电平者胜出,有权发送
数据段位要注意摩托罗拉流和英特尔流,其实及时大端模式和小端模式, 1.大端模式的优点:符号位的判定固定为第一个字节,容易判断正负
。
2.小端模式的优点:强制转换数据不需要调整字节
内容
帧的结束的段。由7个位的隐性位构成
8. 错误帧在这里我需要多花点篇章进行讲解,因为我最近在一个项目中遇到了错误帧问题
1.位填充(Bit Stuffing):位填充是为防止突发错误而设定的功能。当同样的电平持续5位则添加一个位的反型数据位
2.错误类型
3.错误处理:错误状态的种类有:主动错误状态(6个位的显性位),被动错误状态(6个位的隐性位)和总线关闭态3种状态。单元始终处于3种状态之一。
9. 位时序我在前面文章中也讲到了,但是我认为这是在面试中比较容易被问到的一个点,所以这里在来讲一讲。具体来说,将一个位分为4段(同步,传播时间段,相位缓冲1,相位缓冲2),如上图所示。这些段又由可称为Time Quantum(以下称为Tq)的最小时间单位构成。1位分为4个段,每个段又由若干个Tq构成,这称为位时序。1位由多少个Tq构成,每个段又由多少个Tq构成等,可以任意设定位时序,一般采样点在80%点处。
来我们使用微芯来进行讲解:先通过数据手册找到寄存器