[X]关闭
1

S02-CH13 CAN总线通信实验

摘要: 软件版本:VIVADO2017.4操作系统:WIN10 64bit硬件平台:适用米联客 ZYNQ系列开发板米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!13.1 概述 ZYNQ的PS中包含了2个CAN接口,兼容CAN 2.0A和C ...

软件版本:VIVADO2017.4

操作系统:WIN10 64bit

硬件平台:适用米联客 ZYNQ系列开发板

米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!

13.1 概述

      ZYNQ的PS中包含了2个CAN接口,兼容CAN 2.0A和CAN 2.0B,最高可支持1Mbps的波特率。CAN作为工业应用中的一个重要的总线标准,广泛应用于各行各业之中。本教程介绍了ZYNQ中PS端CAN接口的基本使用方法,并通过CAN接口实现与PC端CAN调试软件之间的数据接收和发送测试。

13.2 CAN总线介绍

13.2.1数据格式

     CAN总线中的数据以帧为单位,一共包含5种类型的帧,分别为:数据帧、远程帧、错误帧、过载帧和帧间隔。

  1. 数据帧:用于发送节点向接收节点传送数据的帧。
  2. 远程帧:用于接收节点向具有相同ID的发送节点请求数据的帧。
  3. 错误帧:用于当检测出错误时向其他节点通知错误的帧。
  4. 过载帧:用于接收节点通知其尚未做好接受准备的帧。
  5. 帧间隔:用于将数据帧及远程帧与前面的帧分离开来。

     CAN帧格式如下图所示,CAN 2.0A中使用的是标准帧,CAN 2.0B中使用的是扩展帧。标准帧和扩展帧的区别在于扩展帧增加了18bit的扩展标识符。一般情况下,与用户直接相关的只有数据帧和远程帧。数据帧和远程帧都可以使用标准帧格式或者扩展帧格式。

CAN总线消息主要由仲裁区、数据区、CRC校验区以及帧结束区荃部分构成。各区主要情况如下:

仲裁区:

-定义消息的优先级;

-消息的逻辑地址(标识符);

-标准帧11位标识符;   

-扩展帧29位标识符。

数据区:

-每个消息最多可以包含8字节的数据;   

-允许不包含数据帧的帧存在(数据区长度为0字节)。

CRC校验区

-包含循环冗余校验位。

结束区

-帧结束区消息响应标识、错误消息、消息结束


上图给出的帧包含起始位、标识符、远程传输请求、标识扩展等,所有相关的仲裁、数据、CRC校验以及帧结束构成了完整的CAN总线消息帧,各部分的具体含义如下:


SOF(1 bit): 标识一个消息帧的开始,在空闲时间的下降沿同步所有的总线模块;

标识符(11 bits):定义消息的逻辑地址和优先级,优先级的数字越小优先级越高;   

RTR(1 bit):远程传输请求,如果RTR=1表示在数据帧中没有有效数据,请求远程节点向发出请求帧的节点发送数据;   

IDE(1 bit):标识符扩展,如果IDE=1,则采用扩展的数据帧传送数据;   

r0 保留;   

DLC(4 bits):数据长度代码,数据帧长度允许的数据字节数为{0~8),其他长度数值不允许使用;   

数据(0~8字节):消息数据;   

CRC(15 bits):循环冗余校验码”只用于检测错误而不能校正;   

ACK(2 bits)每一个接听者接收到消息后必须发送响应位(ACK):   

EOF(7 bits=1,recesslve):帧的结束;   


       关于更多CAN数据格式和协议的介绍可以参考官方CAN总线标准的文档,或者广州周立功的《CAN-bus规范V2.0版本》。

13.2.2数据帧

       一个数据帧由7个不同的部分组成,分别为:帧起始、仲裁段、控制段、数据段、 CRC段、ACK应答段、帧结尾。如下图所示。

1)、帧起始和结尾

帧起始和帧结尾说明如下图所示。

2)、仲裁段

