1.CAN通讯有套国际标准,套协议版本号,种故障状态,种数据帧类型,种总线错误类型。

2.CAN的国际标准有两种ISO11898和ISO11519。

3.CAN2.0协议分为A版和B版两种,A版协议仅支持11位标识符(称为标准帧),B版协议兼容11位,向上扩展到19位标识符(称为扩展帧)。

4.CAN总线中。不论什么一个节点发生了错误,那么这个节点可能处于3种故障状态:错误主动状态,错误被动状态,离线状态。

错误主动状态:能够正常參加总线通讯,检測出错误时。输出主动错误标志。错误被动状态:是易引起错误的状态,尽管能參加总线通讯。但为最好还是碍其他节点通讯,接收时不能积极的发送错误通知,处于被动错误状态的节点即时检測出错误,而其他处于主动错误状态的节点假设没有发现错误。整个总线也被觉得没有错误。

离线状态:不能參加总线通讯的状态。

4.CAN总线中有5类错误。这5类错误并不具有排他性,能够同一时候发生。CAN总线在随意时刻,仅仅有一个节点在发送数据,其它全部节点都是在接收,仅仅有相应的ID报文节点对接收的报文做出应答反应。

5.位错误(Bit Error):节点是边发送边检听相应的位,发送的位和检測的位假设不一致,则检測到一个位错误。

6.填充错误(Stuff Error)监听到6个连续同样的为电平时。则检測到一个位填充错误。

7.CRC错误(CRC Error)发送节点会对报文的帧起始,仲裁场。数据场进行CRC计算。求出CRC校验码,并将其也发送出去。接收节点在接收到数据后,会依据CRC校验码来推断接收到的数据在传送过程中是否出错。

8.形式错误()一个固定形式的位场中含有非法位时。则检測到一个形式错误。

9.应答错误()仅仅要在应答期间所监听的位不为显性。则发送器检測到一个应答错误。

应答场包含应答位和应答分隔符。发送节点发送的这两位均为隐性电平,这时仅仅有正确接收报文的接收节点发送显性电平来覆盖它。

11.串口通信是一对一的通信。SPI的通信是一对多的通信。

CAN的一大特点,多主机串行通信:也就是在总线空暇时,全部单元都能够发送消息。最先訪问的节点能够获得发送权,若多个节点觉得自己获得发送权同一时候開始发送数据时,依据ID的优先级来竞争总线的发送权。总线上的节点没有类似于MAC物理地址的信息,所以在总线上增减单元时,连接在总线上的其它单元的软硬件及应用层都不须要改变。

单元依据报文ID决定接收或者屏蔽该报文,报文ID在一定程度上也决定了此帧数据的优先级,发送的信息遭到破坏后。可自己主动重发。节点在错误严重的情况下具有自己主动退出总线的功能。

12.CAN总线上全部的节点都能够检測错误。检測出错误的单元会立马通知其它全部单元。

正常发送的节点一旦检測出错误,会强制结束当前的发送,强制结束发送的节点会不断重复的发送此信息直到成功发送为止,或进入总线关闭状态。

13.CAN总线上的信号使用差分电压进行传送,两条信号线被称为CAN_H 和CAN_L,静态时均是2.5v左右。这时的状态表示逻辑1,也称为隐性电平。通常CAN_H为3.5,CAN_L为1.5时。表示为逻辑0。称为显性电平。

14.DSP的CAN模块的引脚在发送数据的同一时候。其接受引脚也在监听所发送的数据。也就是,发送数据的时候。接受引脚上也会有对应的波形能够在示波器上显示。假设CAN总线上仅仅有发送节点。却没有接受节点。那么这个发送节点会一直发送数据直到发送成功为止,也就是收到有效的应答信号。

15.CAN协议里对ACK(应答场)有例如以下的描写叙述:

应答场长度为2 个位。包括应答间隙(ACK SLOT)和应答界定符(ACK DELIMITER)。

在应答场里,发送站发送两个“隐性”位。当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK SLOT)期间(发送ACK 信号)向发送器发送一“显性”的位以示应答。

15.应答间隙:全部接收到匹配CRC 序列(CRC SEQUENCE)的站会在应答间隙(ACK SLOT)期间用一“显性”的位写入发送器的“隐性”位来作出回答。ACK 界定符:ACK 界定符是ACK 场的第二个位,而且是一个必须为“隐性”的位。因此,应答间隙(ACK SLOT)被两个“隐性”的位所包围。也就是CRC 界定符(CRC DELIMITER)和ACK 界定符(ACK DELIMITER)。

