CAN通信示例

CAN的波特率及位同步

由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯,CAN还会使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。

时序位同步

CAN协议把每一个数据位的时序拆分成4段,分别为SS段、PTS段、PBS1段、PBS2段,这4段的长度加起来即为一个CAN数据位的长度。拆分后最小的时间单位是Tq,而一个完整的位由8~25个Tq组成。

图中表示的CAN通讯信号每一个数据位的长度为19Tq,其中SS段占1Tq,PTS段占6Tq,PBS1段占5Tq,PBS2段占7Tq。信号的采样点位于PBS1段与PBS2段之间,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样。

SS段(SYNC SEG)

SS译为同步段,若通讯节点检测到总线上信号的跳变沿被包含在SS段的范围之内,则表示节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。SS段的大小固定为1Tq。

PTS段(PROP SEG)

PTS译为传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS段的大小可以为1~8Tq。

PBS1段(PHASE SEG1)

PBS1译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBS1段的初始大小可以为1~8Tq。

PBS2段(PHASE SEG2)

PBS2这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。PBS2段的初始大小可以为2~8Tq。

通信波特率

总线上的各个通讯节点只要约定好1个Tq的时间长度以及每一个数据位占据多少个Tq,就可以确定CAN通讯的波特率。

例如,假设上图中的1Tq=1us,而每个数据位由19个Tq组成,则传输一位数据需要时间T1bit =19us,从而每秒可以传输的数据位个数为:

1x106­/19 = 52631.6 (bps)

这个每秒可传输的数据位的个数即为通讯中的波特率。

CAN通讯帧的类型

数据帧:用于发送单元向接收单元传送数据的帧

遥控帧:用于接收单元向具有相同 ID 的发送单元请求数据的帧

错误帧:用于当检测出错误时向其它单元通知错误的帧

过载帧:用于接收单元通知其尚未做好接收准备的帧

间隔帧:用于将数据帧及遥控帧与前面的帧分离开来的帧

数据帧的结构

数据帧以一个显性位(逻辑0)开始,以7个连续的隐性位(逻辑1)结束,在它们之间,分别有仲裁段、控制段、数据段、CRC段和ACK段。

数据帧由 7 段构成,即:

(1) 帧起始。表示数据帧开始的段。

(2) 仲裁段。表示该帧优先级的段。

(3) 控制段。表示数据的字节数及保留位的段。

(4) 数据段。数据的内容,一帧可发送 0~8 个字节的数据。

(5) CRC 段。检查帧的传输错误的段。

(6) ACK 段。表示确认正常接收的段。

(7) 帧结束。表示数据帧结束的段。

帧起始

