首页 > 其他分享 >CAN通信

CAN通信

时间:2024-07-18 16:08:14浏览次数:6  
标签:ACK CANL 通信 CANH 发送 CRC 数据

CAN通信

什么是CAN通信

基本概念

CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议
主要包含三个部分:Host、控制器和收发器
示意图:

img

分类

高速CAN

SO 11898-2 规定要求在高速CAN总线的两端安装端接电阻(RL)以消除反射

电路拓扑图
img
物理信号电平

逻辑1:CANH 和 CANL 电压相同(CANH = CANL = 2.5V)时为逻辑“1”。
逻辑0:CANH 和 CANL 电压相差 2V(CANH = 3.5V, CANL = 1.5V) 时为逻辑“0”。
显性状态:高速CAN收发器在共模电压范围内(-12V ~ 12V),将CANH和CANL电压相差大于 0.9V 解释为显性状态(Dominant)
隐性状态:而将CANH和CANL电压相差小于 0.5V 解释为为隐性状态(Recessive)。
image

电平信号示意图
img

低速CAN

低速CAN最高速度只有 125Kbps,因此 ISO 11898-3 没有要求端接
逻辑1:CANH和CANL电压相差 5V (CANH = 0V, CANL = 5V)时为逻辑“1”
逻辑0;CANH和CANL电压相差 2.2V (CANH = 3.6V, CANL = 1.4V)时为逻辑“0”。

电平示意图
img

CAN通信有什么特点

通信特点

  • 异步半双工通信
    异步:没有共同的同步信号,而是在每个发送单元之前和之后,分别以起始和停止信号的形式包含同步信息
    半双工:双方可以互相通信,但不能同时进行。同一时刻,在通信通道(BUS总线)中,只有一个站点发出信息,其它站点想要发送信息,只能等待通道空闲。
  • 节点采用多主通信
  • 采用短帧结构,报文的有效字节数为8个
  • 报文ID值越小,优先级越高
  • 非破坏性总线仲裁处理机制
    即对各个消息的标识符(即ID号)进行逐位仲裁(比较),如果某个节点发送的消息仲裁获胜,那么这个节点将获取总线的发送权,仲裁失败的节点则立即停止发送并转变为监听(接收)状态
    显性优先级高于隐性
  • 可靠的CRC校验方式
    循环冗余校验
  • 报文帧仲裁失败或者传输期间被破坏有自动重发机制
  • 节点在严重的情况具有自动脱离总线的功能

CAN包含了哪些数据

CAN报文数据结构

image

共包含六种数据类型:

  1. 标准数据帧
  2. 扩展数据帧
  3. 遥控帧
  4. 错误帧
  5. 帧间隔
  6. 过载帧

数据帧

1)标准数据帧

image

注:标准数据帧的ID为11位

信息描述