16.在CAN协议的错误检測部分有这种描写叙述:

位错误:站单元在发送位的同一时候也对总线进行监视。假设所发送的位值与所监视的位值不相符合,则在此位时间里检測到一个位错误(BIT ERROR)。

可是在仲裁场(ARBITRATION FIELD)的填充位流期间或ACK间隙(ACK SLOT)发送一“隐性”位的情况是例外的—— 此时。当监视到一“显性”位时。不会发出位错误(BIT ERROR)。应答错误:仅仅要在ACK 间隙(ACK SLOT)期间所监视的位不为“显性”。则发送器会检測到一个应答错误(ACKNOWLEDGMENT ERROR)。

17.发送者在发送的同一时候,会监视总线上的数据,假设与发送的娄据不一致,则表示发送失败或自己失去仲裁,马上停止发送或转入接收模式。假设有一个节点在ACK SLOT的时间内发送“显性”位。则发送者觉得此次发送报文成功。假设发送者检測到ACK SLOT为隐性位。则表示没有节点填充ACK SLOT。则发送者会检測到这个隐性位而知道发送失败。此条报文须要重发。所以,当总线上仅仅有一个节点的时候,或是仅仅有一个节点能够收发数据的时候。这个节点是发不出去数据的,由于它所发出的数据帧中的ACK SLOT没有另外一个节点来填充,将永远是隐性位,这个节点会一直重发数据直到发送成功或发送被取消。

18.(注:一:总线上仅仅有一个节点并且它向外发送了数据。它确实不会收到不论什么ACK。它会变成“error passive”可是它不会变成BUS off。why?请參考CAN specificaton 2.0-partB-Fault_Confinement--rule3--exception1 二:其他检測到CRC错误的节点不会立即发送错误帧,而是在ACK delimiter之后才发送。请參考CAN specificaton 2.0-partB-Error_Signalling)

19.ACK SLOT仅仅有一个BIT,而接下去的ACK delimiter始终为隐性(我们可觉得是1),当数据到达ACK SLOT的时候。全部的节点都会发送显性位(我们能够觉得是0),而发送者在ACK这个时间里保持隐性位(即发送者在发送的时候ACK SLOT 为1),这时发送者会检測总线上的ACK时间内的信号,假设是0,则表示正确,假设是1,表示有错误。假设其中有某一个节点在ACK SLOT填入隐性位,则总线上相同还是显性位电平,故仅仅要总线上有一个节点正确接收到数据。则ACK SLOT就会被填入显性电平;那么,接收错误的节点怎样来告知发送者此次发送不成功呢?这时候就要用到CAN的错误帧,当一个接收者收到错误的数据的时候,它马上開始发送一个错误帧。则接下去总线上的信号就是这个错误帧。其他的节点和发送者也都会收到这个错误帧,那全部的节点都知道出错了,接收者会丢掉此次消息,而发送者会试图重发此次消息。这才是ACK SLOT真正的含义。

20.我们觉得,发送者在发数据的时候。CANTX在发送数据,而CANRX同一时候也在接收数据,当发送者发送ACK为隐性时。接收到的ACK SLOT一定要是显性才会正确。那么。当有节点正确接收到了数据。在ACK SLOT填上显性位后,接收错误的节点这时候会怎样呢?接收错误的节点就会立即发送错误帧,通常是发送连续的6个0或1。依据CAN的位填充原理,当有五个连续的0或1出现时,为了传送中的同步,必须插入一个反相位的BIT作为填充位,假设连续出现6个或以上的同样信号,则此次传送错误,数据将被丢弃。故当发送者收到这个错误帧后,便会知道发送出错。并试图重发数据。

