软件版本: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种类型的帧,分别为:数据帧、远程帧、错误帧、过载帧和帧间隔。
- 数据帧:用于发送节点向接收节点传送数据的帧。
- 远程帧:用于接收节点向具有相同ID的发送节点请求数据的帧。
- 错误帧:用于当检测出错误时向其他节点通知错误的帧。
- 过载帧:用于接收节点通知其尚未做好接受准备的帧。
- 帧间隔:用于将数据帧及远程帧与前面的帧分离开来。
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又是怎么划分的呢SEG1与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的值需要遵循如下几个原则:
- Sync_Seg、Prog_Seg、Phase_Seg1和 Phase_Seg2的总和在8~25之间。
- Phase_Seg2应该取Phase_Seg1和信息处理时间二者中的最大值。
- SJW取Phase_Seg1和4中的最小值。
- Phase_Seg2≥SJW,Phase_Seg1≥SJW。
- 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)、波特率及采样时间参数计算
波特率与采样时间的计算互相关联。计算步骤如下:
- 首先计算CAN接口参考时钟和波特率的比值,该值为分频系数BRP与总tq个数的乘积。
- 根据比值确定BRP和总tq的个数,两者必须都为整数,tq个数范围是8~25;
- 将总tq的个数减1(去掉Sync_Seg)后得到Prog_Seg、Phase_Seg1、Phase_Seg2三个参数的和;
- 然后分配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中包含了以下几个函数:
- can_init,用于初始化和配置CAN接口,包括波特率,采样时间,CAN接口中断设置等。
- can_send,用于发送CAN 文。
- CanSetupIntrSystem,配置使能CAN接口中断和中断函数,被can_init函数调用。
- SendHandler,CAN发送中断回调函数。
- RecvHandler,CAN接收中断回调函数。
- ErrorHandler,CAN总线错误中断回调函数。
- 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种中断,分别为发送中断,接收中断,错误中断和事件中断。
- 发送中断在一帧数据成功发送完成之后被触发,触发后会调用用户自定义的回调函数SendHandler。在程序中,SendHandler为空函数,未实现具体功能,用户可以自行发挥。
- 接收中断在到CAN接口接收到一帧数据后被触发,触发后会调用用户自定义的回调函数RecvHandler。在程序中,RecvHandler被用于接收CAN数据。
- 错误中断在CAN接口通信时产生错误时被触发,触发后会调用用户自定义的回调函数ErrorHandler。在程序中,ErrorHandler用于判断发生了哪种错误,对于错误的处理未实现具体功能,用户可以自行发挥。
- 事件中断在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函数主要完成以下几个过程:
- 调用Init_Intr_System初始化中断控制器;
- 调用can_init函数初始化CAN接口,配置波特率,采样时间,CAN接口中断;
- 调用Setup_Intr_Exception函数初始化系统中断;
- 进行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中打印出来,如下图所示。可以看到第一个字节的数据在递增。
相关资源:天弛专业挽联打印软件v2.7版挽联打印软件挽联软件分享.pdf-其它…
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!