USB数据通信接口模块的程序设计
本文主要介绍PDIUSBD12的固件编程问题。
USB通信固件设计的目标为使PDIUSBD12在USB上达到最大的传输速率。
1.总体规划
CPU忙于处理许多设备控制和数据处理等任务。通信固件设计成完全的中断驱动方式,当CPU处理前台任务 时,USB的传输可在后台进行,这就确保了最佳的传输速率和更好的软件结构,同时简化了编程和调试。
后台中断服务程序和前台主程序循环之间的数据交换通过事件标志和数据缓冲区来实现,例如,PDIUSBD12 的批量输出端点可使用循环的数据缓冲区,当DIUSBD12从USB收到一个数据包时,就对CPU产生一个中断请求 ,CPU立即响应中断。
在中断服务程序中固件将数据包从PDIUSBD12内部缓冲区移到循环数据缓冲区,并在随后清除DIUSBD12的内 部缓冲区,以使其能接收新的数据包,CPU可以继续它当前的前台任务直到完成。
然后返回到主循环,检查循环缓冲区内是否有新的数据,若有就对其进行处理,否则开始其他的前台任务 。中断服务程序与前台主循环通过事件标志EPPFLAGS和数据缓冲区CONROL XFER进行通信,EPPFLAGS的定义 如下:
USB通信固件采用层次结构,如图1所示
图1 USB通信模块层次图
2 分别介绍各层子模块的设计
(1)底层函数。
最底层为两个面向硬件电路的函数:outpodb(UCHAR addr, UCHAR dm)和inpofib(UCHAR addr) 用以 完成CPU和D12之间的数据传输,这是所li其他函数的基础,具体代码如下:
(2)命令接口.
在D12的数据手册中定义了一套压缩了所有访问PDIUSBD12功能的命令集,命令接口部分就是将各命令用函 数的形式加以实现,对应的函数主要有:
以USHORT ReadlnterruptRegister(void)函数为例,代码如下:
3 中断服务程序
这部分代码处理由PDIUSBDl2产生的中断,它将数据从PDIUSBDI2的内部FIFO取回到CPU存储器,并建立正 确的事件标志以通知主循环程序进行处理。在ISR函数的入口固件使用ReadlntemJptRegister()来决定中 断源,根据中断源进入相应的子程序进行处理。
中断服务处理函数代码如下
4.主端点操作
这部分代码较多,包括各个端口的发送/接收函数,端点1和主端点(端点2)的收发函数相对较简单。
(2)主端点接收函数。
5.程序说明
在端点0的发送函数中,MCU首先需要通过读DI2的最后处理状态寄存器,清0Control_In中断标志位,接着 MCU在确认DI2处于传输模式后进行数据所的发送。由于D12的控件端点只有16bit,如果传输的长度大于 16bit,MCU在传输阶段就必须控制数据的数量,其流程如图2所示。MCU必须检查要发送到主机的当前和剩余 的数据大小,如果剩下的字节数大于16,MCU将先发送16字节并减去参考长度(要求的长度)16。
当下一个Control_In标志来时,MCU将确定剩余的字节是否为0,如果已经没有数据要发送,MCU需要发送一 个空的包以指示主机数据已发送完毕。
图2 控制点发送函数流程
· 如果是一个有效的请求,MCU必须向控制输出端点发送应答建立命令,以重新使能下一个建立阶段。接 下来,MCU需要证实控制传输是控制读还是写,这可以通过读建立包中bmRequestType的第8位来实现。
· 如果控制传输是一个控制读类型,那就是说器件需要在下一个数据阶段向主机发回数据包。MCU需要设 置一个标志以指示USB设备现在正处于传输模式,即准备在主机发送请求时发送数据。建立阶段结束之后, 主机会执行数据阶段,D12等待接收Control In包。
· 如果建立包为SetesDescriptor()请求,那么建立包中的控制传输将指示此包为控制写类型。在执行 完Setpescnptor请求过程后,MCU等待数据阶段主机发送一个ControlOut标志,MCU从D12缓冲区中减去数据 。流程现在处于ControleOut处理程序的右端,MCU首先确认D12是否处于USB Receive模式,然后MCU通过检 查选择控制输出端点,确认缓冲区是否已满,并将数据从缓冲区读出。
设备标准请求STANDARDASK,C。此部分代码用于实现各种USB协议的标准请求。对应每一个请求,用不同 的函数实现。在主循环中,当建立包标志为真时,利用control_handler()函数进入不同的标准请求处理 函数。虽然此处函数较多,但每个函数结构较简单,在此不做详细说明。
主循环MAINLOOP.C。主循环检查事件标志并进入对应的子程序进行进一步的处理。在主循环中,MCU首先 对其所有端口、存储区、定时器和中断服务程序进行初始化,之后MCU将重新连接USB,包括将SofteCo nnect寄存器设置为ON。这些过程是很重要的,它确保了在MCU准各好服务D12之前,D12不会进行操作。初始 化后,进入循环,轮询各种状态。当轮询到了检测建立包时,它确认建立标志是
USB数据通信接口模 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)