CAN通信协议(一)

目录

前言

因为工作,需要研究CAN总线。博主的CAN学习参考正点原子和野火的教程。虽然没有买板子,不过对于博主现在来说,感觉开发板都差不多吧!毕竟工作中开发板肯定是不一样的!

CAN基础知识介绍

CANController Area Network(控制器局域网络)的缩写,是ISO国际标准化组织的串行通信协议。由德国电气商博世公司在1986 年率先提出。此后,CAN 通过ISO11898ISO11519 进行了标准化。现在在欧洲已是汽车网络的标准协议
CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准
CAN具有很高的可靠性和良好的错误检测能力,广泛应用于汽车计算机控制系统和环境温度恶劣/电磁辐射强及振动大的工业环境。
CAN主要用在两个设备之间的通讯。

CAN的特点

  1. 多主控制。总线空闲时,所有单元都可发送消息,而两个以上的单元同时发送消息时,根据标识符(ID, 非地址)决定优先级。两个以上的单元同时开始发送消息时,对各消息ID的每个位进行逐个仲裁比较。仲裁获胜(优先级最高)的单元可继续发送消息,仲裁失利的单元则立即停止发送而进行接收工作。
  2. 系统柔软性。连接总线的单元,没有类似"地址"的信息。因此,在总线上添加单元时,以连接的其他单元的软硬件和应用层都不需要做改变。
  3. 速度快,距离远。最高1Mbps(距离<40m),最远可达10KM(速率<5Kbps)。CAN物理层的形式主要分为闭环总线开环总线,一个适合于高速通讯,一个适合于远距离通讯(速度慢)。闭环通讯网络是一种高速、短距离网络,它的总线最大长度为40m,通信速度最高1Mbps,总线的两端各要求有一个"120欧"的电阻。开环总线网络是低速、远距离网络,它的最大传输距离1km,最高通讯速率为125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个"2.2千欧"的电阻。
  4. 具有错误检测/错误通知和错误恢复功能。所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送次消息直到成功发送位置(错误恢复功能)。
  5. 故障封闭功能。CAN可以判断出错误的类型是总线上数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生次序数据错误时,可将引起此故障的单元从总线上隔离出去。
  6. 连接节点多。CAN总线可同时可同时连接多个单元。可连接的单元总数理论上是没有限制的。但实际上可连接的单元受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。

正是因为CAN协议的这些特点,使得CAN特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。

物理层特征

与I2C/SPI等具有始终信号的同步通讯方式不同,CAN通讯兵不是以时钟信号来进行同步的,它是一种异步通信,只具有CAN_HighCAN_Low两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。
CAN控制器根据CAN_LCAN_H上的电位差来判断总线电平。总线电平分为显性电平隐形电平,二者比居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
显性电平对应逻辑:0
CAN_High的电平为3.5V,CAN_Low线的电平为1.5V,CAN_HCAN_L的电压差为2V左右。
隐性电平对应逻辑:1
CAN_HighCAN_Low线上的电压均为2.5v, CAN_HCAN_L之间的电压差为0V。
显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只要所有的单元都输出隐形电平,总线上才为隐形电平(显性电平比隐形电平更强)。

通讯节点

CAN总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,实现节点间通讯。由于CAN通讯协议不对节点进行地址编码,而是对数据内容进行编码,所以网络中的节点个数理论上不 受限制,只要总线的负载足够即可,可以通过中继器增强负载。
CAN通讯节点由一个CAN控制器CAN收发器组成,控制器与收发器(电平转换)之间通过CAN_TxCAN_Rx信号线相连,收发器与CAN总线之间使用CAN_HighCAN_Low信号线相连。
CAN节点需要发送数据时,控制器把要发送的二进制编码通过CAN_Tx线发送到收发器,然后有收发器把这个普通的逻辑电平转化为差分信号,通过差分线CAN_HighCAN_Low线输出到CAN总线网络。而通过收发器接收总线上的数据到控制器时,则是相反的过程,收发器把总线上收到的CAN_HighCAN_Low信号转化为普通的逻辑电平信号,通过CAN_Rx输出到控制器中。
由于CAN总线协议的物理层只有1对差分线,在一个时刻只能表示一个信号,所以对通讯节点来说,CAN通讯是半双工的,收发数据需要分时进行。在CAN的通讯网络中,因为共用总线,在整个网络中同一时刻只能有一个通讯节点发送信号,其余的节点在该时刻都只能接收。

