APP下载

CY7C68013A端口模式下数据传输模块的设计

2018-03-27

计算机测量与控制 2018年3期
关键词:固件外设通信协议

, , ,

(1.中国科学院 国家空间科学中心, 北京 100190; 2.中国科学院大学, 北京 100049)

0 引言

基于USB接口的数据传输系统因其连接方便、配置灵活、即插即用和支持热插拔等优点,在数据采集、自动控制和电子测量等领域得到了广泛地应用[1]。Cypress公司的CY7C68013A是一款高速的USB2.0接口控制芯片[2],因其高度的集成性,而得到了广泛的应用。

CY7C68013A支持3种接口连接模式:端口模式、通用可编程接口GPIF主控模式和从器件FIFO模式。在端口模式中,所有的IO引脚均为通用的IO口,固件程序简单,数据传输需要CPU参与,传输速率较低。后两种模式,外设直接连接内部端点缓冲FIFO,不需要CPU参与,具有很高的传输速率。GPIF主控模式,CY7C68013A作为主控制器,固件程序复杂。从属FIFO模式,CY7C68013A作为从器件被外部控制器访问,固件程序简单,但需要外部控制器的时序控制,增加了硬件电路的复杂性。综合以上3种模式的优缺点,在传输速率要求不高的场合,端口模式可作为一种有效的传输方式[3]。但对于端口模式,文献中介绍较少[3-4]。针对这种情况,本文将介绍CY7C68013A端口模式下数据传输模块的设计,并重点介绍其通信协议设计和软硬件设计。

1 系统总体设计

系统的任务是设计一个通用的数据传输模块,来实现计算机与低速实时传输和高速非实时传输外设之间的数据交互。对应的系统连接框图如图1所示。上位机通过USB控制器接收外设接口电路发送的数据,并进行显示和保存,实现对外设的实时监测;同时向外设发送命令数据,实现对外设的功能控制。对应各部分的具体功能描述如下:

上位机界面程序:控制系统的工作过程,显示、保存接收的外设数据,并向外设发送命令数据。

USB接口电路:实现PC机与USB接口控制芯片的物理连接。

USB接口控制芯片:采用CY7C68013A的端口模式实现与外部设备之间数据双向传输。

串行EEPROM:采用24LC00提供设备的VID/PID,用于设备的枚举和重枚举。

外设接口电路:实现模块与外设电路的连接,主要包含端口模式下与外设之间的通信协议信号。

其中,外设接口电路直接决定此数据传输模块的可靠性,是设计的重点,后面会给出详细的设计介绍。

2 硬件设计

2.1 CY7C68013A芯片

CY7C68013A在单芯片上集成了USB2.0收发器、智能串行接口引擎、增强型8051微处理器、16 KB软配置RAM、4 KB端点缓冲区FIFO和可编程外设接口,主要用于USB主机与外设之间的数据传输。其中串行接口引擎用于完成大部分USB2.0协议的处理工作,通过USB收发器与USB主机进行数据交互;可编程外设接口用于USB设备与外设之间的连接;4KBFIFO则作为数据缓冲区,传输中的数据缓存,同时增加了吞吐量。

图1 系统连接框图

设计中,USB和外设之间通信的控制和状态信号由IOA和IOD接口完成,IOB接口则用于通信的数据总线。同时,设置EP2-FIFO为USB发送数据缓冲区,EP6-FIFO为接收数据缓冲区。

2.2 USB数据传输过程

端口模式下USB数据传输过程:

USB数据发送时,CPU按照预定的通信协议读取IO端口的数据,并将数据存放在预发送的IN端点缓冲区,将预发送的字节数写入对应的端点字节计数寄存器中,在接收到主机IN请求后,USB内核将IN端点缓冲区的数据传输到主机,主机将接收到的数据存放在内存中,并通过读取内存来保存和显示接收的数据。

USB数据接收时,主机将预发送的数据写入内存中,并发送OUT请求,USB内核在有空闲OUT端点缓冲区时接受OUT请求,并将接收的数据写入预定义的OUT端点缓冲区,CPU通过读取对应的端点字节计数寄存器来确定接收的字节数,随后按照预定义的通信协议将数据发送到IO端口,供外设读取。

