CAN、CANopen协议栈详解【硬核,慎点】

科技   2024-10-23 11:00   河北  


第一章 CAN协议栈详解

本章目录

  • 前言

  • 一、CAN简介

  • 二、CAN的发展历史

  • 三、CAN的电气特性

  • 四、CAN协议栈

  •     4.1、CAN协议栈解析

  •     4.2、CAN收发过程

  •     4.3、CAN错误处理

  •     4.4、CAN波特率

  •     4.5、CAN过滤

  • 总结


本章介绍了CAN协议栈的发展历史、电气特性、基础理论、标准协议栈解析等干货知识点。

一、CAN简介

CAN包含两个部分,分别是CAN总线和CAN总线协议。

CAN总线:

控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它是使用两根信号总线(双绞线的形式)来传输信号,是世界上应用最广泛的现场总线之一。
最初,CAN被设计作为汽车环境中的微控制器通讯,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。比如:发动机管理系统、变速箱控制器、仪表装备、电子主干系统中,均嵌入CAN控制装置。
一个由CAN 总线构成的单一网络中,理论上可以挂接无数个节点。实际应用中,节点数目受网络硬件的电气特性所限制。CAN 可提供高达1Mbit/s的数据传输速率,这使实时控制变得非常容易。另外,硬件的错误检定特性也增强了CAN的抗电磁干扰能力。

CAN总线协议:

CAN总线协议是 ISO国际标准化的串行通信协议:CAN协议用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束。该协议的健壮性使其用途延伸到其他自动化和工业应用。CAN协议的特性包括完整性的串行数据通讯、提供实时支持、传输速率高达1Mb/s、同时具有11位的寻址以及检错能力。
CAN总线协议是一个载波侦听(CSMA)、基于报文优先级碰撞检测和仲裁(CD+AMP)的多路访问协议:
  • CSMA:意思是总线上的每一个节点在企图发送报文前,必须要监听总线,当总线处于空闲时,才可发送。
  • CD+AMP:意思是通过预定编程好的报文优先级逐位仲裁来解决碰撞,报文优先级位于每个报文的标识域。更高级别优先级标识的报文总是能获得总线访问权,即:标识符中最后保持逻辑高电平的会继续传输,因为它具有更高优先级。

二、CAN的发展历史

  • 1980年代初期,由于没有可满足汽车工程师的总线协议,人们开始开发新的串行总线。

  • 1986年2月,在底特律举行SAE会议上CAN总线诞生,称之为Automotive Serial Controller Area Network。

  • 1991年,博世发布CAN2.0规范,分CAN 2.0A(具有11位标识符)和CAN 2.0B(具有29位标识符)。

  • 1993年,ISO组织发布CAN标准IS0 11898: IS0 11898-1涵盖数据链路层,IS0 11898-2涵盖高速CAN的CAN物理层(经典CAN速度1Mbps,CAN FD 5Mbps) ,IS0 11898-3 涵盖低速,容错CAN的物理层 (速度125Kbps),后续还推出了ISO 11898 -4 -5和-6标准。

  • 2012年,博世发布CAN FD 1.0,速度2Mbps,使用CAN FD-SiC (加强版CAN PHY)可以做到5-8Msps。以STM32H7为例,带的CANFD是支持经典CAN的CAN2.0A和CAN2.0B,以及CANFD V1.0规范,兼容ISO 11898-1 : 2015和ISO11898 -4。

  • 2018年12月,开始推出第三代CAN数据链路层协议CAN XL,速度提升至10Mbsp。

  • 2022年11月、博世推出下一代CAN IP核CAN XL,速度高达20Mbps。



三、CAN的电气特性

  1. CAN总线测试阶段,至少一端的终端120Q终端电阻不可以省略。

  2. CAN是差分通信,总线电平分为显性电平和隐性电平两种。总线上执行逻辑上的线“与”:显性电平为0,隐性电平为1。显性电平具有主导性,只有所有节点都输出隐性电平时总线上才是隐性。

  3. 测量发现CAN仅接一端的终端电阻,结束的时候波形会有个抬高。

  4. 通信速度和最大长度理论值,主要是经典CAN,所有节点操作必须在同一个CAN波特率下。

  5. 在测试阶段,测试软件应用层时,由于STM32芯片大部分都是双CAN,所以可以通过特别操作,不使用CAN PHY芯片也可以实现CAN通讯,不过这个不是差分电平。


四、CAN协议栈

CAN协议栈的帧类型包括数据帧、远程帧、错误帧、过载帧和帧间隔。

