首页 > 其他分享 >现场总线协议---CAN总线协议详解

现场总线协议---CAN总线协议详解

时间:2024-12-02 10:57:16浏览次数:7  
标签:协议 同步 错误 总线 发送 --- 数据 节点

个人学习笔记,如有侵权,联系删除

基本概念

        CAN,即Controller Area Network,控制器局域网总线。一种用于实时应用的串行通讯协议总线,可使用双绞线来传输信号。

        特性:完整性的串行数据通讯、提供实时支持、传输速率高达1Mb/s、同时具有11位的寻址以及检错能力。

        专门为汽车行业开发的一种串行通信总线(减少线束的数量)

现场总线网络

        现场总线网络一般只实现了物理层、数据链路层和应用层,因为现场总线通常只包括一个网段,没有传输层和网络层,也不需要会话层和描述层的作用。

CAN协议及总线解析

CAN总线与协议的区别  

        CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线。CAN协议是ISO国际标准化的串行通信协议,用于规定CAN总线上数据的传输格式、仲裁规则、错误检测与恢复等机制。(也就是说,协议规定如何在总线上进行数据传输以及通信的规则和机制)

物理层

        CAN协议在物理层完成节点之间信号的传送,将各种信息转换成可以传输的物理电平,并通过差分信号的形式进行通讯。

        差分信号是一种利用两根信号线之间的电压差来表示逻辑状态的方法。具体来说:

        当CAN_H线上的电压高于CAN_L线上的电压时,表示逻辑“0”(显性电平)。

        当CAN_H和CAN_L线上的电压相近或相等时,表示逻辑“1”(隐性电平)。

        【故CAN总线在电线电缆上展现出来的内部结构一般是两根线,即CAN高和CAN低,2根芯线‌】

  • 同步方式

        主要包括硬同步和重同步(重新同步)两种

        硬同步:当总线出现帧起始信号时,各个节点会检测该信号,并调整自己的内部时序,使得同步段(SS)与总线上的帧起始信号对齐【以收到的起始帧信号为准,检测到后直接自动调整,实现同步】

        重同步:重同步是在消息帧的后续位中,每当有从隐性位到显性位的跳变,并且该跳变落在了同步段之外时,就会引起一次重同步。重同步的目的是根据跳变沿调整位时间,以补偿相位误差,确保采样点的位置正确。【根据消息帧后续位进行判断,再进行调整】

  • 位时序

        CAN总线以帧的形式发送数据,每个帧由多个数据位组成,每个数据位都有固定的时序结构,这个结构就是位时序。

CAN协议的每个数据位时序都被分解成以下四个段:

  1. 同步段(SS,Synchronization Segment):

    • 长度为1个Tq(Time Quantum,最小时间单位)。
    • 用于判断节点与总线是否同步。当总线上的跳变沿(从隐性到显性的跳变)落在SS段内时,表示节点与总线同步。
  2. 传播时间段(PTS,Propagation Time Segment):

    • 用于补偿信号在总线和节点间传播的物理延迟时间。
    • 长度固定,但可以根据需要进行配置。
  3. 相位缓冲段1(PBS1,Phase Buffer Segments 1):

    • 用于在重新同步时调整时序,以补偿相位超前的情况。
    • 长度可编程,可以根据需要重新配置。
  4. 相位缓冲段2(PBS2,Phase Buffer Segments 2):

    • 与PBS1类似,但用于补偿相位滞后的情况。
    • 长度同样可编程。

这四个段加起来构成一个完整的CAN数据位,长度由8~25个Tq组成,具体取决于配置。

  • 位编码方式

       三种编码方式:NRZ、填充位、字节顺序(数据链路层)

        NRZ,即非归零码,是一种基于电压变化的编码方式,用于将数字信号转换为物理信号进行传输。

        填充位,由于非归零码可能产生长串的连续0或1,这会导致接收方难以从信号中恢复时钟同步,尤其是在没有转换电平发生的时候。为了解决这个问题,CAN协议引入了位填充机制,

