软件版本: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中打印出来,如下图所示。可以看到第一个字节的数据在递增。

转载于:https://my.oschina.net/msxbo/blog/3099822

米联客 ZYNQ/SOC精品教程 S02-CH13 CAN总线通信实验相关推荐

  1. 米联客 ZYNQ/SOC精品教程 S01-CH06 FPGA按钮去抖实验

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  2. 米联客 ZYNQ/SOC精品教程 S01-CH05 FPGA程序的固化和下载

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  3. 基于zynq的千兆网udp项目_米联客 ZYNQ/SOC 精品教程 S05-CH05 PS 千兆 UDP 加速

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  4. fast角点检测 java_米联客 ZYNQ/SOC 精品教程 S04-CH11 快速角点检测之硬件实现

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  5. 米联客 ZYNQ/SOC精品教程 S01-CH04 VIVADO创建工程之流水灯

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  6. 米联客 ZYNQ/SOC 精品教程 S02-CH15 AXI_Lite 总线详解

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  7. 米联客 ZYNQ/SOC 精品教程 S02-CH24 利用AXI VDMA 实现MT9V034摄像头采集

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  8. 米联客 ZYNQ/SOC 精品教程 S02-CH25 利用OSD实现双目摄像头字幕叠加

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  9. 米联客 ZYNQ/SOC精品教程 S01-CH07 FPGA多路分频器实验

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

最新文章

  1. AI一分钟 | 马斯克证实:特斯拉私有化的幕后推手是沙特主权基金;DeepMind的AI可以检测出超过50种眼疾...
  2. 原创 | 疫情之下,这些数字经济赛道危中有机
  3. 带缓冲的I/O操作和不带缓冲的I/O操作
  4. Angular学习(7)- 模板2
  5. 线性代数思维导图_线性代数入门级思维导图
  6. JAVA:Java二维数组处理-Bit型转Bitmap
  7. 为什么机器人企业的算法工程师需要ROS开发经验
  8. Java中MVC详解以及优缺点总结
  9. Python的argparse
  10. 运动目标跟踪(三)--搜索算法优化搜索方向之Meanshift
  11. C++中打印可变参数函数输出到控制台
  12. LINUX实验---网络管理
  13. 嵌入式linux系统蜂鸣器实验,嵌入式系统原理实验四蜂鸣器.docx
  14. CoffeeScript是什么
  15. 如何解决 MacBook 电池耗电问题
  16. GA遗传算法实现记录 C++版本 解决多元函数最值问题
  17. vim工具——常用插件
  18. win7远程计算机设置路由器,win7路由器设置图解 win7路由器怎么设置
  19. 生成器模式 - Unity
  20. iOS中 为 iOS 建立 Travis CI 韩俊强的博客

热门文章

  1. 世界最研究计算机的人,他是世界最顶尖的计算机大师,回国培养人才12年却默默无闻?...
  2. Linux 帮助指令(man、help、info)
  3. 今天浙大录取了 开个博客 讲讲考研的心路
  4. python 文本分析库_快速使用Python进行文本情感分析
  5. 查全率与查准率的计算方法
  6. win10此计算机缺少或多,win10系统打开cad提示缺少一个或多个shx文件的设置方案...
  7. 期货交易 python_《期》字意思读音、组词解释及笔画数 - 新华字典 - 911查询
  8. 手机浏览器利用js实现 禁用浏览器后退
  9. Comsol5.5 简单管道声场特性仿真
  10. 生信步骤|MAFFT结合HMMER进行多序列比对和基于隐马模型的基因搜索