4.1、CAN协议栈解析

  1. 数据帧发送单元向接收单元传送数据的帧。

    起始段:表示数据帧开始的段。

    SOF:帧起始(1位),显性(0)表示报文的开始,并用于同步总线上的节点。

    仲裁段:表示该帧优先级的段。

    标识符:标识符(11位),标准格式具有11位标识符,用来确定报文的优先级。此域的数值越小,优先级越高。

    RTR:远程发送请求位(1位),当需要从另一个节点请求信息(遥控帧)时,此位为显性(0)。

    所有节点都能接收这个请求,但是帧标识符确定被指定的节点。响应数据帧同样被所有节点接收,可以被有兴趣的节点使用。

    控制段:表示数据的字节数及保留位的段。

    IDE:标志符扩展位(1位),为显性(0)时使用标准格式,为隐性(1)时表示这是扩展格式。

    r0:保留位(1位),必须全部以显性电平发送,但接收方可以接收任意电平。

    DLC:数据长度代码(4位),表示传输数据的字节数目,一帧最多传输8字节用户数据。

    数据段:数据的内容,经典CAN支持0-8字节,CANFD支持0-64字节。

    校验段:检查帧的传输错误的段。

    CRC:经典CAN是15bit+1个bit的CRC界定符 (用于位分隔),CANFD是17或者21bit+1个界定符。

    CRC Delimiter:置“1”。

    CRC的计算范围包括起始段,仲裁段,控制段,数据段,接收方以同样的算法计算CRC值并进行比较,不一致会通报错误。

    应答段:表示确认正常接收的段。

    ACK:包含应答位和应答界定符(2位)。

    发送节点的报文帧中,ACK两位是隐性位,当接收器正确地接收到有效的报文,接收器会在应答位期间向发送节点发送一个显性位,表示应答。

    如果接收器发现这帧数据有错误,则不向发送节点发送ACK应答,发送节点会稍后重传这帧数据。

    结束段:表示数据帧结束的段。

    EOF:帧结束标志位(7位),全部为隐性位。如果这7位出现显性位,则会引起填充错误。

    IFS:帧间隔标志位(7位),CAN控制器将接收到的帧正确的放入消息缓冲区是需要一定时间的,帧间隔可以提供这个时间。

  2. 远程帧:接收单元向具有相同ID的发送单元请求数据的帧。

    遥控用于接收单元向具有相同 ID 的发送单元请求数据的帧,CANFD没有遥控帧,只有经典CAN有远程帧。远程帧相比数据帧没有数据段。需要注意的是,目前CAN官方建议不再使用远程帧。

    扩展格式相对于标准格式改动的内容如下:

    ①SRR:代替远程请求位,为隐性。所以当标准帧与扩展帧发送相互冲突并且扩展帧的基本标识符与标准帧的标识符相同时,标准帧优先级高于扩展帧。
    ②IDE :为隐性位表示标志位扩展帧,18位扩展标识符紧跟着IDE位。
    ③18位标识符:增加18位标识符。
    ④r1:保留位。

  3. 错误帧:当检测出错误时向其他单元通知错误的帧。

    接收节点或者发送节点检测出错误时,通知错误的帧。

    主动错误标志:6个bit的显性位;
    被动错误标志:6个bit的隐性位;
    错误界定符:8个bit隐性位。

  4. 过载帧:接收单元表明其自身尚未做好准备的帧。

  5. 帧间隔:将数据帧及遥控帧与前面的帧分离开来的帧。

4.2、CAN收发过程

  1. 发送过程

    ① 设置发送节点的ID,DLC,数据等。

    ② 设置CAN控制器,启动发送帧。

    ③ 任何节点,在总线空闲时,都可以启动发送帧。

    ④ 除了启动数据发送的节点,其余所有节点都在等待接收数据。

    ⑤ 如果多个节点同时启动数据发送,将进行仲裁,ID值小的优先处理,ID值大的停止发送,进入接收状态。

    ⑥ 此时,仅有一个节点发送数据,否则还有其它节点发送数据将造成异常。

    ⑦ 当发送节点完成消息发送,将等待应答bit被拉低为0,表示接收节点正常收到数据了。

    ⑧ 发送节点的数据已经送达接收节点,继续发送顿数据中的结束段,之后发送节点将进入接收状态或者继续发送下一帧数据。接收节点将处理收到的数据。

    ⑨ 此时,任何数据都可以发送数据,如果没有节点发送数据,总线将进入空闲状态。

    ⑩ 如果没有收到应答,将按照CAN错误方式处理 。

  2. 接收过程

    ① 所有节点,除了发送数据的节点和处于总线关闭状态的节点,都处于监听状态。

    ② CAN数据将按照前面说的CAN发送过程进行数据发送。

    ③ 所有处于监听状态的节点都将收到数据,如果被认为是没有错误的有效 CAN 消息,监听节点将应答。

    ④ 如果接收节点设置了CAN过滤器,将根据过滤设置滤掉不需要的消息。

