- ·上一篇毕业论文:基于单片机和USB接口技术的高速数据采集系统的设计6
- ·下一篇毕业论文:基于单片机和USB接口技术的高速数据采集系统的设计8
基于单片机和USB接口技术的高速数据采集系统的设计7
论文出自毕业设计指导网www.bysj120.cn,需要购买整套毕业论文或找不到您要的毕业设计请联系客服索取
{
struct_flags
{
unsigned char timer:1;
unsigned char bus-reset:1;
unsigned char suspend:1;
unsigned char setup_packet:1;
unsigned char remote_wakeup:1;
unsigned char in_isr:1;
unsigned char control_state:2;
unsigned char configuration:1;
unsigned char verbose:1;
unsigned char epl_rxdone:1;
unsigned char setup_dma:1;
unsigned char dma_state:2;
}bits;
unsigned short value
}EPPFLAGS;
//计算机毕业设计USB设备请求寄存器
typedef struct_ device_request
{
unsigned char bmRequesetType;
unsigned char bRequest;
unsigned short wValue;
unsigned short windex;
unsigned short wLength;
}DEVICE_ REQUEST;
//Setup包数据缓冲区
typedef struct_control_ xfer
{
DEVICE_ REQUSET DeviceRequest;
unsigned short wLength
unsigned short wCount;
unsigned char*pData;
unsigned char dataBuffer[MAX_ CONTROLDATA_ SIZE]:
}CONTROL_ XFER;
4.1.3 PDIUSBD12固件编程的实现
1 中断服务程序-ISR.C
这部分代码处理由PDIUSBD12产生的中断,它将数据从PD工USBD12的内部FIFO取回到CPU
存储器并建立正确的事件标志-通知主循环进行处理。在ISR的入口固件使用D12_ Read Interrupt Register( )来决定中断源,然后将进入相应的子程序进行处理。PDIUSBD12的固件完全由中断驱动ISR的流程图8如下所示:例如,在OUT数据阶段的建立包时,工SR将建立包和OUT数据都存入"CONTROL_ XFER”缓冲区中,然后将“setup_packer”标志就到主循环这将减少主循环不必要的服务时间,并且简化了主循环的编程。总线复位和挂起并不要求在ISR中进行特殊的处理。ISR只需在EPPFLAGS中设置“bus_ reset”或“suspends”标志位,然后退出即可。
ISR与前台主循环通过事件标志EPPFLAGS和数据缓冲区CONROL_ XFER进行通信。
主循环和ISR之间的任务分配是这样的:ISR从D12收集数据而主循环对数据进行处理。当工SR收集了足够的数据时,它只通知主循环己经准备好等待处理。
4.1.4 控制端点处理程序
控制传输总是在SETUP阶段开始,之后为可选的DATA阶。然后在STATUS阶段结束。如图10所示为控制端点不同状态的转变。固件使用这3种状态来正确地处理控制传输。
如图11所示为控制输出处理程序。为了说明它,举一个主机请求的例子叫做“Get Descriptor()”的标准设备请求。
当USB器件D12接收到建立包,将产生一个中断通知MCU,微控制器响应中断,通过读D12中断寄存器决定包是发到控制端点还是普通端点。如果包是送往控制端点,MCU要通过读D12的最后处理状态寄存器进一步确定数据是否是一个建立包,第一个包必须是建立包。
图9 中断服务程序流程
计算机毕业设计图10 控制端的安处理程序转换
从下面的流程图10中可以看出,MCU需要通过选择控制输出端点提取建立包的内容来决定端点是为满还是空。如果控制端点为满,MCU将从缓冲区读出内容并将其存入存储区。之后,它将从存储区使主设备请求生效。如果是一个有效的请求,MCU必须向控制输出端点发送应答建立命令以重新使能下一个建立阶段接下来MCU需要证实控制传输是控制读还是写,这可以通过读建立包中bmRequestType的第8位来实现。如果控制传输是一个控制读类型,那就是说器件需要在下一个数据阶段向主机发回数据包。MCU需要设置一个标志以指示USB设备现在正处于传输模式,即准备在主机发送请求时发送数据。
建立阶段结束之后,主机会执行数据阶段。D12等待接收Control_ In包,过程如下面的流程图12“控制输入处理程序”所示。MCU首先需要通过读D12的最后处理状态寄存器清零Control_ In中断标志位,接着MCU再确认D12处于传输模式后进行数据包的发送。
struct_flags
{
unsigned char timer:1;
unsigned char bus-reset:1;
unsigned char suspend:1;
unsigned char setup_packet:1;
unsigned char remote_wakeup:1;
unsigned char in_isr:1;
unsigned char control_state:2;
unsigned char configuration:1;
unsigned char verbose:1;
unsigned char epl_rxdone:1;
unsigned char setup_dma:1;
unsigned char dma_state:2;
}bits;
unsigned short value
}EPPFLAGS;
//计算机毕业设计USB设备请求寄存器
typedef struct_ device_request
{
unsigned char bmRequesetType;
unsigned char bRequest;
unsigned short wValue;
unsigned short windex;
unsigned short wLength;
}DEVICE_ REQUEST;
//Setup包数据缓冲区
typedef struct_control_ xfer
{
DEVICE_ REQUSET DeviceRequest;
unsigned short wLength
unsigned short wCount;
unsigned char*pData;
unsigned char dataBuffer[MAX_ CONTROLDATA_ SIZE]:
}CONTROL_ XFER;
4.1.3 PDIUSBD12固件编程的实现
1 中断服务程序-ISR.C
这部分代码处理由PDIUSBD12产生的中断,它将数据从PD工USBD12的内部FIFO取回到CPU
存储器并建立正确的事件标志-通知主循环进行处理。在ISR的入口固件使用D12_ Read Interrupt Register( )来决定中断源,然后将进入相应的子程序进行处理。PDIUSBD12的固件完全由中断驱动ISR的流程图8如下所示:例如,在OUT数据阶段的建立包时,工SR将建立包和OUT数据都存入"CONTROL_ XFER”缓冲区中,然后将“setup_packer”标志就到主循环这将减少主循环不必要的服务时间,并且简化了主循环的编程。总线复位和挂起并不要求在ISR中进行特殊的处理。ISR只需在EPPFLAGS中设置“bus_ reset”或“suspends”标志位,然后退出即可。
ISR与前台主循环通过事件标志EPPFLAGS和数据缓冲区CONROL_ XFER进行通信。
主循环和ISR之间的任务分配是这样的:ISR从D12收集数据而主循环对数据进行处理。当工SR收集了足够的数据时,它只通知主循环己经准备好等待处理。
4.1.4 控制端点处理程序
控制传输总是在SETUP阶段开始,之后为可选的DATA阶。然后在STATUS阶段结束。如图10所示为控制端点不同状态的转变。固件使用这3种状态来正确地处理控制传输。
如图11所示为控制输出处理程序。为了说明它,举一个主机请求的例子叫做“Get Descriptor()”的标准设备请求。
当USB器件D12接收到建立包,将产生一个中断通知MCU,微控制器响应中断,通过读D12中断寄存器决定包是发到控制端点还是普通端点。如果包是送往控制端点,MCU要通过读D12的最后处理状态寄存器进一步确定数据是否是一个建立包,第一个包必须是建立包。
图9 中断服务程序流程
计算机毕业设计图10 控制端的安处理程序转换
从下面的流程图10中可以看出,MCU需要通过选择控制输出端点提取建立包的内容来决定端点是为满还是空。如果控制端点为满,MCU将从缓冲区读出内容并将其存入存储区。之后,它将从存储区使主设备请求生效。如果是一个有效的请求,MCU必须向控制输出端点发送应答建立命令以重新使能下一个建立阶段接下来MCU需要证实控制传输是控制读还是写,这可以通过读建立包中bmRequestType的第8位来实现。如果控制传输是一个控制读类型,那就是说器件需要在下一个数据阶段向主机发回数据包。MCU需要设置一个标志以指示USB设备现在正处于传输模式,即准备在主机发送请求时发送数据。
建立阶段结束之后,主机会执行数据阶段。D12等待接收Control_ In包,过程如下面的流程图12“控制输入处理程序”所示。MCU首先需要通过读D12的最后处理状态寄存器清零Control_ In中断标志位,接着MCU再确认D12处于传输模式后进行数据包的发送。