对Socket CAN的理解(1)——【CAN总线原理】

2023-05-16

转载请注明出处:http://blog.csdn.net/Righthek 谢谢!


由于Socket CAN涉及到CAN总线协议、套接字、Linux网络设备驱动等。因此,为了能够全面地了解Socket CAN的原理。我们需要了解以下几个方面的知识点:

(1)CAN总线协议;

(2)Socket原理;

(3)Linux网络设备驱动;

当熟悉以下三个方面的知识点后,我们再去分析基于Linux的Socket CAN的驱动。这样的话理解起来更加容易、易懂。

(4)Socket CAN的驱动;

一、CAN总线协议

由于CAN总线协议的内容太多,作为博文来说,不适宜很详细的讲解。需要深入了解的朋友们可以Google一下。以下只是作些简要的说明。

CAN是ControllerArea Network(控制器局域网)的缩写。CAN通信协议在1986年由德国电气商博世公司所开发,主要面向汽车的通信系统。现已是ISO国际标准化的串行通信协议。根据不同的距离、不同的网络,可配置不同的速度,最高速度为1MBit/s。

         CAN被细分为三个层次:

                   1CAN对象层(the object layer);

                   2CAN传输层(the transfer layer);

                   3CAN物理层(the phyical layer);

对象层和传输层包括所有由ISO/OSI模型定义的数据链路层的服务和功能。

对象层的作用范围包括:

(1)查找被发送的报文。

(2)确定由实际要使用的传输层接收哪一个报文。

(3)为应用层相关硬件提供接口。

传输层的作用主要:

(1)传送规则,也就是控制帧结构、执行仲裁、错误检测、出错标定、故障界定。

(2)总线上什么时候开始发送新报文及什么时候开始接收报文,均在传输层里确定。

(3)位定时的一些普通功能也可以看作是传输层的一部分。

(4)传输层的修改是受到限制的。

物理层的作用:

在不同节点之间根据所有的电气属性进行位信息的实际传输。当然,同一网络内,物理层对于所有的节点必须是相同的。尽管如此,在选择物理层方面还是很自由的。

                        图1  CAN协议所对应的ISO模型

CAN具有以下的属性:

(1)报文(Messages):简单来说就是具有固定格式的数据包。

(2)信息路由(Information Routing):即,报文寻找结点的方式。

(3)位速率(Bit rate):数据位的传输速度。

(4)优先权(Priorities):即报文发送的优先权。

(5)远程数据请求(Remote Data Request):通过发送远程帧,需要数据的节点可以请求另一节点发送相应的数据帧。

(6)多主机(Multimaster):总线空闲时,任何结点都可以开始传送报文。

(7)仲裁(Arbitration):当2个及以上的单元同时开始传送报文,那么就会有总线访问冲突。仲裁是确定哪个单元的具有发送优先权。

(8)安全性(Safety):CAN的每一个节点均采取了强有力的措施以进行错误检测、错误标定及错误自检。

(9)错误检测(Error Detection):包括监视、循环冗余检查、位填充、报文格式检查。

(10)错误检测的执行(Performance of Error Detection)

(11)错误标定和恢复时间(Error Sinalling and Recovery Time):任何检测到错误的结点会标志出已损坏的报文。此报文会失效并将自动地开始重新传送。如果不再出现新的错误,从检测到错误到下一报文的传送开始为止,恢复时间最多为29个位的时间。

(12)故障界定(Fault Confinement):CAN结点能够把永久故障和短暂扰动区分开来。永久故障的结点会被关闭。

(13)连接(Connections):CAN串行通讯链路是可以连接许多结点的总线。理论上,可连接无数多的结点。但由于实际上受延迟时间或者总线线路上电气负载的影响,连接结点的数量是有限的。

(14)单通道(Single Channel):总线是由单一进行双向位信号传送的通道组成。