数据链路层及应用层

        在数据链路层主要负责将物理层接收到的信号,组织成具有意义的信息,并管理错误控制等传输流程。比如消息的帧化处理、仲裁、应答以及错误的检测和报告等功能,主要是在CAN控制器的硬件中执行。

  • 通信方式

        采用通信方式为:半双工通信

        通信双方都可以发送和接收数据,但在同一时刻只能由一方进行发送,另一方进行接收。也就是说,双方需要轮流进行发送和接收操作

  • 应答方式

        在数据链路层中,应答方式为ACK,即应答场(ACK)

        在应用层中应答方式为:确认应答(ACK),否定应答(NACK),请求重传,超时与重传机制。

  • 错误检测

        错误检测方式:位监视、填充检查、格式检查、循环冗余校验(CRC)

  • 错误通知

        分五种错误类型:位错误、应答错误、填充错误、格式错误、CRC错误

  • 故障扩散抑制功能

        故障限制与恢复‌:为了区分短时干扰和永久性故障,CAN协议引入了故障限制机制。处于总线关闭状态的节点需要满足一定条件后才能恢复通信。

  • 数据冲突时的仲裁

        通过比较节点ID的优先级来决定发送权限,从而避免了数据冲突和总线拥堵

  • 连接控制方式

       多主控制方式,即总线上的所有节点都没有主从之分,任一节点都可以在任意时刻主动地向网络上其他节点发送信息。这种通信方式非常灵活,能够适应各种复杂的实时控制系统。【看仲裁结果,需要根据不同的优先级进行处理】

  • 消息的帧化

        帧,是数据在CAN总线上传输的基本单元。CAN协议定义了两种主要的帧类型:数据帧和遥控帧,另外还有错误帧和过载帧。

        1、数据帧

        数据帧是CAN总线上传输数据的主要方式,它携带从一个节点发送到另一个节点的实际信息。

        数据帧的结构包括以下几个部分:

  • ‌帧起始(Start of Frame, SOF)‌:1位,标志数据帧的开始。

  • ‌仲裁场(Arbitration Field)‌:包括标识符和远程传输请求位(RTR),用于决定总线访问权和数据帧类型。

  • ‌控制场(Control Field)‌:包括6位,用于指示数据字段的长度和两个保留位。

  • ‌数据场(Data Field)‌:0到8个字节的数据。

  • ‌CRC场(Cyclic Redundancy Check Field)‌:用于错误检测。

  • ‌应答场(ACK Field)‌:包括应答位和应答界定符,用于接收方确认接收到消息。

  • ‌帧结束(End of Frame, EOF)‌:7位,标志数据帧的结束。

       数据帧分为标准帧和扩展帧两种,主要区别在于标识符(ID)的长度不同。

        标准帧:标识符(ID)11位,用于确定消息的优先级和标识消息内容,ID越小优先级越高。数据字段最多8个字节(64位)

        扩展数据帧:标识符(ID)29位,提供更广泛的地址空间。数据字段最多8个字节(64位)

        2、遥控帧

        遥控帧用于请求发送某个特定标识符的数据帧。它的结构与数据帧类似,但没有数据字段。遥控帧由帧起始、仲裁场(其中RTR位被设置为1以区分于数据帧)、控制场(其中DLC指示请求的字节数)和CRC场组成。

        3、错误帧

        当节点检测到总线上的错误时,会发送错误帧。错误帧由错误标志和错误界定符组成。错误标志是一个特殊的6位序列,用于通知其他节点发生了错误。

        4、过载帧

        过载帧用于指示节点由于内部原因(如处理速度跟不上)需要延迟下一个数据帧或遥控帧的发送。它由过载标志和过载界定符组成。

  • 错误恢复功能

        此功能确保了网络在出线错误时,能够手动或自动恢复正常通信。

        恢复过程中,自动恢复通常涉及等待一定数量的空闲位后重新尝试发送,以及根据错误计数器的减少来逐步恢复节点的通信能力。【再次发送】

  • 过载通知

        CAN协议中,过载通知是通过发送过载帧来实现的。当接收节点由于某种原因无法处理更多数据时,会发送过载帧以通知发送节点。

  • 接收消息的选择

        协议中,消息的传输是基于广播机制的,也就是说网络上的所有节点都可以接收到发送的消息【广播】。然而,通过特定的标识符(ID)和过滤器配置,可以实现类似组播的功能,使某些消息仅被特定的节点或节点组接收【点到点或组播】。

