DSP的USB数据传输系统设计_第1页
DSP的USB数据传输系统设计_第2页
免费预览已结束,剩余11页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、封面 作者: PanHongliang 基于 DSP的 USB据传输系统设计 摘 要 :数字信号处理器 (DSP) 在高速运算上有着不可比拟的优势 数据量庞大 ,需要一种非常方便、快捷的接口实现与计算机的数据传输。在 统设计中 ,提出一种基于 DSP 和 USB 的高速数据传输方案 ,该方案采用 CYPRESS 的 仅供个人学习 ,但数字信号处理的 CT 图像重建系 CY7C68001 作为 USB 收发控制芯片,并使用 TI的高性能 DSP 芯片 TMS320C5416 作为微 处理器控制芯片,利用两者的速度优势,通过 C 语言编写通信程序,实现了 DSP 与 PC 机之间 的高速数据传输

2、,从而使得大量图像数据能够快速、实时的存储、处理。 关键词:CT 图像重建。DSP 。 USB。数据传输 0 引 言 由于 DSP 芯片的不断发展 , 以及它处理数据速度快、处理数据量大的优势 , 已经广泛应用到数字信号处理的许多领域。在 CT 图像重建系统中 ,DSP 处理的 数据需要上传到 PC 机进行存储、显示或进行数据分析等 , 这就产生了 PC 机和 DSP 的数据传输问题。USB 总线具有传输速度高,以及即插即用等特点,得到越 来越广泛的应用,利用 USB 总线实现 DSP 和 PC 机的通信,从而解决图像信号的 实时传输问题。Cypress 公司生产的 CY7C68001 通用

3、USB 2. 0 接口控制器是 基于 应用层编程的接口器件,使用简单,开发方便。在此,以 TMS320C5416 为例, 讨论如何使用 CY7C68001 对 TMS32OC541 进行 USB 接口设计,实现 DSP 和 PC 机通信,将 DSP 处理过的图像信号实时传到计算机中。 1 DSP 与 USB 接 口的硬件设计 TMS320C5416 是 TI 的高性能 32 位定点 DSP ,内核采用超长指令字(VL IW) 体系结构 , 有 8 个功能单元、 64 个 32 b 通用寄存器。一个时钟周期同时执行 8 条指令,主频可达 1 GHz , 处理性能高达 8 000 MIPS , 支

4、持 8/ 16/ 32/ 64 b 的数据类型。CY7C68001 用来连接微处理器或 DSP 的 DMA 从装置,内部不含微 处理器。支持高速 (480 Mb/ s) 或全速(12 Mb/ s) USB 数据传输。提供 USB 2. 0 协议要求的全部 4 种传输方式 ( 控制传输、中断传输、批量传输和同步传 输) , 可以满足用户对各种类型数据传输的需求。 1. 1 接口的硬件设计 在该设计方案中,CY7C68001 通过 EMIFB 与 TMS320C5416 进行异步通信, 各个引脚的连接如图 1 所示。DSP 控制 CY7C68001 完成 DSP 与 PC 之间的异步 通信。CY7

5、C68001 的相关引脚在接口中的作用:IN T :表明 CY7C68001 有数据 将要被读出,或者有中断事件发生。 READY:通知 TMS320C5416 可以对 CY7C68001 进行读写。FLA GA , FLA GB , FLA GC : 反应由 FAIFOADR2 :0 选择的 FIFO 的状态。FLA GD :为片选信号。SLOE 为 CY7C68001 驱动数据总 线。SL RD :并口读有效信号,在 SL RD 有效且同步通信时,FIFO 指针在每个 IFCL K 的上升沿递增。 PKTEND :总是高电平 , 将当前的缓冲区提交给 USB 。 FD 15 :0 : 数据

6、总线。 FIFO 2 : 0 : 提供与 TMS320C5416 接口的 FIFO 地址选择。 图 1 TMS320C5416 与 CY7C68001 接口 1. 2 接口的访问 CY7C68001 提供给 DSP 两种软件接口 : 命令接口 :用来访问 CY7C68001 寄存器、End2point0 缓冲器及描述 表。 FIFO 数据接口 :用来访问 4 个 1 KB 的 FIF0 中的数据。通过编程直接作 为FIFO 分配给 EP2 ,EP4 ,EP6 ,EP8。这两个外部接口均可以通过同步或异步 方式进行访问。在此均采用异步的方式进行访问 , 命令口的命令字如下 : 在表 1 中,A/

