摘要:USB2.0接口技术为外设与主机之间提供了一种灵活高效的双向数据通道。可广泛地应用于数据采集、工业控制和消费数码等方面。本文简要介绍了支持USB2.0协议的接口芯片CY7C68013的结构。分析了 CY7C68013芯片的固件程序框架的结构。给出了如何在该固件程序框架下使用C语言进行固件程序开发的方法。
关键字: USB2.0, 接口,固件程序
引言:
现代工业生产和科学研究对数据采集的要求日益提高,在瞬态信号测量、图像处理等一些高速、高精度的测量中,需要进行高速数据采集。USB2.0接口以其高速率、灵活性等优点渐有取代传统的ISA及PCI数据总线的趋势。与此同时作为一种灵活而又低廉的接口技术,USB接口更是以其热插拔特性成为各种PC外设的首选接口。因此,围绕着USB2.0的开发成为当前的一大热门。
下面将以Cypress公司的CY7C68013芯片为例来探讨一下支持USB2.0协议的固件程序的开发。
1. 接口芯片CY7C68013简介:
CY7C68013芯片是Cypress公司的EZ-USB FX2系列中一种既满足USB2.0协议同时兼容USB1.1协议的功能强大的接口芯片。其结构如下图所示[2]:
图1 CY7C68013接口芯片结构
该芯片有如下几个特点[2]:
1) 集成有一块增强型8051内核
与普通8051微处理器相比该增强型处理器有如下改进:
l 完成每个指令周期只需4个时钟周期;
l 时钟频率可软配置为12/24/48MHz;
2) 集成有一个串行接口引擎(SIE)以及一个USB2.0收发器
由于USB2.0收发器和串行接口引擎完成了USB协议的封包、解包等功能,屏蔽了底层信号的电气特性。
3) 支持软配置:
采用再次枚举(ReNumeration)技术,固件程序可以保存在主机上,每次上电后通过USB接口将固件下载到芯片RAM中。具有很大的灵活性。
4) 通用可编程接口(GPIF):
GPIF提供可编程控制的接口时序,使得无需附加逻辑(glue logic)即能实现与外围芯片如DSP、ASIC等的连接,同时也支持ATAPI、EPP等总线标准。
5) 四个可编程端口(Endpoint):
CY7C68013共有7个输入输出端口:EP0、EP1OUT、EP1IN、EP2、EP4、EP6、EP8。其中EP2、EP4、EP6、EP8 分别可以被配置为批量/中断/同步传输模式,传输方向均可配置为出/入。
6) 可编程缓冲区(Buffer)深度:
端口EP2、EP6的缓冲区大小可编程为512或1024字节,深度可编程为2/3/4倍大小;端口EP4、EP8的缓冲区固定为512字节大小,深度为2倍。采用不同的配置方式,实现特定带宽、速率要求的数据传输。
2.开发工具:
Cypress公司的网站(http://www.cypress.com)上提供了CY7C68013芯片的开发工具包下载,该开发包提供了开发固件程序的所需的一些资源:Keil uVision2集成开发环境(限制版);Cypress C51固件框架程序以及一些例子程序。
Keil uVision2 是一个功能强大的集成开发环境,该开发环境集成有C51编译器和A51汇编器以及BL连接定位器等一系列工具和模拟仿真、调试器,因此它能够支持C程序和汇编程序混合的工程,给软件的开发带来很大的便利[5]。
Keil C51是一种专为8051单片机设计的高效率C语言编译器,符合ANSI标准,生成的程序代码运行速度极高,所需要的存储空间极小,完全可以个汇编语言相媲美。同时,C51具有丰富的库函数,多达100多种功能函数。因此,采用C语言作为开发语言以Keil uVision2作为工程开发平台,完成源代码的编写、仿真、调试,将在相当程度上降低固件开发难度、提高开发效率[4]。
3.固件结构及组成:
固件程序的功能虽然复杂,在编写时需要用到大量的函数,但其基本结构却相对简单,包括如下几个部分:
3.1设备描述符表:
每一个USB设备在与主机建立数据通信之前必须先向主机通报自己的具体配置,包括设备的厂商、产品识别号(VID、PID),设备的供电方式以及能量消耗等一系列重要信息。而这些有关设备的信息就是通过设备描述符表来通报给主机,从而使主机采用适当的方式建立与设备之间的连接.其结构如下所示:
DeviceDscr:
db 18 ;;该描述符长度(以字节为单位)
db DSCR_DEVICE ;; 描述符类型
……
db 1 ;; 共有几种配置(1种)
3.2固件程序框架源码:
该文件提供了一个固件程序的框架结构,适用于一般的对数据传输的控制。该结构提供了对开发者开放的程序接口,开发者通过在这些接口函数中加入适当的代码来实现所需的功能。
其工作流程如图 2所示,
图2 固件程序框架工作流程
3.3接口函数:
在固件程序框架中提供了功能函数接口,通过在这些接口函数中加入自行开发代码可以实现特定的功能并大大降低固件程序的开发难度,加速USB系统开发的过程。这些接口函数分三类:任务分配、标准设备请求执行和USB总线中断处理[3]。下面将依次介绍这些接口函数和用途。
3.3.1任务分配
TD_Init()
说明:此函数主要是完成FX2的初始化,在FX2再次枚举和开始任务分配前被调用,其目的是初始化各个端口以及各端口的先入先出缓冲区。
TD_Poll()
说明:此函数在设备运行时被重复的调用,它应包括完成特别任务的代码。在该函数返回前,优先级高的任务可能已经完成。但是,如果它返回值为假,FX2将不会影响设备请求和USB总线设备挂起事件。如果需要大量的处理时间,FX2就会通过多次调用TD_Poll()函数将时间分段。
TD_Suspend()
说明:此函数是在设备进入挂起状态前调用的,开发者在其中加入适当的代码,对设备的工作状态进行配置,可使设备处于低功耗状态并返回真值。但是开发者可以改动TD_Suspend()的程序代码,使其返回为假,这样可以使FX2不进入挂起状态。
TD_Resume()
说明:当外部要求重新启动时(如,外界产生Wakeup中断或者USB总线有传输活动发生),设备就会通过调用此函数来对处理器进行重启,也就是TD_Suspend()函数的逆操作。此时,设备在正常电源下重新启动。
3.3.2设备请求
设备请求函数具有如下的形式:
BOOL DR_xxx(void)
{
…… file://设备请求处理代码
return(TURE);
}
主要是完成对于来自主机的命令及请求的处理工作,如配置端口等。
3.3.3USB中断
FX2设备的中断包括与标准8051中断相同的中断同时也包含一些FX2特有的中断。由于在固件程序中提供了中断服务例程接口,开发者只须在需要处理的中断服务例程接口中加入自己编写的中断服务代码即可完成对相应中断请求的服务,这样就可以避免深入研究FX2的中断自动引导(Interrupt Autovectors)的逻辑结构[2]。这些中断服务例程接口函数的形式为:
void ISR_xxx(void) interrupt 0
{
…… file://开发者中断服务代码
EZUSB_IRQ_CLEAR();
USBIRQ = bmXXX; // 清除该中断请求
}
4. 总结:
在了解了Cypress的固件程序框架结构之后,采用Keil uVision2开发环境在该Cypress的固件框架下开发可以在很大程度上降低固件程序的开发难度并缩短开发周期,获得较高的效率。
上一篇:USB双机通讯的原理
下一篇:X9628与PIC16C72的接口电路图
推荐阅读最新更新时间:2023-10-12 20:39
- 英飞凌推出OptiMOS™ Linear FET 2 MOSFET, 赋能先进的热插拔技术和电池保护功能
- USB Type-C® 和 USB Power Delivery:专为扩展功率范围和电池供电型系统而设计
- ROHM开发出适合高分辨率音源播放的MUS-IC™系列第2代音频DAC芯片
- ADALM2000实验:变压器耦合放大器
- 高信噪比MEMS麦克风驱动人工智能交互
- 在发送信号链设计中使用差分转单端射频放大器的优势
- 安森美CEO亮相慕尼黑Electronica展,推出Treo平台
- 安森美推出业界领先的模拟和混合信号平台
- 贸泽开售用于快速开发精密数据采集系统的 Analog Devices ADAQ7767-1 μModule DAQ解决方案