(15)总线值(Bus value):总线可以具有两种互补的逻辑值之一:“显性”(可表示为逻辑0)或“隐性”(可表示为逻辑1

(16)应答(Acknowledgment):所有的接收器检查报文的连贯性。对于连贯的报文,接收器应答;对于不连贯的报文,接收器作出标志。

(17) 睡眠模式/唤醒(Sleep Mode / Wake-up):为了减少系统电源的功率消耗,可以将CAN器件设为睡眠模式以便停止内部活动及断开与总线驱动器的连接。CAN器件可由总线激活,或系统内部状态而被唤醒。

1、CAN总线的报文格式

CAN传输的报文,可分为五种类型:

(1)数据帧:用于发送结点向接收结点传送数据的帧。

(2)远程帧:总线结点发出远程帧,请求发送具有同一识别符的数据帧。

(3)错误帧:任何结点检测到一总线错误就发出错误帧。

(4)过载帧:过载帧用以在先行的和后续的数据帧(或远程帧)之间提供一附加的延时。

(5)帧间隔:用于将数据帧及远程帧与前面的帧分离开来的帧。

数据帧由7个不同的位场组成:

帧起始仲裁场控制场数据场CRC场ACK场帧结束

数据帧有标准格式和和远程格式,以下是其格式表示:


                                                 图2    数据帧格式

远程帧由6个不同的位场组成:

帧起始仲裁场控制场CRC场ACK场帧结束

         远程帧没有数据帧的数据场,以下是其格式表示:


                                        图3    远程帧格式

错误帧用于在接收和发送消息时检测出错误,通知错误的帧。错误帧由错误标志和错误界定符构成。

错误标志包括主动错误标志和被动错误标志两种。

主动错误标志:6个位的显性位,处于主动错误状态的单元检测出错误时输出的错误标志。

被动错误标志:6个位的隐性位,处于被动错误状态的单元检测出错误时输出的错误标志。

错误界定符由8个位的隐性位构成。

错误帧格式如下表示:



                                       图4    错误帧格式

过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。过载帧格式如下表示:



                                         图5    过载帧格式

帧间隔是用于分隔数据帧和远程帧的帧。数据帧和远程帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、远程帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间隔。帧间隔如下图所示:



                                    图6    帧间隔格式

2、CAN总线的仲裁方式

         在总线空闲态,最先开始发送消息的单元获得发送权。多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。即逐位地对比各个结点发出的报文ID。由于线与的关系,显示位“0”可以覆盖隐性位“1”,因此ID最小的节点赢得仲裁,总线上表现为该结点的报文,其他结点失去仲裁,退出发送,转为接收状态。

标准格式ID与具有相同ID的远程帧或者扩展格式的数据帧在总线上竞争时,标准格式的RTR位为显性位的具有优先权,可继续发送。



                                              图7    仲裁方式

3、位填充(BitStuffing)

         位填充是为了防止突发错误而设定的功能。位填充的规则如下:

(1)5位连续相同电平之后,必须填充一位反向位,即不允许有6个连续相同位;

(2)SOF之前为总线空闲状态,不需要同步,因此不需要位填充;

(3)CRC之后为固定格式,不允许填充;

(4)由CAN控制器自动实现;

4、CAN的错误处理

CAN控制器检测错误共有以下5种:

(1)位填充错误;

在使用位填充的帧场内,结点如果检测到6个连续相同的位值,则产生位填充错误,在下一位开始时,该结点将发送一个错误帧。

(2)位错误;

在发送期间,结点检测到总线的位值与自身发送的位值不一致时,则产生位错误,在下一位开始时,该结点将发送一个错误帧。

(3)CRC错误;

接收结点计算的CRC码与数据帧本身自带的CRC码不一致,接收结点将丢弃该帧,并在ACK界定符之后发送一个错误帧。

(4)应答错误;

发送结点在ACK Slot位会发送隐性位,同时监听总线是否为显性位,如果是显性位,则表明至少一个节点正确收到该帧;如果是隐性位,将产生ACK错误,发送结点发送一个错误帧。

(5)格式错误;

发送结节在(CRC界定符、ACK界定符、帧结束EOF)固定格式的位置检测到显性位时,将发生格式错误,并发送一个错误帧。

         5、CAN总线同步

         CAN总线的通信方式为NRZ方式。各个位的开关或者结尾都没有附加同步信号。发送结点以与位时序同步的方式开始发送数据。另外,接收结点根据总线上电平的变化进行同步并进行接收工作。

         但是,发送结点和接收结点存在的时钟频率误差及传输路径上的(电缆、驱动器等)相位延迟会引进同步偏差。因此接收结点需要通过同步的方式调整时序进行接收。

         同步的作用是尽量使本地位时序与总结信号的位时序一致(本地同步段与总结信号边沿同步)。只有接收结点需要同步;同步只会发生在隐性到显性电平的跳沿。

         同步的方式为硬件同步和再同步。


以上是CAN总线协议的一些简要总结,不足之处,请指出,谢谢!下一篇文章将开始Socket原理的讲解。


转载请注明出处:http://blog.csdn.net/Righthek 谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对Socket CAN的理解(1)——【CAN总线原理】 的相关文章

  • CAN/CANFD 总线负载率及计算(源码和工具)

    CAN BUS的总线负载率是CAN总线架构协议设计时的一个重要的指标 一般建议负载率峰值不要高于80 平均负载率不要超过50 当然这只是一般建议 具体根据使用场景和系统设计而定 负载率定义 关于CAN负载率的定义和计算 很多文章写得不求甚解
  • 从0实现基于Linux socket聊天室-实现聊天室的登录、注册功能-3

    上一篇我们已经讲了如何搭建一个多线程的服务器模型 可以支持多个客户端同时连接服务器 本篇我们来实现多个客户端 如何实现向服务器注册信息 并实现登录的功能 想了解更多Linux 编程知识 请关注 公众号 一口Linux 数据结构 接着上一篇的
  • 如何实现在一个 Socket 应用程序中同时支持 IPv4 和 IPv6

    如何实现在一个 Socket 应用程序中同时支持 IPv4 和 IPv6 如何巧妙地设计代码结构 陈 鲁 软件工程师 IBM 孙 妍 软件工程师 IBM 简介 当今的网络主流是 IPv4 网络 但随着 IP 地址的日益短缺 IPv6 网络开
  • Socket -- udp

    接收者 完成System out println UDPProvider Started 作为接收者 指定一个端口用于数据接收 DatagramSocket ds new DatagramSocket 20000 构建接收实体 final
  • select 模型解释

    套接字模式 阻塞套接字和非阻塞套接字 或者叫同步套接字和异步套接字 套接字模型 描述如何对套接字的I O行为进行管理 Winsock提供的I O模型一共有五种 select WSAAsyncSelect WSAEventSelect Ove
  • Java NIO介绍(二)————无堵塞io和Selector简单介绍

    无堵塞IO介绍 既然NIO相比于原来的IO在读取速度上其实并没有太大区别 因为NIO出来后 IO的低层已经以NIO为基础重新实现了 那么NIO的优点是什么呢 NIO是一种同步非阻塞的I O模型 也是I O多路复用的基础 而且已经被越来越多地
  • STM32 CAN/CANFD软件快速配置(HAL库版本)

    STM32 CAN CANFD软件快速配置 HAL库版本 目录 STM32 CAN CANFD软件快速配置 HAL库版本 前言 1 软件编程 1 1 建立工程 1 2 初始化 1 2 1 引脚设置 1 2 2 CAN基本参数设置 1 2 3
  • 通过socket获取对方ip地址

    struct sockaddr in sa int len sizeof sa if getpeername sockfd struct sockaddr sa len printf 对方IP s inet ntoa sa sin addr
  • 使用socket判断http请求或http响应的传输结束

    使用socket判断http请求或http响应的传输结束 先把header直到 r n r n整个地收下来 1 传输完毕就关闭connection 即recv收到0个字节 2 有内容 if Transfer Encoding chunked
  • 网络编程——epoll

    参考 TCP IP网络编程 尹圣雨 epoll epoll也是Linux下实现I O复用的一种方法 其性能优于select 基于select的I O复用服务器的设计缺陷 调用select函数后 针对所有文件描述符的循环语句 调用select
  • Qt之TCP心跳包

    Qt之TCP心跳包 当Qt作为客户端程序 而服务器需要监控客户端的在线状态时 就需要Qt端发送心跳包 心跳包可以是TCP也可以是UDP 这里介绍TCP心跳包的实现方法 心跳包通常要单开一个线程 在进程运行的过程中一直执行 代码示例 h文件
  • Java实现一个简单的命令行聊天程序

    Socket编程 Java实现 客户端 package net import java io BufferedReader import java io InputStreamReader import java io PrintWrite
  • Socket_Tcp加密文件传输系统

    代码下载链接 Socket Tcp 原文链接 https blog csdn net weixin 45746588 article details 107683901 这是一个课程的作业 我是初学者 所以写完这个代码还是花了我好几周的时间
  • 【小练习】windows与linux进行socket文件传输

    在Windows与Linux使用socket通信基础上 添加文件传输功能 需要进行简单的交互 目录 程序效果 实现流程 样例代码 测试用例 参考资料 程序效果 Windows客户端可以从Linux服务器端索要文件 也可以发送文件至Linux
  • TCP/IP编程实现远程文件传输

    TCP IP编程实现远程文件传输 在TCP IP网络结构中 为了保证网络安全 网络人员往往需要在路由器上添加防火墙 禁止非法用户用ftp等安全危害较大的TCP IP协议访问主机 而有时系统维护人员需要用ftp将一些文件从中心机房主机传到前端
  • C++知识分享: Socket 编程详解,万字长文

    介绍 Socket编程让你沮丧吗 从man pages中很难得到有用的信息吗 你想跟上时代去编Internet相关的程序 但是为你在调用 connect 前的bind 的结构而不知所措 等等 好在我已经将这些事完成了 我将和所有人共享我的知
  • AF_INET和PF_INET的区别

    在写网络程序的时候 建立TCP socket一般是这样的 sock socket PF INET SOCK STREAM 0 然后在绑定本地地址或连接远程地址时需要初始化sockaddr in结构 其中指定address family时一般
  • SocketOutputStream和SocketChannel write方法的区别和底层实现

    Java直接内存原理提到了SocketChannel write的实现原理 通过IOUtil write将java堆内存拷贝到了直接内存 然后再把地址传给了I O函数 那么 BIO 是怎么实现往socket里面写数据的呢 BIO Socke
  • STM32F407 CAN1 CAN2

    注意CAN1可以单独使用 CAN2要开启CAN1时钟才能使用 u8 CAN1 Mode Init u8 mode GPIO InitTypeDef GPIO InitStructure CAN InitTypeDef CAN InitStr
  • 功放诊断测试

    1 切换trace显示时间模式 Toggle time mode 2 测seedkey 需要加载seednkey dll 3 功能寻址和物理寻址切换

随机推荐

  • 系统监控命令

    top命令 top c 在top命令显示界面显示出完整的进程名和启动参数 top H 在top命令中显示所有的线程 状 top p pid 这个pid可以是进程pid 也可以是线程pid 进程的pid就是该进程主线程的pid 该命令实际显示
  • 一个对齐关键字pack引起的副作用

    今天遇到一个很典型的因为没有留意pack关键字有效范围而引起的程序bug xff0c 觉得很有意思 xff0c 就记录下来 现象如下 xff1a 声明了一个数据结构 struct st data xff0c 这个数据结构中有一个成员是一个函
  • 什么是物联网?发展前景如何?

    物联网其实是互联网的一个延伸 xff0c 互联网的终端是计算机 PC 服务器 xff0c 我们运行的所有程序 xff0c 无非都是计算机和网络中的数据处理和数据传输 xff0c 除了计算机外 xff0c 没有涉及任何其他的终端 硬件 物联网
  • Linux上压缩文件的 5 种方法

    在 Linux 上有不少用于压缩文件的命令 最新最有效的一个方法是 xz xff0c 但是所有的方法都有节省磁盘空间和维护备份文件供以后使用的优点 在这篇文章中 xff0c 我们将比较这些压缩命令并指出显著的不同 tar tar 命令不是专
  • 新手如何从零开始学习unity

    自从 unity5发布免费过后 xff0c 有很多独立游戏开发者转向unity游戏开发 xff0c unity的优势就是多终端 跨平台打包 xff0c 入门也快 xff0c 很多人感觉自己的英文不好 xff0c 就觉得学不会 xff0c 其
  • stm32零基础入门,应学习那些知识

    1 首先我们先看看与STM32相关的文档 我们假定大家已经对STM32的书籍或者文档有一定的理解 如不理解 xff0c 请立即阅读STM32的文档 xff0c 以获取最基本的知识点 如果你手上拥有ST官方主推的STM32神舟系列的板子 xf
  • Java如何实现二维码扫码授权登陆

    如今的生活中 xff0c 登录网站也变得如此简单 xff0c 当你已经登录一微信时 xff0c 当你想要登录另一个网站时 xff0c 只需扫码便可 xff0c 可是大家知道用Java怎么实现扫码授权吗 本文讲述的就是关于如何用Java实现扫
  • Postman安装与简单使用

    Postman使用参考文档 xff1a 1 官方英文文档 2 chrome插件整理的 postman中文使用教程 Postman一款非常流行的API调试工具 其实 xff0c 开发人员用的更多 因为测试人员做接口测试会有更多选择 xff0c
  • c语言入门基础

    C语言的结构 1 Hello world 简单来说 xff0c 一个C程序就是由若干头文件和函数组成 include 包含头文件 主函数 int main printf Hello World return 0 include 就是一条预处
  • 单片机串行口介绍

    介绍 串行口是单片机与外界进行信息交换的工具 xff0c 8051单片机的通信方式有两种 xff1a 并行通信 数据的各位同时发送或接收 串行通信 数据一位一位次序发送或接收 串行通信的方式 异步通信 用一个起始位0表示字符的开始 xff0
  • 51单片机中断机制(定时器)

    单片机中断简介 52单片机一共有6个中断源 xff0c 它们的符号 xff0c 名称以及各产生的条件分别如下 xff1a INT0 外部中断0 xff0c 由P3 2端口线引入 xff0c 低电平或下降沿引起 INT1 外部中断1 xff0
  • 什么叫51单片机最小系统

    单片机最小系统 或者称为最小应用系统 是指用最少的元件组成的单片机可以工作的系统 对51系列单片机来说 最小系统一般应该包括 单片机 晶振电路 复位电路 下面给出一个51单片机的最小系统电路图 说明 复位电路 由电容串联电阻构成 由图并结合
  • 嵌入式系统C编程之错误处理

    一 错误概念 1 1 错误分类 从严重性而言 xff0c 程序错误可分为致命性和非致命性两类 对于致命性错误 xff0c 无法执行恢复动作 xff0c 最多只能在用户屏幕上打印出错消息或将其写入日志文件 xff0c 然后终止程序 而对于非致
  • 补光灯的单片机开发设计

    说到摄影灯 xff0c 相信每个人都一定听说过闪光灯和补光灯 那它们是怎么由来的呢 又是怎么达到了你想要的效果呢 不论是闪光灯还是补光灯 xff0c 它们都有一个共同点 xff0c 那就是由NY8A051D单片机开发而来 xff0c 单片机
  • 单片机C语言如何产生随机数

    单片机C语言如何产生随机数 随机数在单片机的应用中也是很多的 xff0c 当然产生随机数的方法有很多 xff0c 当中有一个就是利用单片机定时器 xff0c 取出未知的定时器THX和TLX的值 xff0c 再加以运算得到一个规定范围内的随机
  • 使用mac终端编译运行c程序

    使用mac终端编译运行c程序 本文介绍如何利用mac自带文本编辑软件编写c代码 xff0c 并在mac自带终端内用命令行编译运行c程序 1 在mac上安装c编译环境 打开mac自带的终端 在终端命令行里输入xcode select inst
  • HtmlParser 一个不错的网站爬虫工具

    有时候我们需要在网上获取自己需要的内容时 xff0c 而且需求量达到一定程度时 xff0c 就要通过代码来实现重复的操作 当用Java来帮我们解决这个问题时 xff0c 我们又如何通过Java来过滤掉多余的内容 xff0c 剩余自己想要的信
  • 因为jsoup,再见了我的htmlparser

    jsoup 一款Java 的HTML解析器 xff0c 可直接解析某个URL地址 HTML文本内容 它提供了一套非常省力的API xff0c 可通过DOM xff0c CSS以及类似于jQuery的操作方法来取出和操作数据 这里是jsoup
  • Python 当前时间是那一年第几周的周几

    isocalendar 函数 返回 xff08 XX年 xff0c 一年中的第几周 xff0c 这一天是周几 xff09 gt gt gt from datetime import datetime gt gt gt datetime no
  • 对Socket CAN的理解(1)——【CAN总线原理】

    转载请注明出处 xff1a http blog csdn net Righthek 谢谢 xff01 由于Socket CAN涉及到CAN总线协议 套接字 Linux网络设备驱动等 因此 xff0c 为了能够全面地了解Socket CAN的