软件版本: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种类型的帧,分别为:数据帧、远程帧、错误帧、过载帧和帧间隔。
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),这些时间段包括: 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有波特率的值四以下几个元素决定: 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%。 与采样时间相关的有如下几个重要参数。
确定Prog_Seg、Phase_Seg1、Phase_Seg2 、SJW的值需要遵循如下几个原则:
关于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)、波特率及采样时间参数计算波特率与采样时间的计算互相关联。计算步骤如下:
手动逐个计算这些参数相对比较繁琐,可以借助广州周立功提供的一款波特率计算工具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数据帧结构定义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种中断,分别为发送中断,接收中断,错误中断和事件中断。
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函数主要完成以下几个过程:
在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中打印出来,如下图所示。可以看到第一个字节的数据在递增。 |
扫描关注,了解最新资讯