7、 D 用于地址/数据的选择,当其为 0 时,表示本操作为数据读或 写。当其为 1 时, 表示本操作为地址写。 R/ W 用于读/ 写操作的选择 , 当其为 0 时,进行写,当其为 1 时,进行读。A 5 :0 用于地址/数据的选择,当 Bit7 = 0 时,D 3 :0 为数据半字节。D 5 :4 为未用,命令字为 8 位,故命令字数据分 二次读出或写入。当 Bit7 = 1 时,D 5 :0 包含将要寻址的命令寄存器地址。 2 USB 软件设计 USB 的软件设计包括三方面 : 固件设计、驱动程序设计和主机端应用程序 设计。 2. 1 固件设计 所有基于微控制器及外围电路功能设备的正常工作都

8、离不开固件的参与 , 固 件的作用就是辅助硬件工作。 没有固件的参与和控制 , 硬件设备无法实现预期的 功能。 USB 设备也不例外 , 必须编写固件程序来辅助硬件完成 USB 的通信任务。 由于采用不带MCU 内核的 USB 接口芯片,USB 的应用层协议应该通过对 TMS320C5416的编程来实现,USB固件的加载必须靠DSP的控制CY7C68001 来完成。在 CCS 中用 C 语言完成固件程序的编写,程序流程图如图 2 所示。 根据程序流程图 , 固件设计思路如下 : (1) 初始化工作。包括设置一些特殊功能寄存器的初值 , 以实现所需的设备 属性或功能,例如:配置端口、使能端点、开

9、中断。该设计中,使 CY7C68001 工作 于异步 FIFO 模式,将 4 KB 的 FIFO 对应到两个端点(Endpoint), 即 Endpoint2 和 Endpoint6。 (2) 辅助硬件完成设备的重新列举过程。包括模拟设备的断开与重新连接 , 对接收到的设置包进行分析判断 , 从而对主机的设备请求做出适当的响应 , 完成 主机对设备的配置任务。 (3) 对中断的处理。CY7C68001 有 6 个中断源,可以分别通过中断使能对寄 存器的各位进行设置。一旦中断事件发生,CY7C68001 的 IN T 引脚就被置低,并 且置中断使能寄存器的相应位 (即中断使能寄存器同时充当中断标

10、志寄存器 , 中 断使能寄存器具有读写属性 ) 。当中断发生时 , 中断标志寄存器的状态字映射到 FD7 :0 。中断发生后,DSP 对 CY7C68001 简单的一次读操作即可获取中断信 息, 识别中断源并进行相应处理。相对于中断标志寄存器的读操作 , 其他 CY7C68001 寄存器的读操作通常要先发送一次请求,并且收到 READ 响应后,才可 以读取数据。 (4) 数据的接收与发送。在读数据时,应首先判断 CY7C68001 的 FIFO2 是否 为空, 如果不为空 , 才将数据读进来。在写数据时 , 还要判断要写的数据个数是否 为 512 B 的整倍数,如果不是,则使用 PKTEND

11、信号来标识数据包的结束。EP2 和 EP6 分别对应存放 US 需要上传与接收的数据。其中,EP2 为 OU T 型,负责从主机接收数据。EP6 为 IN 型,负责向主机发送数据。EP2 和 EP6 均采用批量 (BUL K) 传输方式 , 这种传输方式具有数据可靠 , 传输速率高等特点 , 特别适合大 批量数据传输。部分关键代码如下 : DSP 读端点 2 中的数据: if ( ( FifoStatus & SX2_EP2EF) ! = SX2_EP2EF)/ EP2Data = 3 (unsinged volatile 3 ) USB_FIFO2/ DSP 向 EP6 中写入数据:

12、 if ( ( FifoStatus & SX2_EP2EF) ! = SX2_EP2EF)/ unsigned int i 。 for (i = 0 。i length - 1 。i + + )/ 先写入 length - 1 个数据 3 USB_FIF06 = data i 。 if (length %512) 若最后一个包不是 512 B 的整数倍使用 PKTEND 信号 3 ( unsigned volatile int 3 ) USB_ FIF06 _ END = data num - 1 else 3 (unsigned volatile int 3 ) USB_ FIF0