4.3、CAN错误处理

检测到帧错误处理:

  1. 接收错误的节点将拉低 (显性电平0) 总线至少6个bit。

  2. 超过5个bit相同极性,将触发位填充,这个是硬件完成的,不需要用户操作。

  3. 错误帧以通知发送给所有节点,这个是硬件完成的。

  4. 发送总线放弃当前帧,8 bit的 TEC 发送错误计数器寄存器的值加X。

  5. 如果此TEC 等于0xFF,则发送节点将 BUSOFF (总线关闭) 并使自己脱离总线。

  6. 如果不是,则尝试重传消息,该消息必须与其他消息一起再次经过优先级处理。

  7. 所有其他节点放弃读取当前帧,REC接收错误计数器寄存器的值加X。

  8. 任何有消息排队的节点现在都将启动发送,其它的节点进去监听。

  9. 如果每次传输一个帧或接收一帧成功,相应的 TEC 和 REC 寄存器递减 (通常只递减 1)。

4.4、CAN波特率

CANFD波特率计算,含仲裁阶段可变波特率和数据阶段可变波特率,而经典CAN只有一种波特率。

4.5、CAN过滤

标识符过滤器是用于接收的,发送的时候无需设置过滤器,根据发送端发送来的帧数据,通过标识符过滤器就可以设置仅接收需要接收的帧数据有效降低CPU多余的处理时间。

  1. 经典CAN支持标识符列表模式和屏蔽位模式。

  2. CANFD支持范围过滤器 (Range filter) 、专用ID的过滤器 (Filter for dedicated IDs)和经典位屏蔽过滤器 (Classic bit mask filter)。


总结

章介绍了CAN协议栈的发展历史、电气特性、基础理论、标准协议栈解析等干货知识点。



第二章 CANopen协议栈详解

本章目录

  • 前言

  • 一、CANopen简介
  • 二、CANopen的发展历史
  • 三、CANopen ID
  • 四、CANopen协议栈框架
  • 五、PDO
  • 六、SDO
  •     6.1、快速SDO报文格式:
  •     6.2、普通SDO报文格式:
  •         6.2.1 普通SDO的读操作报文格式
  •         6.2.2 普通SDO的写操作报文格式
  • 七、NMT
  • 八、时间戳协议
  • 九、同步协议
  • 十、紧急报文协议
  • 总结


CANopen是基于CAN(控制器局域网)总线的一种高级通信协议,被广泛应用于自动化和嵌入式系统中。本章旨在提供详细的CANopen相关知识、最佳实践和实际应用案例。包括但不限于CANopen标准: 对CANopen规范进行深入讲解,包括但不限于通信对象(COB-ID)的管理,进程数据对象(PDO)、服务数据对象(SDO)和网络管理(NMT)等核心概念。

一、CANopen简介

CANopen是基于Can的应用层协议,其报文分为过程数据对象 (PDO) 和服务数据对象(SDO)CANopen本身的设计目的就是实现小网络、控制信号的实时通讯,所以为了节约时间开销,最大限度保证实时性,CANopen作了一些定义:
  1. 报文传输采用CAN标准帧格式,即11bit的ID域,以尽量减小传输时间;
  2. 网络控制报文均采用数据最小字节数。比如心跳报文,只有1个字节数据;
  3. 实时更新的过程数据无需接收方报文应答,即采用生产消费模型,降低总线负载;
  4. 需要接收方确认的配置参数一般都是采用快速单字传输,即1个报文最大传送132位的参数变量,避免分帧引起的实时性降低。

从 OSI 的 7 层网络模型的角度来看同,CAN(Controller Area Network)现场总线仅仅定义了第 1 层(物理层,见 ISO11898-2 标准)、第 2 层(数据链路层,见 ISO11898-1 标准);而在实际设计中,这两层完全由硬件实现,设计人员无需再为此开发相关软件(Software)或固件(Firmware),只要了解如何调用相关的接口和寄存器,即可完成对 CAN 的控制。

