223 基于 USB 接口的实时双向数据流传输 杨鸿珍 徐元欣 王匡浙江大学信息系统与电子工程系 杭州 310027 摘要利用 USB 通用串行总线 技术设计了一个实时双向的数据传输通道 介绍了该设计的原理 并选择了具体的元器件型号 给出 了该通道的硬件结构图 并进一步给出了 USB 固件程序 驱动程序以及上层应用程序的设计方法 关键词 USB FPGA 固件程序 驱动程序 异步调用 Real-time Bidirectional Data Transmission Based on USB Interface YANG Hongzhen, XU Yuanxin, WANG Kuang (Department of Information System & Electronic Engineering, Zhejiang University, Hangzhou 310027) Abstract The article designs a real-time bidirectional transmission channel. And it introduces the theory of the design, selects specific chip, introduces the hardware of the channel, and brings forward the method of designing USB firmware, driver, and application. Key words USB; FPGA; Firmware; Driver; Asynchronous call 计算机工程Computer Engineering 第31 卷第20 期Vol.31 20 2005 年10 月October 2005 开发研究与设计技术 文章编号 1000 3428(2005)20 0223 03 文献标识码 A 中图分类号 TP334 随着通信技术和电子技术的不断发展和商业化程度的 提高 人们对计算机和外设之间数据传输的要求也越来越高 希望数据的传输是实时的 速率尽可能高的 利用 USB 接口 设计出一个实时双向数据流传输通道 将更好地满足不同用 户的需求 USB 的广泛应用和其外围芯片的价廉物美 也使 得本设计成本低廉 使用方便 所以将具有广阔的市场前景 1 总体设计思想 在传统的用外设与 PC 机通信时 存在着一些缺点 如PCI 总线虽然传输速率很高 支持即插即用 但插拔麻烦 要占用 IRQ DMA 等I/O 资源 且扩展槽有限 RS-232 串 行总线连接简单 但缺点是传输速度慢 且主机上的串行口 数目有限 而通用串行总线是针对 PC 机外设的一种新型接 口技术 具有很多优越性 即插即用 可热插拔 具有自动 配置能力 用户只要简单地将外设插入到 PC 以外的总线中 PC 就能自动识别和配置 USB 设备 而且带宽更大 增加外 设时无须在 PC 内添加接口卡 多个 USB 集线器可相互传送 数据 使PC 可以用全新的方式控制外设 USB1.1 协议有两 种传输速率 低速 1.5Mbps 和高速 12Mbps, 1999 年发布的 USB2.0 协议增加了高速传输模式 其速率可达到 480Mbps USB 总线属一种轮询方式的总线 主机控制端口初始化 所有的数据传输 每一总线执行动作最多传送 3 个数据包 按照传输前制定好的原则 在每次传送开始时 主机控制器 发送一个描述传输运作的种类 方向 USB 设备地址和终端 号的 USB 数据包 这个数据包通常称为标志包 USB 设备从 解码后的数据包的适当位置取出属于自己的数据 数据传输 方向不是从主机到设备就是从设备到主机 在传输开始时 由标志包来标志数据的传输方向 然后发送端开始发送包含 信息的数据包或表明没有数据传送 接收端也要相应发送一 个握手的数据包表明是否传送成功 USB 本身的优越性和它的协议定义的数据传输方式使得 我们可以设计出一个基于 USB 的数据传输通道 该通道的数 据传输可以是实时的 双向的并且是高速的 所以在考虑设 计传输通道时 毫不犹豫地选择了 USB 技术 由于 USB 是 串行传输方式 因此可以利用软件做成收发独立的两个通道 为了使 USB 芯片到被测设备 DUT 之间的传输从硬 件上将收发分成两个独立的通道 需要在这两者之间加上一 个单通道/双通道的转换区 又由于考虑到在 USB 端的数据 传送速度和被测设备的传送速度会有较大差异 为了提高系 统运行速度和防止数据丢失 需要这个转换区有足够大的先 进先出的缓存 在本设计中 该转换区选用 SDRAM+FPGA 的方式 图1就是基于 USB 接口的实时双向数据流传输通道 的系统框图 图1系统框图 2 硬件设计 2.1 USB 芯片的选择 常用的 USB 芯片有两种 (1)仅包含 USB 的串行接口引 擎SIE FIFO 内存 收发器以及电压调整器等的芯片 如Philips 公司的PDIUSBD11 11A 与12 系列National Semiconductor 公司的 USBN9602/9603 等 这类芯片价格便 宜 但需要另外加单片机来控制 USB 的收发 (2)内含 USB 单元的微处理器 如Cypress 公司的 EZ-USB 系列 Atmel 的AT43USB321Motorola 的68H705JB 系列等 采用这类芯 片的好处就是设备端的软件开发相对简单 可缩短开发周期 在实际的开发中 由于考虑到设备的传输速度要求 开 发周期 性价比等一系列问题 选择使用 Cypress 公司的 cy7c68013 芯片 该芯片集成了 USB2.0 的USB 收发器 一 个智能的 SIE 增强型 8051 控制器和一个可编程的外设接口 作者简介 杨鸿珍 1975 女 硕士生 研究方向 数字通信系 统与 FPGA 设计 徐元欣 博士 讲师 王匡教授 博导 收稿日期 2004-09-03 E-mail yanghz@sina.com PC 主机 USB 芯片 单通道/ 双通道 转换区 发通道 收通道 被测 设备 224 GPIF 可以工作在全速 12Mbps 和高速 480Mbps 两种模式下 8051 的软件可通过 USB 接口由主机下载 或 者通过 I2C 总线由 EEPROM 读入 或者外部的存储器读入 芯片的外部数据接口可根据需要选择 8 位或者 16 位 对外有 16 位的地址线 具有很大的灵活性 GPIF 作为 Master, 可定 义波形来控制与芯片相连的外围设备的数据读写 内部增强 型8051 内核采用 48M 时钟 每个总线周期只占用 4 个时钟 周期 并带有 2 个UART 3 个定时器/计数器和两个数据指 针 并对中断系统进行了扩展 因而性能大大超过了标准 8051 同时 Cypress 公司提供了相应的开发工具 降低了开 发难度 2.2 SDRAM 和FPGA 的选择 由于同步动态内存 SDRAM 与系统总线同步工作 避免 了在系统总线对异步 DRAM 进行操作时同步所需的额外等 待时间 可加快数据的传输速度 因而根据数据存储区的要 求 我们选择 SDRAM 作为数据存取的内存 Samsung 公司 生产的 K4S643232F 芯片 是512k*32Bit*4 Banks 的CMOS SDRAM 它采用 3.3V 的电源供电 列地址选通延迟时间 CAS Latency 可为 2 或者 3 突发长度可为 1 2 4 8 或全页 刷新周期为 15.6 s 是一款性能良好的 SDRAM 为了使 SDRAM 能够有效地和 USB 芯片以及收信机进行 数据传输 需要有一个控制器来控制 SDRAM 的读写 在本 系统中 选择 Altera 公司的 Cyclone EP1C6 芯片 该芯片有 240 个管脚 5 980 个LE 90kB RAM 2 个锁相环 185 个 用户 I/O 口 能很好地满足本系统模型的要求 图2是本设 计的硬件原理图 PC D+ D- USB transceiv er LABs I/O element I/O element SDRAM K4S643232F I/O element D U T Cyclone EP1C6 Serial Interface Engine (SIE) OUT DATA IN DATA Program& Data RAM CPU (Enhanced 8051) GPIF USB Cypress68013 USB interface slave FIFO CTL RDY RDY CTL 图2硬件原理图 3 软件设计 整个传输系统的硬件设计相对简单 复杂性体现在软件 开发上 首先 USB 芯片要完成与 PC 主机的通信 因而 USB 芯片必须开发有内部的固件程序 来提供必要的设备描 述符信息 响应主机的通信请求 并完成与 FPGA 的数据传 输而FPGA 控制芯片的程序则完成与 USB 和被测收信机的 数据传输 而在主机端 则必须有能够支持 USB 协议并控制 传输的 USB 驱动程序 在驱动程序的上端 还要有实现与驱 动程序接口并进行各种信道模拟的应用软件 3.1 设备端程序的开发 根据 USB2.0 协议 USB 设备是支持即插即用的 在每 个USB 设备中都有一个描述符表 记录了设备的要求和性 能当USB 设备第一次插到主机的总线上时 总线自动赋给 设备缺省地址 0 并向该地址发送 Get_Descriptor/Device 的请 求 然后设备通过向主机发送 ID 数据 告诉主机它是 谁 以响应该请求 接着 主机向设备发出 Set_Address 的请求 为设备提供一个唯一的地址 以区别其它连接到总线上的设 备 主机继续发出多个 Get_Descriptor 的请求 以获取更多 的设备信息 据此 主机可以了解到该设备的其它信息 例 如该设备的端点数目 电源要求 所需总线带宽及下载何种 驱动程序 根据这些信息 主机可进一步进行驱动程序的自 动装载 之后就可以进行主机与 USB 设备的通信了 而Cy7c68013 芯片具有软特性 它在上电后可以通过 USB 接口 从主机中加载固件及其设备描述符信息 或者从外接的 EEPROM 导入固件程序 完成第一次枚举 之后 8051 开始 执行设备固件代码 68013 芯片再次枚举 这次是作为下载 后设置好的设备出现在 USB 总线上 通过这种二次枚举的方 式 缩短了产品的导入时间 使得通过软件升级固件成为轻 而易举的事 固件程序中首先要设置好 USB 设备的描述符信息 这包 括缺省设备描述符表 缺省设置描述符表和端点描述符表 涉及到了厂家信息 设置的接口数和端口数 包的大小 端 口类型和传输方向 电源使用情况等一系列设备基本信息 在描述符表信息写后好 就需要编写固件程序代码来和 主机和被测收信机的通信了 68013 的固件程序利用 Keil C 来编写 Cypress 公司提供了一个固件架构来简化固件的开发 见图 3 该架构实现了与 USB 兼容的外围设备所需的基 本功能 其中 TD_Init()函数是在 USB 重新枚举和开始任务 分配前调用的 其目的是初始化全局变量 而函数 TD_Poll() 在设备运行时被重复地调用 它包括完成用户任务的函数 由用户按照自己的实际需求进行编写 TD_Suspend()函数是 在设备进入挂起状态前调用的 可使设备处于低功耗状态和 返回真的程序代码 当外部要求重新启动时 设备会调用 TD_Resume()函数来对处理器进行重启 本设计的固件由表 1 所示的文件组成 图3固件程序架构 否否是是是否电源打开后重 启 是否收到 SETUP 封包 是否收到 SETUP 封包 USB 总线是 否设置闲置 标志 初始设置状态变量 调用 TD_Init() 初始设置状态变量 延迟 1s 并重新 设备列举 调用 TD_Poll() 分析并实现 设备请求 中止 微处 理器 调用 TD_Resume? 是 调用 TD_ Suspend? 225 表1固件文件组成 文件名 用途 fw.c 固件程序框架原代码 ezusb.lib EZ_USB 的库代码 dscr.a51 USB 设备描述表 USBJmpTb.OBJ USB 中断函数跳转表 FX2_to_extsyncFIFO 完成用户任务 实现数据传输 gpif.c GPIF 波形定义 在68013 与FPGA 端口通信模式的选择中 选择 GPIF 方式 即利用 GPIF 来控制 USB 与存储区的数据传输 因此 需要利用 GPIF Designer 来设计波形 完成与 FPGA 进行数据 传输的握手信号和时序的设计 这段代码存在 gpif.c 中而在FX2_to_extsyncFIFO 中 实现具体的数据传输任务 3.2 主机端的软件开发 Windows2000 操作系统对 USB 设备的支持是基于 WDM Windows Driver Mode 的 所以 USB 驱动程序是 WDM 驱动程序 Windows 对构成一个 USB 总线主机的不同软件部 分进行了十分清楚的划分 如图 4 所示 图4USB 驱动程序层次图 其中 USB 总线客户软件仅仅包含了用来控制不同 USB 总线外设的设备驱动程序 USB 总线客户软件会通过一个 Windows 所定义的软件接口与根集线器驱动程序进行通信 而USB 总线根集线器驱动程序则要通过包含在 USBD 中的通 用串行总线驱动程序接口 USBDI 实现与通用串行总线驱 动程序 USBD 的通信 然后 USBD 会同下方的主控制器 驱动程序进行通信 而主控制器驱动程序会通过 PCI 枚举器 软件直接实现对 USB 物理总线的访问 像其他设备驱动程序 一样 USB 总线驱动程序软件堆栈的层间通信也使用一个称 为IRP I/O 请求包 的机制 而实际的 USB 总线请求却存 放在一个被称为通用串行总线请求 URP 的结构内 在URP 内包含了不同的域 在不同的软件分层结构中 每一个分层 会使用不同的域进行处理操作 USB 客户驱动程序靠创建 URB(USB 请求块)并把 URB 提交到总线驱动程序就可完成硬 件操作 Cypress 公司分别提供了在 Win2000 和Win98 下的 通用的驱动程序 一般情况下用户都可直接用这个通用驱动 程序 最上层的应用程序用 VC6.0 开发 主要是完成与驱动程 序的通信并接收用户应用软件的各种操作请求 为了配合用 户软件灵活收发数据的需要 本应用程序以一个动态链接库 的方式链接入用户软件 在与内核态的驱动程序进行通信时 首先要打开设备 然后与 USB 驱动程序进行数据收发 为了 实现数据的实时传输 使得对用户来说收发成为两个互相同 立的通道 需要在动态连接库中将收 发数据设为两个互斥 线程 并且在连续执行一个线程一定时间后 就自动检测应 用程序是否有请求执行另外的线程 若有 则系统转而执行 新请求的线程 打开设备的函数为 CreateFile(ezusb-0", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 与驱动程序进行通信的函数为 DeviceIoControl(handle, IOCTL_EZUSB_BULK_WRITE, &bulkControl, sizeof(BULK_TRANSFER_CONTROL), &outBuffer, outPacketSize, &nBytes, NULL); //本设计中考虑到实际使用要求 采用 bulk 传//输方式 4 结束语 按照以上介绍的设计方法 实时双向数据流传输已经完 成 该传输通道可以应用在很多地方 如PC 机作为激励源 外接响应设备的系统 或者作为一个逻辑测试系统对设备进 行测试 也可作为硬件仿真的一个高速传输通道 在实验室 中 为了实现数字通信系统的硬件仿真 将收 发信机从硬 件上分开 指令从发送机发出 通过由本设计提供的高速传 输通道并经信道模拟 传给收信机并经其一系列的数据处理 再次通过通道将结果返回给发信机 同时在本设计的应用程 序中加上模拟信道条件的大尺度衰落 阴影衰落 多径衰落 Doppler 频移和白噪声等模块 高速准确地完成了仿真任务 大大提高了仿真速度 参考文献 1 Universal Serial Bus Specification 2.0. http://www.cypress.com, 2000 2 EZ-USB FX2 Technical Reference Manual. http://www.cypress.com, 2001 3 EZ-USB? FX2? GPIF Primer. http://www.cypress.com, 2003 4 Cyclone Device Handbook Volume. http://www.altera.com, 2003 5 张弘. USB 接口设计. 西安 西安电子科技大学出版社 2002 6 许永和. EZ-USB FX 系列单片机USB 外围设备设计与应用. 北京 北京航空航天大学出版社 2002 根集线器驱动程序 USB 驱动程序 USBD 主控制器驱动程序 PCI 枚举器 USB 总线 客户软件 客户软件