13、6 = data num -1 。 2. 2 驱动程序 在 Windows 平台下,USB 驱动程序由三部分组成:USB 设备驱动程序、USB 总线驱动程序和 USB 主控制器驱动程序。它们必须遵循 Win32 驱动程序模 (WDM)。其中,Win dows 操作系统已经提供了处于驱动程序栈底的 USB 主控制器 驱动程序和 USB总线驱动程序(USBD. SYS)。USB 设备的驱动程序主要是通过 调用 USBD. SYS 来实现 PC 机与 USB 总线的数据交换。USB 驱动程序主要完成以 下功能 : (1) 发现、配置、关闭 USB 设备。通过一系列有关即插即用 ( Plug and

14、Play) 的派遣函数来完成。例如 Ezusb _ PnPAddDevice ( ) , Ezusb _ DispatchPnp ( ) 等函数。 (2) 驱动程序与应用函数的接口。像 Ezusb _Creat () ,Ezusb_Close () 等函数。应用程序调用 Ezusb_Create () 后, 返回惟一的 Windows 句柄后 , 才能 调用驱动程序的其他函数,完成驱动程序对 CY7C68001 的一系列操作和数据传 送。应用程序通过调用 API 函数 CreateFile () 来实现对 Ezusb_Create () 的 访问。 (3) 控制与数据传送接口。这是驱动程序的主

15、要部分。它是 Windows 的异 步 I/ O 操作。应用程序使用标准 Win32API 函数 Device IoCont rol () 来执 行这样的操作。在驱动一方,这个 DeviceIoCont rol () 调用被转化成一个带 IRP_MJ _DEVICE_CON TRC 功能码的 IRP。像读取与写入 FIFO 数据、endpointO 的操作均是通过异步 I/ 0 的方式来完成的。 2. 3 主机应用程序 USB 主机应用程序是计算机中完成特定功能的程序,其关键是实现从 USB 外 设读取或发送特定数量的数据、USB 标准设备请求和特定的命令等。另外,可以 对数据做进一步的处理

16、, 如: 存储、显示、快速傅里叶变换等。主机应用程序的 编写使用 VC 编译环境中的 API 函数实现。应用程序的编程方法与串口编程类 似。首先必须查找设备,调用 Win32 函数 CreateFilea () 打开设备的句柄。 然后调用 Win32 函数 DeviceloCont rol () 就可以进行数据读写和控制操作。 最后关闭设备句柄。在 VC+ + 6. 0 中用 C+ +编写简单的上位机测试程序,得到 测试结果如图 3 所示。 图 3 数据传输测试结果 3 USB 软件的实现算法 #include #include epphal.h #include d12ci.h #inclu

17、de mainloop.h #include usb100.h 确定 FIF02 是否为空 将端点 2 中的数读出 确定 FIF06 是否已满 #include chap_9.h #include protodma.h /* / USB protocol function pointer arrays /* code void (*StandardDeviceRequest)(void) = get_status, clear_feature, reserved, set_feature, reserved, set_address, get_descriptor, reserved, get

18、_configuration, set_configuration, get_interface, set_interface, reserved, reserved, reserved, reserved 。 code void (*VendorDeviceRequest)(void) = reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, read_write_register, reserved, re