以上为本次笔记全部内容。

        

     

        

标签:协议,同步,错误,总线,发送,---,数据,节点
From: https://blog.csdn.net/z2722118745/article/details/144101574

相关文章

  • 上周热点回顾(11.25-12.1)
    热点随笔:· 2024年各编程语言运行100万个并发任务需要多少内存? (InCerry)· .NET9-Swagger平替Scalar详解(四) (IT规划师)· 《HelloGitHub》第104期 (削微寒)· MySQL用错了,99%的人已中招 (苏三说技术)· .NETCore线程池(ThreadPool)底层原理浅谈 (叫我安不理)·......
  • python - 字符串(str)
    例举一下常规用法print('字符串定义')str1='str'str2="str"#声明段落str3='''paragraph'''#使用续行符str4="line1\line2"print('字符串拼接')ret=str1+''+str2print(ret......
  • python - 列表(list)
    创建一个列表时,系统会分配一定的空间,当新增元素个数超出这个空间时,会自动进行扩容。这个结论很容易找到,我们可以写一段代码证明一下,内存占用是阶段变化的。fromsysimportgetsizeofli=[]foriinrange(64):li.append(i)print(f'length:{len(li)},size:{get......
  • python - 字典(dict)
    字典(dict):基于哈希表的一种数据结构,从原理上来说,与其它语言中的map是同一类东西。#创建一个空字典importjsonordered_dict={'a':1}print(ordered_dict)#向字典中添加一些键值对ordered_dict['b']=2ordered_dict['c']=3ordered_dict['d']=4print(ordered......
  • 【2024-12-01】连岳摘抄
    23:59日子未必会永远这样,你的人生有可能突然绽放花朵,这种事是有可能发生的。                                                 ——乔治桑德女性,工作家庭更难两全,这......
  • python - threadlocal
    功能:给线程创建一些变量,线程彼此之间是完全隔离的,每个线程使用各自的线程。使用场景:在处理数据库事务过程中,业务开始时,获取连接,业务结束时,关闭连接,中间的业务是未知的。想封装这样的代码,就可以用threadlocal。importthreading#创建threading.local的实例local=threa......
  • Failed to execute goal org.apache.maven.pluginsmaven-compiler-plugin3.8.1compile
    1.报错信息Failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile(default-compile)onprojectrepair-wheelset-service:FatalerrorcompilingFailedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile(de......
  • 表里不一--限制容器内存4G,free还是32G
    前言最近有个新同事问了我一个问题,明明通过limit给容器内存限制了4G,为什么进容器看到的还是宿主机的内存32G▶dockerrun-it--rm-m512mubuntu:18.04bashroot@ae00bec75ad7:/#free-mtotalusedfreesharedbuff/cacheavailabl......
  • python - 修饰函数
    Python装饰器(Decorator),名字叫装饰器,功能自然对应于设计模式中的装饰者模式(代理模式)。写法上,很像java中的函数注解,实际上,功能也大致一样。简单说:就是在调用函数的时候,可以在在调用之前,加一点逻辑,调用完加一些逻辑,出现异常时加一些逻辑。用途很多:入参的校验,异常处理,返回值......
  • python - 异常
    Exception和Error的区别python与java不一样,python的所有异常类,都继承自BaseException,并不严格区分Error和Exception。以SyntaxError为例,名字虽然叫Error,但实际也是继承自Exception。java的规范:将可预知的,而不影响程序执行的,称之为Exception,比如:参数格式不......