CAN 总线的工业自动化应用中,由于设备的互通互联的需求越来越多,所以需要一个开放的、标准化的高层协议:这个协议支持各种 CAN 厂商设备的互用性、互换性,能够实现在 CAN 网络中提供标准的、统一的系统通讯模式,提供设备功能描述方式,执行网络管理功能。其中包括:
  1. 应用层(Application layer):为网络中每一个有效设备都能够提供一组有用的服务与协议。
  2. 讯描述(Communication profile):提供配置设备、通讯数据的含义,定义数据通讯方式。
  3. 设备描述(Device proflile):为设备(类)增加符合规范的行为


二、CANopen的发展历史

  1. 1994年CiA联盟(CAN in Automation ) 发布CANopen首版CiA301,CANopen的成功不是一个大供应商推动的,而是众多中小企业推动的。
  2. 早期的CANopen,CAN远程还受到青睐,并且节点保护也是基于远程帧设计,后来被心跳报文取代,现在的CiA规范已经不建议使用远程帧。
  3. CiA301是CANopen最重要的最重要的基础协议,第一个版本已经定义了PDO (过程数据对象)和SDO(服务数据对象)引入了PDO的同步传输以及网络管理(NMT) 和紧急消息。后来在CiA301基础之上,针对各个行业推出一大批子协议,


三、CANopen ID

  1. 这里的CAN-ID也叫COB-ID(Communication Objectldentifier, 通信对象编号)。
  2. Node-ID节点ID,最大128个,范围0-127。

根据不同的功能码,预定的CAN-ID如下:


四、CANopen协议栈框架


五、PDO

  1. PDO简介:

    过程数据,即单向传输,无需接收节点回应 CAN 报文来确认,从通讯术语上来说是于“生产消费”模型,数据长度被限制为 1~8 字节。最多只要 1 就可以把一条信息或者一个变量传递结束。


  2. PDO协议:

    节点的PDO共定义8个数据对象,TPDO 和 RPDO 分别有4个,如下图所示:

    PDO数据对象有三个重要参数,分别为通讯参数,映射参数,数据存放。RPDO 通讯参数 1400h to15FFh,映射参数 1600h to 17FFh,数据存放为 2000h 之后厂商 自定义区域: TPDO 通讯参数 1800h to19FFh,映射参数 1A00h to 1BFFh,数据存放为 2000h 之后厂商自定义区域。所有的 PDO 传送数据必须透过对象宇典映像到对应的索引区上。


  3. PDO通讯参数:

    ①Number of entries 参数条目数量: 即本索引中有几条参数;
    ②COB-ID: 即这个 PDO 发出或者接收的对应 CAN ID;
    ③发送类型:即这个 PDO 发送或者接收的传输形式,通常使用循环同步和异步制造商特定事件较多;
    ④Inhibit time 生产禁止约束时间(1/10ms): 约束 PDO 发送的最小间隔,避免导致总线负载剧烈增加,比如数字量输入过快,导致状态改变发送的 TPDO 频繁发送总线负载加大,所以需要一个约束时间来进行“滤波”,这个时间单位为 0.lms;
    ⑤Event timer 事件定时器触发的时间(单位 ms):定时发送的 PDO,它的定时时间如果这个时间为 0,则这个 PDO 为事件改变发送;
    ⑥SYNC start value 同步起始值:同步传输的 PDO,收到诺干个同步包后,才进行发送,这个同步起始值就是同步包数量。比如设置为 2,即收到 2 个同步包后才进行发送。

  4. PDO映射:
为了更加直观地表现映射,将参数、应用数据、CAN 报文数据联 合起来展示,不同的映射采用不同的颜如下图所示:


六、SDO

  1. SDO简介:

    服务数据,主要用于 CANopen 主站对从节点的参数配置。为每个消息都生成一个应答,确保数据传输的准确性,在一个CANopen 系统中,通常 CANopen 从节点作为 SDO 服务器,CANopen 主节点作为客户端。


  2. SDO协议:

    SDO 分为快速 SDO 协议和普通SDO协议,快速SDO数据长度最大4个字节,普通SDO没有最大限制。其报文格式如下图所示,由命令码、索引、子索引和数据组成。

    节点的SDO定义如下图所示:


    SDO 客户端通过索引和子索引,能够访问 SDO 服务器上的对 象字典。这样 CANopen 主节点可以访问从节点的任意对象字典项的参数,并且 SDO 也可以 传输任何长度的数据。发送方 (客户端)发送 CAN-ID 为600h+Node-ID 的报文,Node-D 为接收方(服务器) 的节点地址,数据长度均为 8 字节,实际数据小于8字节时,用0补齐到8字节。


  1. 快速SDO报文格式:
    快速SDO的读报文格式如下图所示:

    快速SDO的写报文格式如下图所示:

    说明:图中的符号”-“表示数据不予考虑,使用0进行填充。

  2. 普通SDO报文格式:

    普通SDO传输的有效数据长度大于4个字节,采用分段式传输方式,读和写均分成了三个阶段:初始报文(在传输数据之前确认要传输的数据长度),传输过程报文(按照传输规格把数据进行分段传输);结束报文(数据分段的最后一段数据)。


    ①普通SDO的读操作报文格式

    分段读初始报文:获取从站(服务器)指定索引对象的读取数据长度,与快速传输的读指令一致使用0x40指令(这里同时也就说明分段读取是由从设备的返回数据所决定的,这里返回的是0x41指今而不是快速传输中的0x43、47等指令) 。


    分段读传输过程报文:在传输过程中,主站(客户端先发送指今0x60的报文开始读传输,同时从站(服务器)响应0x00指令的报文上传一段数据,下一主站发送0x70指令的报文,这时从站响应0x10指令的报文继续上传下一段数据,然后又会再次按照0x60-00、0x70-10的顺序接着下传输后续的数据,每次7个字节,最后的一段数据将会进入结束报文阶段。只要总数据大小不超过7也会一开始直接进入结束阶段。


    分段读结束报文:在上一个阶段中,数据是按照0x60-00、0x70-10的顺序进行交替传输,当发送到最后一段数据时,主站并不知道是到达最后一段了,所以主站发送的“0x60或70“指令保持不变,而其对应从站的响应指令”0x00或10“替换成对应的结束指令。


    ②普通SDO的写操作报文格式

    分段写初始报文:通知从站(服务器)指定索引对象的写入数据长度,使用0x21指令发送这个长度值。


    分段写传输过程报文:在传输过程中,主站(客户端先发送指今0x00的报文开始读传输,同时从站(服务器)响应0x20指令的报文上传一段数据,下一主站发送0x10指令的报文,这时从站响应0x30指令的报文继续上传下一段数据:然后又会再次按照0x00-20、0x10-30的顺序接着往下传输后续的数据,每次7个字节。最后的一段数据将会进入结束报文阶段。只要总数据大小不超过7也会一开始直接进入结束阶段。


    分段写结束报文:在上一个阶段中,数据是按照0x00-20、0x10-30的顺序进行交替传输,当发送到最后一段数据时,主站会把“0x00或10“指令替换成对应的结束指令,而其对应的从站响应指令”0x20或30“保持不变。


七、NMT

网络管理NMT(NetworkManagement)采用的主从方式,主机节点可以向从节点发送和请求数据。同一个网络中只能有一个主节点,一个或者多个从节点。

  1. NMT节点状态切换:

  2. 各种状态下支持的报文操作:

  3. 上线报文:

  4. 心跳报文:

  5. NMT报文:


八、时间戳协议

NMT主机发送自身的时钟,为网络各个节点提供公共的时间参考。


九、同步协议

该报文对象主要实现整个网络的同步传输,一般同步报文由 NMT 主机发出。

同步窗口时间:索引1007h 约束了同步发送后,从节点发送PDO 的时效,即在这个时间内发送的 PDO 才有效超过时间的 PDO将被丢弃。通讯循环周期:索引1006h 规定了同步顿的循环周期。


十、紧急报文协议

当设备内部发生错误,触发该对象,发送设备内部错误代码,提示 NMT 主站。紧急报文属于诊断性报文,一般不会影响 CANopen 通讯。


总结

CANopen是基于CAN(控制器局域网)总线的一种高级通信协议,被广泛应用于自动化和嵌入式系统中。本章旨在提供详细的CANopen相关知识、最佳实践和实际应用案例。包括但不限于CANopen标准: 对CANopen规范进行深入讲解,包括但不限于通信对象(COB-ID)的管理,进程数据对象(PDO)、服务数据对象(SDO)和网络管理(NMT)等核心概念。

end



一口Linux 


关注,回复【1024】海量Linux资料赠送


精彩文章合集

文章推荐

【专辑】ARM
【专辑】粉丝问答
【专辑】所有原创
专辑linux入门
专辑计算机网络
专辑Linux驱动
【干货】嵌入式驱动工程师学习路线
【干货】Linux嵌入式所有知识点-思维导图


一口Linux
《从零开始学ARM》作者,一起学习嵌入式,Linux,网络,驱动,arm知识。
 最新文章