19、served, reserved 。 /* / Public static data /* extern EPPFLAGS bEPPflags 。 extern unsigned long ClockTicks 。 extern unsigned char idata GenEpBuf 。 extern IO_REQUEST idata ioRequest 。 CONTROL_XFER ControlData 。 code char * _NAME_USB_REQUEST_DIRECTION = Host_to_device, Device_to_host 。 code char * _NAM

20、E_USB_REQUEST_RECIPIENT = Device, Interface, Endpoint(0), Other 。 code char * _NAME_USB_REQUEST_TYPE = Standard, Class, Vendor, Reserved 。 code char * _NAME_USB_STANDARD_REQUEST = GET_STATUS, CLEAR_FEATURE, RESERVED, SET_FEATURE, RESERVED, SET_ADDRESS, GET_DESCRIPTOR, SET_DESCRIPTOR, GET_CONFIGURATI

21、ON, SET_CONFIGURA TION, GET_INTERFACE, SET_INTERFACE, SYNC_FRAME 。 void help_devreq(unsigned char typ, unsigned char req) typ = 5 。 if(typ = USB_STANDARD_REQUEST) printf(Request Type = %s, Request _NAME_USB_REQUEST_TYPEtyp, _NAME_USB_STANDARD_REQUESTreq) 。 else if(bEPPflags.bits.verbose) printf(Requ

22、est Type = %s, bRequest _NAME_USB_REQUEST_TYPEtyp, req)。 extern unsigned long ClockIsr 。 unsigned char far *privateBuffer 。 unsigned long dmaBuffer 。 unsigned long ioBuffer 。 / V2.1 unsigned short ioSize, ioCount 。 / V2.1 void init_timer0(void) /* Interrupt Control Unit */ /* * Enabled interrupts in

23、 Interrupt Enable Register * * GLOBAL INTERRUPT MUST BE ENABLED FOR ANY OTHER * INTERRUPT TO WORK! */ /* GLOBAL INTERRUPT DISABLED ALL INTERRUPTS ARE DISABLED */ /* External interrupt 0 */ /* Priority Level = 0 */ /* Timer 0 interrupt */ /* Priority Level = 0 */ void init_special_interrupts(void) io

24、port unsigned int port3002 。 void init_port() port3002=0 xff 。 /*SerialPort */ /*Mode = 1 /8-bit UART SerialPort Interrupt = Disabled */ /*Receive = Enabled */ /*Auto Addressing = Disabled */ void init_serial(void) %s.n, 0 x%x.n, void on_exit(void) disconnect_USB() 。 void main(void) BOOL in_loop = T

25、RUE 。 init_port() 。 init_serial() 。 init_timer0() 。 init_special_interrupts() 。 printf(nPDIUSBD12 evaluation board firmware V2.2.n) 。 printf(Copyright (c) Philips Semiconductors, 1998.n) 。 printf(Re-connect PDIUSBD12 evaluation board to USB.n) 。 reconnect_USB() 。 /* Main program loop */ while( in_lo

26、op ) fn_usb_isr() 。 if (bEPPflags.bits.bus_reset) DISABLE 。 bEPPflags.bits.bus_reset = 0。 ENABLE 。 printf(Bus reset!n) 。 / if bus reset if (bEPPflags.bits.suspend) DISABLE 。 bEPPflags.bits.suspend= 0。 ENABLE 。 suspend_change()。 printf(Suspend change!n) 。 / if suspend change if (bEPPflags.bits.setup_

27、packet) DISABLE 。 bEPPflags.bits.setup_packet = 0 。 ENABLE 。 control_handler() 。 / if setup_packet if(bEPPflags.bits.setup_dma) DISABLE 。 bEPPflags.bits.setup_dma = 0 。 ENABLE 。 setup_dma()。 / if setup_dma / Main Loop on_exit() 。 void suspend_change(void) void stall_ep0(void) D12_SetEndpointStatus(0

28、, 1) 。 D12_SetEndpointStatus(1, 1) 。 void disconnect_USB(void) / Initialize D12 configuration D12_SetMode(D12_NOLAZYCLOCK|D12_CLOCKRUNNING , D12_SETTOONE | D12_CLOCK_12M) 。 void connect_USB(void) / reset event flags DISABLE 。 bEPPflags.value = 0 。 ENABLE 。 / V2.1 enable normal+sof interrupt D12_SetD

29、MA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE) 。 / Initialize D12 configuration D12_SetMode(D12_NOLAZYCLOCK|D12_CLOCKRUNNING|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M) 。 void reconnect_USB(void) unsigned long clk_cnt 。 disconnect_USB() 。 printf(Wait for 1 second .n) 。 for(clk_cnt=0 。 clk_cnt0 x100

30、。 clk_cnt+) 。 connect_USB() 。 void init_unconfig(void) / unsigned char i 。 D12_SetEndpointEnable(0) 。 /* Disable all endpoints but EPP0. */ void init_config(void) D12_SetEndpointEnable(1) 。 /* Enable generic/iso endpoints. */ void single_transmit(unsigned char * buf, unsigned char len) if( len len)

