USB(Universial Serial Bus)是一种通用总线系统,由于它具有支持热插拔、数据传输快速、性能可靠、价格较低等优点,已成为应用最广泛的PC机外设扩展接口之一,它是实现电子系统和PC机之间进行数据传输的理想接口。基于上述分析,提出了基于Blackfin532和Netc-hip2272的USB接口电路设计方案。
1 USB接口电路的硬件设计
1.1 Blackfin532DSP处理器简介
文中DSP处理器选用Blaclkfin532,它是ADI(Analog Device Instruments)公司推出的一款高性能、低功耗定点处理器,内核时钟频率最高可达400 MHz,具有两个40位的算术逻辑单元(ALU),及4个8位视频ALU,两个16位硬件乘法器,两个40位累加器,是具有较高性价比的DSP处理器。Blackfin532片上集成了84 kB的RAM,可寻址空间为4 GB,可与多种存储器实现无缝连接。此外,片上集成了多个外设接口,具体包括1个UART口,1个SPI口,2个串行口(Sports),4个通用定时器,1个实时时钟,1个看门狗定时器,1个并行外设接口等。
1.2 Netchip2272简介
文中USB接口芯片选用了Netchip2272。它在片上集成了USB收发模块,串行接口引擎(SIE),USB协议控制器,端点数据缓冲区,本地总线接口模块等。同时还集成了大量的寄存器,使得对它的操作变得简单。Netchip2272具有如下特点
(1)支持全速/高速数据传输模式。
(2)具有3个可配置的物理端点,及30个逻辑端点。
(3)片上集成了3 kB的数据缓冲区,支持双缓冲模式。
(4)可方便地与通用微处理器进行连接。
在Blackfin533的EZ-KIT开发板中也采用了Blackfin533和Netchip2272实现USB接口电路,但EZ-KIT开发板中使用了设备管理器等,使得程序变得较大,在Blackfin533和Netchip2272之外,需要大约8 MB的存储空间来存放部分程序和支持程序运行时对存储空间的要求,这就需要在外部添加一块SDRAM。同时,在EZ-KIT开发板的例程中只提供了USB接口电路的基于设备管理器的顶层源代码,对于Blackfin533如何控制Netehip2272实现设备的枚举和数据传输则没有提供底层的源代码,这些都使得开发板中提供的USB接口电路方案,在实际应用中不方便。文中所提出的USB接口电路方案中则没有使用设备管理器,这使得程序比例程中的程序要小得多,且不需要使用SDRAM,从而使得硬件电路变得
更加简单。由于没有使用设备管理器且在程序编写过程中采用了模块化的设计方法,固件程序的可移植性增强了。
1.3 USB接口电路的原理
USB接口电路的硬件连接原理图如图2所示,其中D0~D15是Blackfin532和Netchip2272的数据线,A1~A5是地址线,PF10和PF11是Black-tln532的PF(Programmable Flags)口的第10、ll管脚,分别用作Netehip2272的中断输入管脚和复位控制管脚,ASMl是Blacktin532的异步存储块1的片选信号用作Netehip2272的片选信号,IOW,IOR是Blackfin532的写、读选通输出信号用作Netchip2272的写选通和读选通信号。IRQ是Netehip2272的中断输出信号,RESET是它的复位输入信号,CS是它的片选信号,D+,D-是USB总线的差分数据线,VCC和GND分别是它的电源线和地线。
Blackfin532和Netchip2272的数据交换采用中断驱动方式,当2272发生了特定的某些事件如收到主机发送的Setup包,收到主机发送的数据包等,需要Blackfin 532对事件进行处理时,2272在其IRQ管脚产生1个低电平,与它相连接的PF10管脚在检测到此低电平之后。在DSP内部产生中断,DSP在中断处理函数内部读取2272相关寄存器的值,并根据这些寄存器的值对发生的事件作出相应的处理,完成USB设备的枚举和数据的传输。
2 USB接口电路的软件设计
接口电路的软件设计包括固件程序和PC端的驱动程序。固件程序的设计需要对硬件电路和USB的通信协议比较熟悉,因而开发起来难度比较大,这里对固件程序的开发作以介绍。
2.1 固件程序
设备的固件程序是指运行在设备端CPU中的程序,它主要用来完成对接收到的数据包的类型,内容进行识别和分析,并在分析的基础上对主机的请求做出相应的处理,完成设备的枚举,读取主机发送的数据和向主机发送数据,从而实现和主机之间的数据交换。固件程序的流程图如图3所示。
固件程序主要包括初始化和中断服务程序两部分;
2.1.1 初始化
初始化程序用以对Blackfin532和Netchip2272进行初始化设置。
(1)对Blaekfin532进行软复位,对PLL(Phase Locked Loop),EBIU(External Bus Interface Unit),PF口进行设置,以及使能PF10引起的中断。
(2)对Netchip2272进行软复位,对本地总线控制寄存器(LOCCTL,LOCCTL1),USB控制寄存器(USB_CTL0,USBCTL1),端点0的寄存器进行设置,在中断使能寄存器(IRQENDO,IRQENBl)中使能相应的中断。
2.1.2 中断服务程序
中断服务程序主要是用来处理主机的Setup标准请求,将主机发送过来的数据读到Blacldin532中和将Blackfin532中的数据发送给主机。
主机要和USB设备进行数据交换首先要正确的识别USB设备,这需要经过一个枚举过程,这个过程主要通过主机向设备发送Setup请求,设备对该请求进行响应来完成。
(1)USB设备加电,连接到主机的—个集线器端口。
(2)主机检测到新设备连接后,总线复位。
(3)主机使用默认地址(地址O)读取设备描述符。
(4)主机给设备分配一个地址,在以后的通信里设备就只对这个地址的信息作出应答。
(5)主机从新的地址获取设备描述符。
(6)主机读取配置描述符。
(7)主机读取配置描述符集合,主机除了读取配置描述符之外,还要读取接口描述符及端点描述符。
(8)主机设置设备的配置。
在中断服务程序中首先判断是何种类型的中断,如果是Setup请求中断,则调用函数setup_handler()进行处理,函数的参数为设备接收到的Setup数据包的第3~第8 bit(Setup~Setup)。在setup_handler()函数中根据Setup数据包的内容跳转至相应的分支,对Setup请求进行响应。使用软件Bushound5.0对设备的枚举过程进行观察,捕获的部分数据如图4所示。
Bushound5.0只捕获到了设备枚举过程中主机发出获取配置描述符请求及之后的数据,图中的数据是主机发出获取配置描述符请求到主机发出设置配置请求之间的数据。
USB设备和主机之间的数据交换。当Netchip2272接收到主机发送的数据包之后,就会产生一个中断信号给Blackfin532,Blackfin532在中断服务程序中查询相应的寄存器得知接收到数据包之后,直接将接收到的数据包读到Blackfin532中。USB设备需要向主机发送数据时,先将需要发送的数据放到输入端点的Buffer中,当主机向相应的输入端点发送In Token时,Buffe中的数据包就返回给了主机,数据包发送成功后Netehip2272会产生一个中断信号给Blackfin532,在中断处理函数中将全局变量Tx_data_flag的相应位置1,数据包发送成功。
2.2 驱动程序
驱动程序编写是复杂的,选用Jungo的WindowsDriver,在Windows Driver检测到枚举成功的设备之后,输入设备的厂商ID(VID)和产品ID(PID),即可生成一个inf文件,将设备的PID和VID与设备的驱动程序绑定在一起,当设备通过设备描述符将VID,PID传送给主机之后,主机就可以据此找到设备的驱动程序了。
3 实验结果及分析
设备枚举成功之后,利用BusView观察到的设备的配置情况如图5所示。
USB设备一共有6个端点,这里仅列出其中两个端点的描述符,其他的和这两个类似。BusView显示的设备配置情况和固件程序中对设备的配置情况完全一致,这表明设备的枚举过程是正确的。
通过使USB设备循环的向主机发送数据来检验USB输入到主机方向的数据传输,利用Bushound5.0捕获的部分数据如图6所示。图中的数据显示USB设备循环发送的数据是00 01 02 03 04 05 06 07 08 09,在Windows Driver中对相应的管道进行监听,收到的数据如图7所示。实验结果显示数据传输完全正确。对于主机输出到USB设备方向的数据传输,进行了检验,数据传输也完全正确。这表明基于Blackfin532和Netc-hip2272的USB接口电路的方案是可行的。
4 结束语
基于Blackfin532和Netchip2272的USB接口电路具有数据传输快速、可靠、接口电路简单、固件程序的可移植性强等优点,具有良好的实用价值和应用前景。