域段 域段名 位宽:bit 描述
帧起始 SOF(Start Of Frame) 1 数据帧起始标志,固定为1bit显性('b0)
仲裁段 Identify(ID) 11 本数据帧的 ID 信息, ID 信息的作用:① 如果同时有多个节点发送数据时,作为优先级依据(仲裁机制);② 目标节点通过 ID 信息来接受数据(验收滤波技术)
RTR Remote Transmission Request BIT 1 RTR标识是否是远程帧(0,数据帧;1,远程帧),在数据帧里这一位为显性('b0)
IDE Identifier Extension Bit 1 IDE用于区分标准格式与扩展格式,在标准格式中 IDE 位为显性(‘b0),在扩展格式里 IDE 位为隐性(’b1)
R0 保留位 1 1bit保留位,固定为1'b0
DLC data length 4 由 4 位组成,MSB 先行(高位先行),它的二进制编码用于表示本报文中的数据段含有多少个字节,DLC 段表示的数字为0到8,若接收方接收到 9~15 的时候并不认为是错误
数据段 data 0~64 据帧的核心内容,它由 0~8 个字节(0 ~ 64位)组成,MSB 先行
CRC段 CRC 15 段用于检查帧传输错误,发送方以一定的方法计算包括:帧起始、仲裁段、控制段、数据段;接收方以同样的算法计算 CRC 值并进行比较,如果不同则会向发送端反馈出错信息,重新发送;计算和出错处理一般由 CAN 控制器硬件完成或由软件控制最大重发数。
CRC界定符 1 CRC 界定符(用于分隔的位),为隐性位(1'b1),主要作用是把CRC 校验码与后面的 ACK 段间隔起来
ACK 槽 ACK slot 1 在 ACK 槽位中,发送端发送的为隐性位,而接收端则在这一位中发送显性位以示应答;发送 ACK/返回 ACK这个过程使用到回读机制,即发送方先在 ACK 槽发送隐性位后,回读到的总线上的电平为显性0,发送方才知道它发送成功了,不用重发
ACK界定符 1 在 ACK 槽和帧结束之间由 ACK 界定符间隔开,为隐性位
帧结束 EOF 7 由发送端发送 7 个隐性位表示结束

示例

报文信息 0 00010100010 0 0 0 0001 0101 1000 XXXXXXXXXXXXXXX 1 1 1 1111111
信息描述 帧起始 ID RTR IDE R0 DLC DATA CRC CRC界定 ACK ACK界定 帧结束

2)扩展数据帧

image

注:扩展数据帧的ID是29位

循环冗余校验(CRC)

CRC校验值是通过对数据字段控制字段、和标识符字段进行一定的数学运算得到的

  • 发送端:假设发送端数据为M,有m个数据;在M后添加n位冗余码,然后构成一帧发出,共(m+n)位
    【PS:冗余码:二进制模2运算进行2^n*M(相当于M左移n位,即在M后补n个0,现在M是m+n位);用M除以收发双方事先商定的长度为n+1的除数P;得到余数R,这个R就是FCS(帧检验序列),这个FCS序列加到M上然后发出去】
  • 接收端:在接收端把接受到的数据以帧为单位进行CRC校验;把收到的每一个帧都除以同样的除数P,然后检查余数R;如果余数R为0,则在传输过程中没有差错;如果出现误码,那么余数R为零的概率非常小

CRC校验的具体做法:
①选定一个标准除数(P位二进制数据串)
②在要发送的数据(M位)后面加上P-1位0,然后将这个新数(M+P-1位)以模2除法的方式除以上面这个标准除数,所得到的余数也就是该数据的CRC校验码(注:余数必须比除数少且只少一位,不够就补0)
③将这个校验码附在原M位数据后面,构成新的M+P-1位数据,发送给接收端。
④接收端将接收到的数据除以标准除数,如果余数为0则认为数据正确。

示例说明:
设需要发送的信息为M = 1010001101,产生多项式对应的代码为P = 110101,R = 5。在M后加5个0,然后对P做模2除法运算,得余数r(x)对应的代码:01110。故实际需要发送的数据是101000110101110。
image

完整的校验示例:
现假设选择的CRC生成多项式为 P(X) = X^4 + X^3 + 1,要求出二进制序列10110011的CRC校验码。下面是具体的计算过程 :
①将多项式转化为二进制序列,由 P(X) = X^4 + X^3 + 1可知二进制一共有5位,第4位、第3位和第0位分别为1,则序列为11001;
②多项式的位数5,则在数据帧的后面加上5-1位0,数据帧变为10110011 0000,然后使用模2除法除以除数P(X) = 11001,得到余数;
image

遥控帧

错误帧

过载帧

帧间隔

标签:ACK,CANL,通信,CANH,发送,CRC,数据
From: https://www.cnblogs.com/WENDAOJG/p/18309766

相关文章

  • 服务间通信(RPC)的方式
    一、FeignClient1.导入依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>4.1.0</version></dependency> 2.在启动类加入注解@EnableFe......
  • udp 广播通信
    基于全网段广播的代码示例,要点主要有两个:(1)设置socket属性SO_BROADCAST(2)发送方添加广播255.255.255.255的路由,不然会产生“Networkisunreachable”错误iprouteadd255.255.255.255deveth0示例代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#includ......
  • [会议投稿|SPIE 出版|EI检索]第六届无线通信与智能电网国际会议(ICWCSG 2024)
    一、会议信息:1、会议名称:第六届无线通信与智能电网国际会议(ICWCSG2024)20246th InternationalConferenceonWirelessCommunicationsandSmartGrid2、会议官网:www.icwcsg.net3、会议时间:2024年7月26日-28日4、三轮截稿日期:2024年7月22日23:595、会议地点:中国·大理......
  • C#调用C++库,进行串口通信
    1、添加C++接口实现,将dll放置在运行路径下。dll文件下载:https://files.cnblogs.com/files/ZM191018/SerialPortLib.7z?t=1721271982&download=true[DllImport("SerialPortLib.dll",CharSet=CharSet.Unicode,CallingConvention=CallingConvention.StdCall)]......
  • 【QT开发】串口通信管理QSerialPort类详解及实战应用
    QSerialPort是Qt提供的一个功能强大、简单易用的串口通信类。通过本文的学习,您应该对QSerialPort的基本使用、高级应用技巧及相关注意事项有了全面的理解。在实际项目中,QSerialPort可以帮助实现与外部设备的串口通信,确保数据的可靠传输和接收。希望本文能帮助您更好地......
  • 07:串口通信二
    串口编程1、与波特率之相关的寄存器2、PCON寄存器3、SCON寄存器4、配置的代码分析5、向PC发送一段字符串6、PC机向单片机发送字符控制LED1灯的亮灭1、与波特率之相关的寄存器如图,与串口通信相关的寄存器主要是SCON和PCON寄存器。2、PCON寄存器SMOD:为1时,通信方式1......
  • SPI通信协议
    目录串行外设接口概述基本概念引脚定义工作模式数据格式串行外设接口概述基本概念串行外设接口(SerialPeripheralInterface)的简称也叫做SPI,是一种高速的、全双工同步通信的一种接口,串行外设接口一般是需要4根线来进行通信(NSS、MISO、MOSI、SCK),但是如果打算实现单向通信(最少3根......
  • I2C通信协议
    目录内部集成电路概述基本概念引脚说明通信速率通信过程空闲状态开始信号数据传输应答信号停止信号器件地址内部集成电路概述基本概念内部集成电路(InterIntegratedCircuit)的简称叫做IIC或者I2C,是一种简单的、半双工同步通信的串行通信接口,IIC总线是上世纪80年代(1982年)由飞利......
  • ROS服务通信机制实操Python
    ROS服务通信机制实操Python步骤流程vscode配置服务端客户端编辑配置文件编译并执行优化实现参数的动态提交优化先启动客户端后启动服务端ROS服务通信的理论查阅:ROS服务通信流程理论ROS服务通信的自定义srv数据的准备可以查阅:ROS服务通信自定义srv在模型实现中,ROSm......
  • Python实现基于http通信的protobuf数据传输的案例,包括请求者和接收者
    个人名片......