1.CAN2.0A协议
1.1 CAN是什么
CAN协议是半双工的。CAN是控制器局域网络( Controller Area Network )的简称,他是由研发和生产汽车电子产品著称的德国BOSCH(博世)公司开发,最终成为国际标准(ISO11519)。
CAN总线协议成为汽车计算机控制系统和嵌入式工业控制局域网的总线标准,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。
如下图所示,CAN协议涵盖了 ISO 规定的 OSI 基本参照模型中的传输层、数据链路层及物理层
1.2 CAN总线架构
总线架构如下图所示,和IIC、SPI通讯方式不同,CAN通讯不以时钟信号来同步,是一种异步的通讯方式,是由CAN_High和CAN_Low两条信号线,这两条线共同构成一组差分信号线,以差分信号的形式通讯CAN的物理层特性主要分为闭环总线和开环总线网络两种,前者适用高速通讯,后者适用远距离传输。
在CAN总线中,必须使它处于隐性电平(逻辑1)或者显性电平(逻辑0)中的一个状态,假如有两个通讯结点,在同一时间,一个输出显性电平,另一个输出隐性电平,这是总线将处于显性电平状态。闭环总线(ISO11898)和开环总线网络(ISO11519)差分电平的特性不相同,具体如下:
1.3 CAN报文结构
如下图所示can通信帧共分为五种类型:
如下图所示数据帧结构上由7个段组成:
SOF:表示数据帧起始,一个显性位;
仲裁段:表示数据帧优先级。CAN-bus并没有规定节点的优先级,但通过仲裁段帧ID规定了数据帧的优先级。根据CAN2.0标准版本不同,帧ID分为11位和29位两种。帧ID值越小,优先级越高。远程发送请求位(RTR)显性时为数据帧,隐性时为远程帧;
控制域:表示数据帧中数据域的字节长度。标准格式中r0为保留位,扩展格式中r1(显性)和r0(显性)为保留位;数据长度码(DLC)表示数据域字节数,采用二进制编码,只允许为0~8;
数据域:表示数据帧中发送的数据内容,包括0~8字节,高位在前;
CRC域:CRC序列依次计算帧起始、仲裁域、控制域、数据域,用于校验数据是否正确;CRC界定符为单独的隐性位;
应答域:包括应答位和应答界定符;发送器的发送报文应答位为隐性,接收器匹配CRC序列后的应答报文应答位为显性;应答界定符为隐性位;
帧结束:由7个隐性位组成,每个数据帧和远程帧都由帧结束界定。
远程帧:
与数据帧相比,远程帧结构上无数据段,由6个段组成, RTR位为1(隐形电平)。
错误帧:
当出现出现以下五种错误之一时,发送或接收节点将发送错误帧。
位错误:发送器发送并监测;
填充错误:填充法编码时出现第6个连续相同的位电平;
CRC错误:接收器CRC计算结果与接收到的CRC序列结果不相符;
形式错误:当固定形式的位域含有1个或多个非法位,则检测为一个形式错误(除了接收单元检测到EOF(7位隐性位)的最后一位(第8位)为显性电平;数据编码长度(DLC)为9~15数值)
应答错误:应答间隙期间监视到不为显性;
错误帧的结构如下,其中错误标识分为主动错误标识和被动错误标识。
过载帧:
当某些接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点;过载帧由过载标志和过载帧界定符组成。过载帧结构如下:
帧间隔:
帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。
2.CANopen协议
2.1 CANopen是什么
CANopen是一个基于CAN总线的“高层协议”,这意味着CAN总线(ISO 11898)就像集装箱的卡车一般作为CANopen信息的“运输工具”。 CAN只是实现了带有11位CAN ID、远程传输(RTR)位和64个数据位(与更高层的协议相关)的字段的帧的传输。CAN总线在CANopen中的作用与在J1939协议相同。而CANopen则实现了OSI模型的第七层,并能够适应除CAN以外的其他数据链路层协议。
2.2 CANopen 设备结构
下图为 CANopen 设备结构。 CANopen 协议通常分为用户应用层、对象字典以及通信三个部分。其中最为核心的是对象字典,描述了应用对象和 CANopen 报文之间的关系。CANopen 通信其定义了 CANopen 协议通信规则以及与 CAN 控制器驱动之间对应关系。用户应用层是用户根据实际的需求编写的应用对象,
2.3 对象字典 OD
所谓的对象字典就是一个有序的对象组, 描述了对应 CANopen 节点和它的网络行为的所有参数。每个对象采用一个 16 位的索引值来寻址,为了避免数据大量时无索引可分配,所以在某些索引下也定义了一个 8 位子索引值。对象字典索引区域定义如下:
2.4 CANopen通讯
CANOpen协议报文分类:
NMT 网络管理报文,作用是管理网络,切换节点的状态。一般由主站发送NMT网络管理报文。
SDO 服务数据对象报文,作用是设置设备参数,或者是一些关键数据的传输。一般由主站发起SDO报文,从站应答SDO报文。从站也可以发起SDO,主站响应,比如关键数据的传输。
PDO 过程数据对象报文,作用是传输一些设备的过程数据,比如传输温度,速度等等。主站和从站都会发送。
EMCY 紧急报文,作用是传输设备的故障信息。主站和从站都会发送。
SYNC 同步报文,作用是同步数据,用来同步从站的TPDO数据。一般由主站发送。比如从站的TPDO传输类型是在同步模式下,当从站收到设定次数的SYNC报文后,从站会发送TPDO。这个在后续的文章中详细阐述。
NODE GUARDING 节点保护报文,作用是主站请求从站的状态,主站询问,从站应答。这种模式逐渐已被淘汰,因为太占CAN总线网络带宽。
HeartBeat 心跳报文,作用是设备主动发送心跳,表示自己在线。主站和从站都可以发送。
对于 PDO 和 SDO 的报文 ID 分配, CANopen 预定义了强制性的缺省标识符(CAN-ID)分配表。 将11位 帧ID其划分为 4 位的功能码(Function-ID) 和 7 位的节点号(Node-ID)。如下图所示
2.5 NMT网络管理
canopen从机由主机进行网络管理,NMT 管理涉及到一个 CANopen 节点从上电开始的 6 钟状态,状态转换如下图所示包括:
l 初始化
l 应用层复位:节点中的应用程序复位(开始),比如开关量输出、模拟量输出的初始值;
l 通讯复位:节点中的CANopen通讯复位(开始),从这个时
刻起,此节点就可以进行CANopen通讯了。
l 预操作状态:节点的CANopen通讯处于操作就绪状态,此时此节
点不能进行PDO通信,而可以进行SDO进行参数配置和NMT网络管理的操作;
l 操作状态:节点收到NMT主机发来的启动命令后,CANopen通讯被
激活,PDO通信启动后,按照对象字典里面规定的规则进行传输,同样SDO也可以对节点进行数据传输和参数修改;
l 停止状态(Stopped): 节点收到NMT主机发来的停止命令后,节点的PDO通信被停止,但SDO和NMT网络管理依然可以对节点进行操作;
从站需要定时发送状态报文(心跳报文),方便主站确认从站是否故障、是否脱离网络,报文格式如下图:
2.6过程数据对象 PDO
PDO 属于过程数据用来传输实时数据,即单向传输,无需接收节点回应。其同步传输和异步传输:
异步传输(由特定事件触发)
其触发方式可有两种, 第一种是由设备子协议中规定的对象特定事件来触发(例如,定时传输,数据变化传输等)。第二种是通过发送与 PDO 的 COB-ID 相同的远程帧来触发 PDO的发送。 目前应用中的异步传输基本都采用第一种。
l同步传输(通过接收同步对象实现同步)
同步传输就是通过同步报文让所有节点能在同一时刻进行上传数据或者执行下达的应用指令,可以有效避免异步传输导致的应用逻辑混乱和总线负载不平衡的问题。 一般发送同步报文的节点是 NMT 主机。
PDO CAN-ID定义:
PDO 的通信参数:
PDO 通信参数,定义了该设备所使用的 COB-ID、传输类型、定时周期等。 RPDO 通讯参数位于对象字典索引的 1400h to 15FFh, TPDO 通讯参数位于对象字典索引的 1800h to 19FFh。
Number of entries 参数条目数量:即本索引中有几条参数;
COB-ID:即这个 PDO 发出或者接收的对应 CAN 帧 ID;
发送类型:即这个 PDO 发送或者接收的传输形式,通常使用循环同步和异步制造商特定事件较多;
Inhibit time 生产禁止约束时间(1/10ms):约束 PDO 发送的最小间隔,避免导致总线负载剧烈增加,比如数字量输入过快,导致状态改变发送的 TPDO 频繁发送,总线负载加大,所以需要一个约束时间来进行“滤波”,这个时间单位为 0.1ms;
Event timer 事件定时器触发的时间(单位 ms):定时发送的 PDO,它的定时时间,如果这个时间为 0,则这个 PDO 为事件改变发送。
SYNC start value 同步起始值:同步传输的 PDO,收到诺干个同步包后,才进行发送,这个同步起始值就是同步包数量。比如设置为 2,即收到 2 个同步包后才进行发送。
PDO 的映射参数:它包含了一个对象字典中的对象列表,这些对象映射到相应的 PDO。RPDO 通讯参数 1400h to 15FFh, 映射参数 1600h to 17FFh, 数据存放为 2000h 之后厂商自定义区域; TPDO 通讯参数 1800h to 19FFh, 映射参数 1A00h to 1BFFh, 数据存放为 2000h 之后厂商自定义区域。
映射关系为上图所示,例如,需要将0x1A00映射参数发送出去,第一个索引为0x2000,子索引为0x01,对应厂商自定义区域的值0x01;第二个索引为0x2003,子索引为0x03,对应厂商自定义区域的值0x5678;第三个索引为0x2003,子索引为0x01,对应厂商自定义区域的值0x12;
所以canopen报文的数据域为0x01,0x5678,0x12;
2.6服务数据对象 SDO
SDO 主要用于 CANopen 主站对从节点的参数配置。 服务确认是 SDO 的最大的特点,为每个消息都生成一个应答,确保数据传输的准确性。
快速 SDO 协议:所谓快速,就是 1 次来回就搞定。前提是读取和写入的值不能大于32位。如下图所示,为快速 SDO 协议的示意图。
普通 SDO 协议:当需要传输的值超过32位时,就不能使用快速 SDO 传输。 必须使用普通 SDO 进行分帧传输。
2.7同步协议
该报文对象主要实现整个网络的同步传输,一般同步报文由 NMT 主机发出, CAN 报文的数据为0字节。但如果一个网络内有个同步机制,就需要设置不同的同步节拍,比如某些节点按1个同步帧发送 1 次 PDO,其他的节点收到2个同步帧才发送1此PDO, 所以这里PDO参数中的同步起始值就起了作用.
2.8 CANopen紧急报文
紧急报文当设备内部出现的致命错误触发,以最高优先级发送到发送设备内部错误代码, 提示 NMT 主站。。适用于中断类型的错误报警信号。一个紧急报文包含8个字节,报文格式如下:
其中包括 EEC: 紧急时间错误代码, ER: 错误寄存器, MEF: 厂商自定义的错误代码。