仲裁段说明如下图所示。

3)、控制段

控制段说明如下图所示。

4)、数据段

数据段说明如下图所示。

5)、CRC段

CRC段说明如下图所示。


6)、ACK段

ACK段说明如下图所示。

13.2.3远程帧

远程帧结构如下图所示。与数据帧相比只缺少了数据段。

13.2.4数据帧与远程帧对比

        数据帧与远程帧的对比如下图所示。

13.2.5波特率

       在CAN的底层协议里将CAN数据的每一位时间(TBit)分为许多的时间段(Tscl),这些时间段包括:
A. 位同步时间(Tsync)

B. 时间段1(Tseg1)

C. 时间段2(Tseg2)

    其中位同步时间占用1个Tscl;时间段2占用(Tseg1+1)个Tscl;时间段2占用(Tseg2+1)个Tscl,所以CAN控制器的位时间(TBit)就是:TBit=Tseg1+Tseg2+Tsync=(TSEG1+TSEG2+3)*Tscl,那么CAN的波特率 (CANbps)就是1/TBit。

       但是这样计算出的值是一个理论值。在实际的网络通信中由于存在传输的延时、不同节点的晶体的误差等因素,使得网络CAN的波特率的计算变得复杂起来。CAN在技术上便引入了重同步的概念,以更好的解决这些问题。这样重同步带来的结果就是要么时间段1(Tseg1)增加TSJW(同步跳转宽度SJW+1),要么时间段减少TSJW

CAN有波特率的值四以下几个元素决定:
A. 最小时间段Tscl;
B. 时间段1 TSEG1;
C. 时间段2 TSEG2;
D. 同步跳转宽度 SJW
那么Tscl又是怎么计算的呢?这是总总线时序寄存器中的预分频寄存器BRP派上了用场,Tscl=(BRP+1)/FVBP。FVBP为微处理器的外设时钟。
而TSEG1与TSEG2又是怎么划分的呢?TSEG1与TSEG2的长度决定了CAN数据的采样点,这种方式允许宽范围的数据传输延迟和晶体的误差。其中TSEG1用来调整数据传输延迟时间造成的误差,而TSEG2则用来调整不同点节点晶体频率的误差。但是他们由于过于灵活,而使初次接触CAN的人有点无所适从。TSEG1与TSEG2的是分大体遵循以下规则: Tseg2≥Tscl2,Tseg2≥2TSJW,Tseg1≥Tseg2
总的来说,对于CAN的波特率计算问题,把握一个大的方向就行了,其计算公式可了规结为: BitRate = Fpclk/( (BRP+1) * ((Tseg1+1)+(Tseg2+1)+1)

1)、采样时间

       除了波特率之外,CAN接口还有1个重要的参数就是单bit数据的采样时间。采样时间通常用采样点时间位于整个bit时间内的百分比来表示。

       (Sync_Seg+ Prog_Seg+ Phase_Seg1)/( Sync_Seg+ Prog_Seg+ Phase_Seg1+ Phase_Seg2)

       如下图所示,采样点位置为(1+1+4)/(1+1+4+2)=75%。

       与采样时间相关的有如下几个重要参数。

参数

取值范围

说明

Sync_Seg

1 tq

同步段。固定长度,总线输入与系统时钟同步,用于同步总线上不同的节点。在此段内期望有一个 CAN 总线电平边沿出现。如果边沿出现在 Sync_Seg 之外,那么它与 Sync_Seg 之间的长度叫做边沿相位误差 。

Prog_Seg

1~8 tq

传播时间段。用于补偿信号在CAN网络内部的传输过程中的物理延时时间,与网络的拓补结构和长度有关。是信号在总线上的传播时间、接收电路延时及总线驱动器延时的总和的 2 倍。

Phase_Seg1

1~8 tq

相位缓冲段1。用于补偿跳变沿的相位误差,在重同步时可能被延长。

Phase_Seg2

1~8 tq

相位缓冲段2。用于补偿跳变沿的相位误差,在同步时可能被缩短。