2.3 通信协议设计

端口模式下的数据传输是通用IO口来实现的,为实现数据的可靠通信,必须对这些通用IO口赋予实际的意义,即制定通信协议。通信协议如下:

IOB7-IOB0被定义为8位的数据信号;WRB(IOD[0])与WRB_ACK(IOA[1])、RDB(IOA[2])与RDB_ACK(IOD[2])被定义为单字节传输的请求/响应信号;IOA[7:3]与WR_ACK(IOA[0])、IOD[7:3]与RD_ACK(IOD[1])被定义数据传输的请求/响应信号。主要的工作过程如下:

单字节数据请求/响应式传输过程:在USB向外设发送单字节数据时,USB首先将RDB信号置1,向外设发送写数据请求,在接收到外设发送的写应答信号RDB_ACK为1后,将输出端点缓冲区EP2FIFO中的单字节数据写入8位的数据端口,并撤销请求信号RDB为0,通知外设读取数据,当检测到RDB_ACK信号为0时,表明外设成功接收数据,开始准备发送下一字节数据。同理,在USB接收外设发送的单字节数据时,USB在接收到外设请求信号WRB为1后,将写应答信号WRB_ACK置1,通知外设发送数据,在检测到WRB信号为0时,将数据端口数据写入数据端点缓冲区EP6FIFO,完成后将WRB_ACK置0,通知外设数据接收成功,开始准备接收下一字节数据。

数据传输过程同样采用上述的请求/响应式传输方式,采用RD和IOA[7:3]作为USB接收外设数据的控制信号,同理采用IOD[7:3]和WR_ACK作为USB向外设发送数据的控制信号。IOA[7:3]和IOD[7:3]在作为数据接收应答和数据发送请求信号的同时,还可利用其不同逻辑组合来实现不同类型数据的传输,最多可支持31种不同数据传输。

如上所述,采用请求/响应式数据传输方式,保障了数据传输的连续性和可靠性,不仅适用于低速传输外设,同样适用于高速非实时传输外设。同时,借助不同的逻辑组合实现不同类型的数据传输,拓展了可适用范围。

2.4 外设接口电路设计

根据上述USB与外设之间的通信协议,对应的外设接口电路设计图如图2所示。采用端点EP2为发送缓冲,端点EP6为接收缓冲。

图2 外设接口电路设计图

3 软件设计

系统软件设计包括固件设计、驱动程序设计和上位机界面程序设计三部分。这三部分之间的关系如图3所示,应用程序通过CyAPI.lib库对Win32子系统进行Win32 API调用,用于访问设备驱动程序,从而与固件程序进行通信。

图3 系统软件组成

3.1 固件程序设计

端口模式下的数据传输需要固件程序的参与,所以固件程序主要实现两方面的功能:一方面用于响应USB主机请求,另一方面用于实现USB设备与外设之间的数据通信。

设计中的固件程序设计是借助Cypress公司提供的EZ-USB FX2LP软件开发包完成的。开发包中的固件框架提供了完备的框架函数和程序代码,极大地简化和加速USB外设的开发。框架流程如图4所示,主要包括USB设备初始化、设备重枚举、外设功能函数、USB主机请求响应和电源管理等,对于框架流程在文献[5]中有详细描述,这里不再赘述。由于固件框架中已经包含了USB主机请求响应函数,故在固件程序设计中主要完成USB设备与外设之间的数据通信,包括初始化程序设计和通信程序设计两部分。

图4 固件框架流程图

3.1.1 主要寄存器及功能描述

端口模式下,与固件程序相关的寄存器及功能描述如表1所示。CPUCS用于选择CPU工作时钟,可选时钟频率为12/24/48 MHz,设计中为提高传输速率、增加吞吐量,选择时钟频率为48 MHz。IFCONFIG用于选择端口模式。EPxCFG用于配置端点方向和对应缓冲区大小,配置端点EP2为OUT,EP6为IN;为增加吞吐量,将端点EP2和EP6均设为4倍缓冲,同时设置端点EP4和EP8为无效。AUTOPTRSETUP用于配置自动指针,通过使能自动指针和地址自加,实现对数据缓冲区的快速访问。关于其他寄存器的位定义和功能描述可参考文献[2]。