31、ControlData.wLength = len 。 ControlData.pData = pRomData 。 if( ControlData.wLength = EP0_PACKET_SIZE) D12_WriteEndpoint(1, ControlData.pData, EP0_PACKET_SIZE) 。 ControlData.wCount += EP0_PACKET_SIZE 。 DISABLE 。 bEPPflags.bits.control_state = USB_TRANSMIT 。 ENABLE 。 else D12_WriteEndpoint(1, pRomData

32、, ControlData.wLength) 。 ControlData.wCount += ControlData.wLength 。 DISABLE 。 bEPPflags.bits.control_state = USB_IDLE 。 ENABLE 。 void setup_dma() if(!(ioRequest.bCommand & 0 x80) bEPPflags.bits.dma_disable = 1 。 / V2.1, x86 only D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE) 。 setup_io()。

33、return。 bEPPflags.bits.dma_disable = 0 。 / V2.1 / dma_start(&ioRequest) 。 DISABLE 。 bEPPflags.bits.dma_state = DMA_RUNNING 。 ENABLE 。 single_transmit(0, 0) 。 if(ioRequest.bCommand & 0 x1) D12_SetDMA(D12_BURST_16 | D12_DMAENABLE | D12_DMA_INTOKEN) 。 else D12_SetDMA(D12_BURST_16 | D12_DMAENABL

34、E) 。 / setup_io() setup buffer address for I/O mode Main endpoints transfer, / it only works on PC evaluation kit. void setup_io() unsigned long offset 。 / unsigned char far *fp 。 / unsigned short seg, off 。 offset = (unsigned long)ioRequest.bAddressH)4 。 / off = (ioBuffer + ioCount)&0 xf 。 / fp

35、 = MK_FP(seg, off) 。 DISABLE 。 bEPPflags.bits.dma_state = DMA_RUNNING 。 ENABLE 。 single_transmit(0, 0) 。 if(ioRequest.bCommand & 0 x1) if(ioSize 64) / D12_WriteEndpoint(5, fp, 64) 。 ioCount += 64 。 else / D12_WriteEndpoint(5, fp, ioSize) 。 ioCount += ioSize 。 void con trol_ha ndler() un sig ned

36、char type, req。 type = Con trolData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK 。 req = Con trolData.DeviceRequest.bRequest & USB_REQUEST_MASK 。 help_devreq(type, req)。 / print out device request if (type = USB_STANDARD_REQUEST) (*StandardDeviceRequestreq)()。 else if (type = USB_VEND

37、OR_REQUEST) (*VendorDeviceRequestreq)()。 else stall_ep0()。 4 结语 在 CT 图像重建系统中,高性能的 DSP 芯片具有高速的数据处理能力,利用设 计的 USB 接口 ,能够快速方便地实现实时传输。经测试,该设计的 USB 接口传输 速度可达 35 Mb/ s 以上,具有较高的实用价值和良好的应用前景,而且对于使用 其他微处理器开发基于 CY7C68001 的 USB 2. 0 接口也有很好的借鉴作用。 参考文献 1 美Texas In st rume nt s In corporated. TMS320 C5416 系列 DSP 的

38、 CPU 与外设M.北京:清华大学出版社,2007. 2 袁海强,徐宏海,李娟.基于 CY7C68001 的数据采集系统 USB 接口设计J . 2008 ,37 :48250. 3 TEXAS INSTRUMENTS MARCH. TMS320C6000 EMIFto USB In terfaci ng Usi ng Cypress EZ2USB SX2 Z.2004. 4 陈刚,张帅.基于 DSP 和 USB 2. 0 高速数据传输系统的设计J .长沙通 信职业技术学院学报,2007 ,6:73276. 5 万佑红,冯炜.基于 DSP 的 USB 数据传输方法研究与实现J .计算机工程 与设计,2007 ,28 (12) :2 89622 897 ,2 901. 6 王成儒,李英伟.USB 2. 0 原理与工程开发M.北京:国防工业出版 社,2004. 7 戴小俊,丁铁夫,郑喜凤.基于 DSP 和 USB 的数据采集系统的设计J .电 子技术应用,2007 (1) :84286. 8 微红旳,张志俊,朱宗晓.DSP 高速数字语音系统的 USB 接口设计J .中 南民族大学学报,2007 ,26 (1) :40243. 9 北京合众达公司.SEED2DEC5416 用户指南(Rev. B

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论