SJW

1~4 tq

(重)同步跳转宽度。决定重同步会时将采样点移动多远,移动距离的上限由用于补偿沿相位误差的相位缓冲段Phase_Seg1和Phase_Seg2给定。该参数不参与采样时间的计算。

这个参数也表示CAN总线对波特率范围的容差度,设置较大的值可以提高波特率的适应性。

信息处理时间

0~2 tq

信息处理时间是一个以采样点作为起始的时间段。用于计算后续位的电平。该参数不参与采样时间的计算,与Phase_Seg2的取值相关。

确定Prog_Seg、Phase_Seg1、Phase_Seg2 、SJW的值需要遵循如下几个原则:

  1. Sync_Seg、Prog_Seg、Phase_Seg1和 Phase_Seg2的总和在8~25之间。
  2. Phase_Seg2应该取Phase_Seg1和信息处理时间二者中的最大值。
  3. SJW取Phase_Seg1和4中的最小值。
  4. Phase_Seg2≥SJW,Phase_Seg1≥SJW。
  5. Phase_Seg1+Phase_Seg2为偶数时Phase_Seg1=Phase_Seg2 ,Phase_Seg1+ Phase_Seg2为奇数时Phase_Seg1+1=Phase_Seg2。

      关于CAN采样时间点位置的选取,网上有很多不同的说法,有75%、80%、87.5%、80%~90%等等,CiA官网也没有给出标准值。那么CAN的采样时间应该设置为多少才算合理?对于这个问题并没有1个绝对固定的标准值。对于不同的行业,不同的CAN高层协议(CANopen、DeviceNet等),以及不同的国家都有不同的经验值。

      以应用较为广泛的CANopen协议为例,在2002年的CANopen CiA301 v4.0.2版本规范中,对于采用时间的建议值如下图所示。500k及以下波特率,采样时间建议值为14/16=87.5%,800k为8/10=80%,1M为6/8=75%。

      然而,在2011年的最新版本CiA301 v4.2.0中,对于采样时间作了细微调整,将建议值均统一成了87.5%。而且给出了有效采样时间的可选范围。如下图所示。

       因此,采样时间的选择并没有1个绝对的标准值,针对不同应用和不同行业都会存在变化。但是要确保在同一个CAN网络中所有节点设备的采样时间均保持一致,这样才能保证CAN通信的稳定性。

       广州周立功作为国内CAN产品的领先者,使用了CiA CANopen的建议值,即采样时间为87.5%,SJW=1 tq。因此,我们以此作为CAN接口的设计参考标准。

2)、波特率及采样时间参数计算

     波特率与采样时间的计算互相关联。计算步骤如下:

  1. 首先计算CAN接口参考时钟和波特率的比值,该值为分频系数BRP与总tq个数的乘积。
  2. 根据比值确定BRP和总tq的个数,两者必须都为整数,tq个数范围是8~25;
  3. 将总tq的个数减1(去掉Sync_Seg)后得到Prog_Seg、Phase_Seg1、Phase_Seg2三个参数的和;
  4. 然后分配Prog_Seg、Phase_Seg1、Phase_Seg2各占有的tq数。在计算时,一般将Prog_Seg与Phase_Seg1合为一个整体TS1进行计算,Phase_Seg2作为TS2进行计算。

     手动逐个计算这些参数相对比较繁琐,可以借助广州周立功提供的一款波特率计算工具BtrCal自动计算各项参数。下载页面:http://www.zlg.cn/can/down/down/id/42.html

   如下图所示,CAN接口参考时钟为40M,SJW=0+1时,计算500k波特率的参数。选择误差为0,87.5%采样率下的参数。TS1=12+1=13,TS2=1+1=2。BRP为“位定时”一栏数据末尾的值4+1=5。

      若所需要的波特率计算结果无法满足误差为0时获得87.5%的采样点,则可以取相对较近的值,且适当增大SJW,以提高波特率的适应性。例如,800k波特率计算结果,如下图所示。取80%(满足75%~90%)采样点时的参数,TS1=6+1=7,TS2=1+1=2,BRP=4+1=5。