CAN通讯的总结的更多相关文章

  1. HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术

    最近做项目在前端我使用了很多新技术,这些技术有bootstrap.angularjs,不过最让我兴奋的还是使用了HTML5的技术,今天我想总结一些HTML5的技术,好记性不如烂笔头,写写文章可以很好的 ...

  2. (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)

    1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...

  3. (转)linux下和云端通讯的例程, ubuntu和openwrt下实验成功(二)

    前言: 上节用纯linux的函数实现了和云端通讯, 本节开始利用传说中的神器libcurl 话说一个网络程序员对书法十分感兴趣,退休后决定在这方面有所建树. 于是花重金购买了上等的文房四宝.    一 ...

  4. (转)linux下和云端通讯的例程, ubuntu和openwrt实验成功(一)

    一.  HTTP请求的数据流总结#上传数据, yeelink的数据流如下POST /v1.0/device/4420/sensor/9089/datapoints HTTP/1.1Host: api. ...

  5. 用SignalR 2.0开发客服系统[系列1:实现群发通讯]

    前言 交流群:195866844 先说一下我为什么会写这个博客吧,(首先说一下,我是一个小菜鸟,讲的不好请指导 - -,)  前段时间公司的项目涉及到在B/S上使用即时通讯,(其实就是做一个B/S的客 ...

  6. 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]

    前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 真的很感谢大家的支持,今天发表系列3 ...

  7. 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)

    我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...

  8. 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)

    今天没有延续上一篇讲的内容,穿插一段小插曲,WebSocket 实时数据通讯同步的问题,今天我们并不是很纯粹地讲 WebSocket 相关知识,我们通过 WebGL 3D 拓扑图来呈现一个有趣的 De ...

  9. 利用WCF的双工通讯实现一个简单的心跳监控系统

    何为心跳监控系统? 故名思义,就是监控某个或某些个程序的运行状态,就好比医院里面的心跳监视仪一样,能够随时显示病人的心跳情况. 心跳监控的目的是什么? 与医院里面的心跳监视仪目的类似,监控程序运行状态 ...

  10. 利用WCF双工模式实现即时通讯

    概述 WCF陆陆续续也用过多次,但每次都是浅尝辄止,以将够解决问题为王道,这几天稍闲,特寻了些资料看,昨晚尝试使用WCF的双工模式实现了一个简单的即时通讯程序,通过服务端转发实现客户端之间的通讯.这只 ...

随机推荐

  1. undefined 与void 0

    参考:https://segmentfault.com/a/1190000000474941 Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值.void 操作符用法 ...

  2. javascript中toString和valueOf方法的区别

    toString():将对象转为字符串 valueOf():获取对象的原始值, 1.针对基本类型的变量:如在string,number,boolean类型的变量上调用这两个方法时,直接返回原始值,即变 ...

  3. js 切换全屏

    公司有一个需求就是点击某一个按钮实现全屏切换功能,然后呢我就在网上扒了段代码.封装了一下.使用的小伙伴们可以看看哦! 切换全屏代码 <!DOCTYPE html> <html> ...

  4. 接受第三方app分享的数据

    前段时间公司项目需要一个需求: 把第三方的app分享的数据接受到自己的apk中, 涉及到的第三方app是: Youtube/Amazon/NetFlix, 这些app通过分享功能把当前的信息分享出去. ...

  5. Hive 学习笔记(启动方式,内置服务)

    一.Hive介绍 Hive是基于Hadoop的一个数据仓库,Hive能够将SQL语句转化为MapReduce任务进行运行. Hive架构图分为以下四部分. 1.用户接口 Hive有三个用户接口: 命令 ...

  6. 前端必须收藏的CSS3动效库!!!

    现在的网站和App的设计中越来越重视用户体验,而优秀的动效则能使你的应用更具交互性,从而吸引更多用户的使用. 如果你对CSS3中定义动效还不熟练,或希望采用更加简单直接的方式在你的应用中引入动效的话, ...

  7. cgg之字面值

    字面值时源代码中用来描述固定值的记号,可能是整数.浮点数.字符或者字符串 2.1 整数常量 除了常见的十进制数外,还有八进制(以数字0开头)或者十六进制(0x/0X)表示法. #include < ...

  8. canvas三环加载进度条

    之前做了一个三个圆形叠加在一起的加载,用的是定位和cile来操作,但是加载的头部不能是圆形.后来用canvas做了一个,但是这个加载的进度不好调整,原理很简单,就是让一个圆,按照圆形轨迹进行运动就可以 ...

  9. linux环境

    vim命令 http://www.cnblogs.com/softwaretesting/archive/2011/07/12/2104435.html 安装YouCompleteMe 按照百度搜索的 ...

  10. PHP编辑器PhpStrom运行缓慢问题

    最近在使用phpstorm开发项目的时候,在加载文件运行时,不管有多大,如果项目文件数据比较多的话,都能够让phpstorm卡到死机.其中调整过内存设置,关闭过动态提示,使用过phpstorm的安全模 ...