SOF段(Start Of Frame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平,它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。

仲裁段

当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输。

仲裁段的内容主要为本数据帧的ID信息(标识符),数据帧具有标准格式和扩展格式两种,区别就在于ID信息的长度,标准格式的ID为11位,扩展格式的ID为29位,它在标准ID的基础上多出18位。

在CAN协议中,ID起着重要的作用,它决定着数据帧发送的优先级,也决定着其它节点是否会接收这个数据帧。CAN协议不对挂载在它之上的节点分配优先级和地址,对总线的占有权是由信息的重要性决定的,即对于重要的信息,要将其指定为优先级高的ID,使它能够及时地发送出去。

也正因为它这样的优先级分配原则,使得CAN的扩展性大大加强,在总线上增加或减少节点并不影响其它设备。

报文的优先级,是通过对ID的仲裁来确定的。根据前面对物理层的分析我们知道如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平,CAN正是利用这个特性进行仲裁。

若两个节点同时竞争CAN总线的占有权,当它们发送报文时,若首先出现隐性电平,则会失去对总线的占有权,进入接收状态。在开始阶段,两个设备发送的电平一样,所以它们一直继续发送数据。到了图中箭头所指的时序处,节点单元1发送的为隐性电平,而此时节点单元2发送的为显性电平,由于总线的“线与”特性使它表达出显示电平,因此单元2竞争总线成功,这个报文得以被继续发送出去。

仲裁段ID的优先级也影响着接收设备对报文的反应。因为在CAN总线上数据是以广播的形式发送的,所有连接在CAN总线的节点都会收到所有其它节点发出的有效数据,因而CAN控制器大多具有根据ID过滤报文的功能,它可以控制自己只接收某些ID的报文。

RTR位(Remote Transmission Request Bit)

译作远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。

IDE位(Identifier Extension Bit)

译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。

SRR位(Substitute Remote Request Bit)

只存在于扩展格式,它用于替代标准格式中的RTR位。由于扩展帧中的SRR位为隐性位,RTR在数据帧为显性位,所以在两个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。

控制段

在控制段中的r1和r0为保留位,默认设置为显性位。其中最重要的是DLC段(Data Length Code),译为数据长度码,它由4个数据位组成,表示本报文中的数据段占多少字节,DLC段表示的数字为0~8。

数据段

数据段为数据帧的核心内容,它是节点要发送的原始信息,由0~8个字节组成,MSB先行(高位在前低位在后)。

CRC段

主要用于校验传输的报文是否正确,CAN的报文包含了一段15位的CRC校验码,一旦接收节点算出的CRC码跟接收到的CRC码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC部分的计算一般由CAN控制器硬件完成,出错时的处理则由软件控制最大重发数。

在CRC校验码之后,有一个CRC界定符,它为隐性位,主要作用是把CRC校验码与后面的ACK段间隔起来。

ACK段

ACK段包括一个ACK槽位,和ACK界定符位。类似I2C总线,在ACK槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在ACK槽和帧结束之间由ACK界定符间隔开。

帧结束

EOF段(End Of Frame),译为帧结束,帧结束段由发送节点发送的7个隐性位表示结束。

CAN通信标准规格

CAN通信(2)——CAN通信协议层相关推荐

  1. STM32:RS485通信和Modbus通信协议汇总

    RS485通信和Modbus通信协议汇总 1. 主从模式 RS-485上的软件层协议ModBus主要依赖于主从模式.主从模式是指在半双工通讯方式上,2个或者2个以上的设备组成的通讯系统中: (1) 至 ...

  2. Android10.0 Binder通信原理(八)-Framework层分析

    摘要:本节主要来讲解Android10.0 Binder 在Framework的使用分析 阅读本文大约需要花费15分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,An ...

  3. 干货分享:RS485通信和Modbus通信协议汇总

    https://zhuanlan.zhihu.com/p/24134130 在工业控制.电力通讯.智能仪表等领域,通常情况下是采用串口通信的方式进行数据交换.最初采用的方式是RS232接口,由于工业现 ...

  4. 交通运输部·车载导航系统——终端如何与服务器通信——玩转通信协议(源码下载)...

    一.引子与协议说明 之前开发了一个项目--车载导航系统.遇到的第一个问题就是硬件设备如何与服务器通信. 关键在于通信协议! 众所周知:要想实现通信,首先通信双方就要达成通信协议. 话不多说,且看协议: ...

  5. Dubbo——通信框架与通信协议(dubbo协议)原理

    摘要 Dubbo 并没有自己实现一套完整的网络库,而是使用现有的.相对成熟的第三方网络库,例如,Netty.Mina 或是 Grizzly 等 NIO 框架.我们可以根据自己的实际场景和需求修改配置, ...

  6. 工业总线通信与OSI七层模型

    OSI七层模型 分层 应用层是什么协议,不受底层的影响.比如CANopen的底层可以是Ethercat,也可以是CAN Bus. 同样,串行通信的底层可以是485也可以是232. 485自动收发电路 ...

  7. 6部10层电梯程序,采用以太网通信 6部10层电梯程序,包含各个功能模块

    6部10层电梯程序,采用以太网通信. 2019年西门子智能制造挑战赛, 6部10层电梯程序,包含各个功能模块. 采用博途软件V14 sp1编程, 采用以太网通信,控制器选用PLC S7-1200. 主 ...

  8. 内网安全 隐藏通信隧道技术——传输层.(遨游于 内网任何主机)

    隐藏通信隧道技术. 隐藏通信隧道就是一种 绕过端口屏蔽的通信方式.防火墙两端的数据包通过防火墙所允许的数据包类型或者端口进行封装,然后穿过防火墙,与对方进行通信.当被封装的数据包到达目的地时,将数据包 ...

  9. 基于8086简易电子琴系统仿真设计-基于8086红外自动门控制系统设计-基于单片机8x8矩阵键盘两机串口通信-基于单片机8层电梯控制系统仿真设计-基于单片机ADC0809和DAC0832模数和数模设计

    1189基于8086简易电子琴系统仿真设计-设计资料 编写一实现电子琴的程序,并实现若干扩展功能. 基本功能:用键盘输入对应的七个音阶,通过实验箱的喇叭发出声音,并通过七段数码管显示输入音阶: 扩展功 ...

  10. socket通信和websocket通信协议

    socket通信 网络上的两个程序通过一个双向的通信链接实现数据的交换,这个链接的一端称为一个socket socket通信流程图 服务器端通过创建一个socket的通信链接,然后绑定socket和端 ...

最新文章

  1. 自定义字符串查找函数c语言,(C语言自定义函数,/*编写函数实现在字符串pStr中查找子串pSub int subString( char* pStr, char* pSub);...
  2. 【瓜分5000元奖金】Wannafly挑战赛13
  3. 基础知识—数据类型-数据的输出与输入
  4. 【22】Vue 之 Vue Devtools
  5. arcgis 快速制图插件_AutoCAD操作+视频教程+辅助工具和插件,限时分享无套路
  6. 致每一位Java初学者
  7. 修改安卓移植类型RPG游戏存档
  8. 文华财经多个非常实用的期货指标公式,文华财经支撑压力自动画线公式
  9. 《HTML CSS JavaScript 网页制作》第六章-创建框架结构网页
  10. Linux下修改MTU值
  11. GWAS 教程之QC
  12. AI实现的两种方案,暴力推演与因果率
  13. 康威定律,作为架构师还不会灵活运用?
  14. 蔡颖-《APS走向实践》书解读之二:需求驱动-预测、掌握、满足需求
  15. 未启用对服务器的远程访问
  16. c语言变量按作用域范围分两种,第02天C语言(10):变量-作用域
  17. 火山视窗读写ini文件,写配置项与读配置项使用
  18. 使用这10个随机网站生成器来丰富浏览器的首页
  19. php 缓冲区溢出漏洞,在Linux 容器中对php-fpm缓冲区溢出漏洞的复现分析 ( CVE-2019-11043 )...
  20. Happens-before 是啥

热门文章

  1. 无法找到资源编辑器dll
  2. VSTO 实现word的多级列表功能
  3. Gerber文件各层的介绍
  4. Win7 专业版安装中文包、汉化处理
  5. 教你实战Flutter Deskstop之Tinypng(熊猫图片压缩)GUI工具
  6. 2011全年腾讯移动安全实验室手机病毒行业报告
  7. PHP 微信小程序 WebSocket MySQL Redis实现聊天功能
  8. win8.1 安装kb2999226 一直提示 搜索更新
  9. 计算机桌面桌面设置动态视频教程,如何在计算机上设置动态桌面?电脑设置动态视频桌面图形教程...
  10. python获取无忧网的招聘数据