表1 与固件程序相关的寄存器及功能描述

3.1.2 初始化程序设计

初始化程序设计是指对变量、USB内部状态和相关寄存器的初始化,主要包括选择时钟频率、设置接口模式、端点和端口以及使能自动指针等操作。对应软件程序在框架函数TD_Init()中完成,其主要代码如下:

TD_Init(void)

{ ---

CPUCS = 0x12;//设置CPU频率为48MHz

SYNCDELAY;

IFCONFIG |= 0x40;//选择端口模式

SYNCDELAY;

EP2CFG = 0xA0;//配置EP2为4倍的OUT

端点,端点大小为512字节

SYNCDELAY;

EP6CFG = 0xE0;//配置EP6为4倍的IN端点,端点大小为512字节

SYNCDELAY;

EP4CFG = 0x02;//配置PE4端点无效

SYNCDELAY;

EP8CFG = 0x02;//配置EP8端点无效

SYNCDELAY;

OEA =0x00;//配置IOA[7:0]为输出端口

SYNCDELAY;

OED =0x00;//配置IOD[7:0]为输入端口

SYNCDELAY;

AUTOPTRSETUP |= 0x01;//使能自动指针

}

3.1.3 通信程序设计

根据2.3节描述的通信协议,对应通信程序主要工作流程如图5所示,对应软件程序在框架函数TD_Poll()完成。下面给出USB作为接收端,接收外设发送的数据,并提交给上位机的主要程序代码。而USB作为发送端与其作为接收端类似,这里不再给出详细的程序代码。

图5 通信程序主要工作流程

void TD_Poll(void){ if(IOD & 0x80)//根据IOD[7:3]判断不同的数据请求类型

{ if(!(EP2468STAT & bmEP6FULL))//判断EP6 IN端点缓冲是否已满,若不满,则接收数据

{ AUTOPTRH1= MSB( &EP6FIFOBUF );//将EP6FIFOBUF地址赋值给自动指针

AUTOPTRL1= LSB( &EP6FIFOBUF );

IOA |= 0x01;//IOA[0]表示WR_ACK,将其置1,同意外设发送数据

for( i = 0x00; i < 512;)//接收字节数i初始化

{ while(!(IOD& 0x01));//IOD[0]表示WRB,检测单字节发送请求

IOA |= 0x02;//IOA[1]表示WRB_ACK,将其置1,同意单字节发送请求

while(IOD& 0x01);//IOD[0]表示WRB,判断是否可以读取数据

EXTAUTODAT1 = IOB;//读取端口数据IOB[7:0]

IOA &= 0xFD;//IOA[1]表示WRB_ACK,将其置0,为接收下一字节做准备

i++;//接收字节数加1

if(IOD & 0x80)//根据IOD[7:3]判断数据发送请求是否结束

;//继续循环

else

{ IOA&= 0xFE;//IOA[0]表示WR_ACK,将其置0,为接收下一数据做准备

break;//跳出循环,结束接收数据操作

}

}

EP6BCH = i/256;//向上位机提交IN包

SYNCDELAY;

EP6BCL = i%256;

}

}

}

3.2 驱动程序设计

驱动程序保证了应用程序对USB设备的正常访问。Windows的USB驱动遵循Win32驱动模式,采用分层驱动模型,包括设备驱动层和总线驱动层。其中设备驱动包含USB通信协议细节,用于实现应用程序与USB设备通信;总线驱动由根集线器驱动、总线类驱动和主机控制器驱动组成,用于传递总线通信,并最终实现USB主机与USB设备连接。图3表明了对应驱动在USB通信中的连接关系。其中总线驱动由操作系统提供,不需要开发者编写,故在驱动程序设计中只需完成设备驱动程序设计。

Cypress公司提供了通用的USB驱动程序,包括固件下载驱动CyLoad.sys和通用驱动Cyload.sys两部分。其中固件下载驱动用于固件程序下载,通用驱动则用于主机与固件之间的通信。固件下载驱动在USB设备自枚举之后进行固件下载,然后按照固件程序进行设备重枚举,重枚举之后在通用驱动下完成USB设备通信。设计中,为确保USB设备具有唯一的设备VID和PID,将对应设备信息文件CyLoad.inf和CyLoad.inf文件中的VID/PID均设置为0x04B4/0x00F0。