13.3 FPGA BD工程

      由于米联开客发板中PS的MIO都已经被分配使用。因此,PS的CAN接口需要通过EMIO由PL的引脚引出。如下图所示,将CAN0通过EMIO引出。用户需要在xdc文件中约束CAN0的2个EMIO接口引脚。

      PS的CAN接口默认使用了内部PLL产生的时钟作为参考时钟,将参考时钟频率设为40MHz,如下图所示。

13.4程序分析

      PS端的CAN接口工作于中断模式,实现了多种波特率条件下与PC端CAN调试助手之间的标准的数据帧、远程帧的接收和发送测试。

程序一个包含5个源文件,如下图所示。

      其中can_intr.c、can_intr.h包含了CAN接口的驱动程序。sys_intr.c、sys_intr.h包含了系统中断控制器的驱动程序。main.c中包含了main函数。

13.4.1 CAN接口

can_intr.c中包含了以下几个函数:

  1. can_init,用于初始化和配置CAN接口,包括波特率,采样时间,CAN接口中断设置等。
  2. can_send,用于发送CAN报文。
  3. CanSetupIntrSystem,配置使能CAN接口中断和中断函数,被can_init函数调用。
  4. SendHandler,CAN发送中断回调函数。
  5. RecvHandler,CAN接收中断回调函数。
  6. ErrorHandler,CAN总线错误中断回调函数。
  7. EventHandler,CAN总线事件中断回调函数。

1)、CAN数据帧结构

     定义1个结构体来表示CAN标准帧的格式,如下图所示。分别对应11bit的ID,1bit的远程帧标志位,4bit的数据长度,8字节的数据。

2)、波特率及采样时间设置

    can_intr.h中定义了1个枚举常量来表示程序所支持的波特率。如下图所示,这些均为常用的波特率。

    同时,又定义了一个结构体来表示单bit采样时间的参数设置,如下图所示。分别对应波特率、参考时钟BRP分频系数、TS1、TS2、SJW。

     can_intr.c中相应的定义了1个结构体数组,用于保存程序所支持的各个波特率下的采样时间设置,这些参数均通过广州周立功的BtrCal软件计算得到。如下图所示。

3)、CAN接口中断

PS的CAN接口中一共由4种中断,分别为发送中断,接收中断,错误中断和事件中断。

  1. 发送中断在一帧数据成功发送完成之后被触发,触发后会调用用户自定义的回调函数SendHandler。在程序中,SendHandler为空函数,未实现具体功能,用户可以自行发挥。
  2. 接收中断在到CAN接口接收到一帧数据后被触发,触发后会调用用户自定义的回调函数RecvHandler。在程序中,RecvHandler被用于接收CAN数据。
  3. 错误中断在CAN接口通信时产生错误时被触发,触发后会调用用户自定义的回调函数ErrorHandler。在程序中,ErrorHandler用于判断发生了哪种错误,对于错误的处理未实现具体功能,用户可以自行发挥。
  4. 事件中断在CAN接口发生某些特定事件时被触发,触发后会调用用户自定义的回调函数EventHandler。在程序中,EventHandler用于判断发生了哪个事件,仅对CAN总线关闭事件设计了相应的后续处理功能,对于其他事件的处理未实现具体功能,用户可以自行发挥。

4)、CAN数据发送

      CAN数据发送通过can_send函数来实现。CAN总线中数据在传输时使用了大端模式,即对于长度超过1字节的数据,先传输低字节,再传输高字节。PS端CAN数据帧的组织形式如下图所示,由4个32bit的数据组成。

      由于程序中只使用了标准帧,不使用扩展帧,因此IDE,ID[17:0],RTR段均为0。ID[28:18]对应11bit的ID,STR/RTR对应标准帧中的远程帧标志位,DLC对应数据长度,DB0~DB7对应8字节数据。