波特率及位同步

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

位时序分解

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

  • 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。

信号的采样点位于PBS1段与PBS2段之间,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样。

波特率

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

$1/(nT)$
## 帧种类介绍 CAN通信以5种类型的帧进行: 数据帧:用于通讯节点向外传送数据。 遥控帧:用于向远端节点请求数据。 错误帧:用于向远端节点通知校验错误,请求重新发送上一个数据。 过载帧:用于通知远端节点:本节点尚未做好接受准备。 间隔帧:用于将数据帧及遥控帧与前面的帧分离开来的帧。 ### 数据帧介绍 1. 帧开始 表示数据帧开始的段,`SOT`段(`Start Of Frame`),帧起始信号只有一个数据位,是一个**显性电平**(逻辑0),它用于通知各个节点将有数据传输,其他节点通过帧起始信号的电平跳变沿来进行硬同步。 2. 仲裁段 表示该帧优先级的段,当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输。仲裁段的内容主要为本数据帧的ID信息(标识符),数据帧具有标准格式和扩展格式两种,区别在于ID信息的长度,标准格式的ID为11位,扩展格式的ID格式为29位,它在标准ID的基础上多出18位。 在CAN协议中,ID决定着数据帧发送的优先级,也决定着其他节点是否会接收这个数据帧。CAN协议不对挂载在它之上的节点分配优先级和地址,对总线的占有权是由信息的重要性决定的,即对于重要的信息,可给它打包上一个优先级高的ID,使它能够及时地发送出去。 报文的优先级(越小越高),是通过对ID的仲裁来确定的。根据前面的物理层的分析,如果总线上同时出现显性电平和隐形电平,总线的状态会被置为显性电平,CAN正是利用这个特性进行仲裁。 仲裁段ID的优先级也影响着接收设备对报文的反应。因为在CAN总线上数据是以**广播**的形式发送的,所有连接到CAN总线的节点都会收到所有其他节点发出的有效数据,因而CAN控制器大多具有根据ID过滤报文的功能,它可以控制自己只接收某些ID的报文。 3. 控制段 表示数据的字节数及保留位的段 4. 数据段 数据的内容,一帧可发送0~8个字节的数据,MSB先行 5. CRC段 检查帧的传输错误的段,CAN的报文包含一段15位的CRC校验码,一旦接收节点算出的CRC码跟接收到的CRC码不同,则它会向发送节点反馈错误信息,利用错误帧请求它重新发送。CRC部分的计算一般有CAN控制器硬件完成,出错时的处理则由软件控制最大重发数。 在CRC校验码之后,有一个CRC界定符,它为隐形位,主要作用是把CRC校验码与后面的ACK段间隔起来。 6. ACK段 表示确认正常接收的段。ACK段包括一个ACK槽位,和ACK界定符位。在ACK槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在ACK和帧结束之间由ACK界定符间隔开。 7. 帧结束 表示数据帧结束的段。帧结束段由发送节点发送的7个隐形位表示结束。

总结

总体来说,博主先看了看正点原子的视频与资料,感觉讲的不够详细,而且对于博主个人而言,没有学习动力。而野火的视频教程中,刚开始给出了一个实验现象,讲的也比较详细。记得以前对野火的影响不好,感觉正点原子的资料更为丰富些,不过CAN教程感觉野火还是不错的。

链接地址

ALIENTEK STM32开发板最新光盘资料–以后光盘有更新都是在本帖下载!
[秉火官方资料] 【资料】野火产品资料合集(所有产品资料链接都在此处)-点击名称后下拉浏览器滚动条~

展开阅读全文

没有更多推荐了,返回首页