3.3 上位机界面程序设计

上位机界面程序一方面向外设发送命令数据;另一方面接收外设数据,并进行显示和保存。Cypress公司提供的USB主机控制函数库CyAPI.lib可实现Visual C++环境下对USB设备的读写。在使用Cypress公司提供的驱动程序的基础上,只需在主机程序中加入头文件CyAPI.h和库文件CyAPI.lib,然后便可以调用相应的控制函数。

界面程序主要分为四部分:1)USB设备连接检测和选择。通过Isopen来检测USB设备连接,并根据设备PID/VID选择需要通信的USB设备。2)数据接收操作。通过“Start”按钮,开启数据接收主进程,并利用多线程实现数据的实时接收、显示和保存。再次点击此按钮,结束数据接收操作。3)数据发送操作。将预发送的数据以文件的形式保存,通过组合框控件,选择相应的数据发送操作,同时记录已发送的数据,以备后期查看。4)辅助功能。辅助功能主要包括数据保存时间间隔设置、接收数据文件保存目录设置和发送数据编辑等。表2对实现界面程序主要操作和功能的方法作了详细介绍。

4 实验结果与分析

在模块测试中,将FPGA发送的数据作为外设数据来源,FPGA以00-3F的递增数据作为一个数据包,循环发送数据。利用此传输模块来接收FPGA发送的数据包,接收保存的数据包内容如图6所示。表明系统可正确保存接收到的数据。数据传输中界面状态,编辑框实时显示接收的数据,满足了系统接收数据显示的功能要求。实验结果表明,可以准确无误地实现接收数据的显示和保证操作,满足外设数据传输要求。

表2 上位机界面程序主要操作和功能

图6 模块接收保存的递增数据

5 结束语

采用CY7C68013A的数据传输模块,集成了USB的诸多优点。利用其软配置特性,保证了模块的可拓展性;利用其热插拔和即插即用特性,保证了模块的实用性;采用端口模式,缩短了开发周期;采用命令/响应式的传输方式,保证了数据传输的连续性和可靠性。针对于低速实时传输和高速非实时传输的外设,此传输模块均为一种有效的选择方案,具有很高的实用价值。同时,也为USB其他接口模式的开发提供了借鉴意义。

[1] 张少真,崔小虹,殷 聪,等. 激光汇聚原子系统中基于USB接口的数据采集[J]. 电子测量技术,2015,38(04):136-140.

[2]Cypress. EZ-USB Technical Reference[Z].2014.

[3]袁 卫,赵小明,张建奇. Ports模式下CY7C68013和FPGA的数据通信[J]. 单片机与嵌入式系统应用,2006(7):49-51.

[4]寇 静. 基于端口模式的CY7C68013固件程序设计[J]. 微计算机信息,2010(5):116-117.

[5]钱 峰. EZ-USB FX2单片机原理、编程及应用[M]. 北京:北京航空航天大学出版社,2006.

[6]Compaq,Intel,and LucentUniversal et al. Serial Bus Specification Revision 2.0[S],2000

[7]臧金梅,李 国,安文龙,等. 基于CY7C68013的高速数据传输模块设计[J]. 微计算机信息,2008,(27):110-111.

[8]韦 飞,王世金. 基于USB技术的通用I/O控制和数据传输模块设计[J]. 数据采集与处理,2003,18(2):232-237.

[9]周 槃,姜书艳,蔡荣海等. 基于WDM的通用串行接口驱动程序设计——Cypress68013芯片驱动设计[J]. 仪器仪表学报,2005,26(8):596-598.

[10]Jan Axelson. USB大全[M]. 北京:中国电力出版社,2001.

猜你喜欢

固件外设通信协议
尼康旗舰Z9升级新固件延长高速连拍时间
基于国产化IT 基础设施的通用固件安全模型研究
车载网络通信协议标准化问题研究
电动汽车充电接口及通信协议新国标发布
英特尔发布免费固件引擎
提取ROM固件中的APP
外设天地行情
基于R8C的汽车OBD通用故障诊断仪设计
外设天地行情
外设天地行情