5)、CAN数据接收

      CAN数据接收是通过CAN接收中断回调函数RecvHandler而实现的。在RecvHandler中接收到的CAN标准帧中提取出0节中对应的各段数值,判断是否为远程帧,并将相应的参数通过串口打印输出。

13.4.2 main函数

main函数主要完成以下几个过程:

  1. 调用Init_Intr_System初始化中断控制器;
  2. 调用can_init函数初始化CAN接口,配置波特率,采样时间,CAN接口中断;
  3. 调用Setup_Intr_Exception函数初始化系统中断;
  4. 进行CAN接口数据接收和发送测试。

在main.c中定义了1个用于条件编译的宏定义:

#define TEST_RX_ONLY

     当注释该宏定义时,CAN接收和发送测试同时进行,PS以固定频率向外界发送数据。同时,PC端的CAN调试软件也可以向PS发送CAN数据。

     当使用该宏定义时,只进行CAN接收测试,PS不通过CAN对外发送数据。

13.5 硬件连线

通过外扩的FPGA GPIO 连接 CAN模块,MZ7XA、MZ7XB自带此IO

对于没有这组IO的开发板通过FEP转NEP转接卡实现,此转接卡需要单独购买

把CAN模块的,(RX接到IO1)  (TX接到IO2 )   (3.3V接到3V3)   (GND接到GND )

另外需调试CAN接口还需要把CAN模块总线接口连接到CAN分析仪总线接口

13.6程序测试

        程序测试使用的CAN调试助手为广州周立功的CAN_Pro分析软件,下载页面:http://www.zlg.cn/can/down/down/id/42.html

13.6.1数据发送测试

      将main.c中的宏定义:#define TEST_RX_ONLY注释。重新编译工程。

      将CAN分析仪与电脑连接,使用CAN分析仪连接CAN模块,再将CAN模块连接开发板。

      打开CANPro软件,选择1Mbps的波特率连接CAN分析仪。通过SDK将程序下载至开发板运行,此时,在CANPro软件中便可抓取开发板每隔100ms向外发送的CAN数据帧和远程帧,如下图所示。数据帧和远程帧交替发送,每个数据帧的第1个字节数据不断递增。

13.6.2数据接收测试

       还原main.c中的宏定义:#define TEST_RX_ONLY。重新编译工程。将程序下载到开发板中运行。

13.6.3数据帧接收

       打开CANPro软件的数据发送功能,设置如下图所示。通过软件向开发板发送数据长度为8字节的数据帧。发送的第一个字节的数据不断递增。然后,点击立即发送。

      此时可在CANPro软件中查看发送的数据帧。

     同时,开发板通过串口将每次接收到的数据帧信息在SDK中打印出来,如下图所示。可以看到第一个字节的数据在递增。

13.6.4远程帧接收

        通过CANPro软件向开发板发送数据请求长度为8字节的远程帧,设置如下图所示。然后,点击立即发送。

此时,可在CANPro软件中查看发送的远程帧。

SDK中打印信息如下图所示。

13.6.5数据收发同时进行

      将main.c中的宏定义:#define TEST_RX_ONLY注释,重新编译工程。然后将程序下载到开发板中运行。同时,通过软件向开发板连续发送数据长度为8字节的数据帧。如下图所示。

此时可在CANPro软件中查看发送和接收的帧。如下图所示

       同时,开发板通过串口将每次接收到的数据帧信息在SDK中打印出来,如下图所示。可以看到第一个字节的数据在递增。


路过

雷人

握手

鲜花

鸡蛋
发表评论

最新评论

引用 可以 2020-11-9 16:03
您好,想要一份此文章的详细教程和程序源码可以么,谢谢

查看全部评论(1)

本文作者
2019-9-6 19:24
  • 7
    粉丝
  • 6594
    阅读
  • 1
    回复

关注米联客

扫描关注,了解最新资讯

联系人:汤经理
电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼201B
热门评论
排行榜