单片机和USB接口技术 联系客服

发布时间 : 星期日 文章单片机和USB接口技术更新完毕开始阅读

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数据都存入\”缓冲区中,然后将“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的最后处理状态寄存器进一步确定数据是否是一个建立包,第一个包必须是建立包。

17

中断服务 中断服务 读取D12中断寄存器 yes 设置总线复位标志 总线复位 挂起改变? yes 设置挂起改变标志 No DMA传输结束? yes DMA传输结束处理 No 控制输入? yes 控制端点发送数据处No 控制输出? yes 控制端点接收数据处No 端点1输入? yes 端点1发送数据处理 No 端点1输出? yes 端点1接收数据处理 No 端点2输入? yes 端点2发送数据处理 No 端点2输出? yes 端点2接收数据处理 No yes 中断服务结束 图9 中断服务程序流程

18

输入 发送 无数据控制返回状态 空闲 接收 输出

图10 控制端的安处理程序转换

从下面的流程图10中可以看出,MCU需要通过选择控制输出端点提取建立包的内容来决定端点是为满还是空。如果控制端点为满,MCU将从缓冲区读出内容并将其存入存储区。之后,它将从存储区使主设备请求生效。如果是一个有效的请求,MCU必须向控制输出端点发送应答建立命令以重新使能下一个建立阶段接下来MCU需要证实控制传输是控制读还是写,这可以通过读建立包中bmRequestType的第8位来实现。如果控制传输是一个控制读类型,那就是说器件需要在下一个数据阶段向主机发回数据包。MCU需要设置一个标志以指示USB设备现在正处于传输模式,即准备在主机发送请求时发送数据。

建立阶段结束之后,主机会执行数据阶段。D12等待接收Control_ In包,过程如下面的流程图12“控制输入处理程序”所示。MCU首先需要通过读D12的最后处理状态寄存器清零Control_ In中断标志位,接着MCU再确认D12处于传输模式后进行数据包的发送。

19

由于D12的控制端点只有16字节FIFO,如果传输的长度大于16字节,MCU在传输阶段就必须控制数据的数量。如流程图11所示,MCU必须检查要发送到主机的当前和剩余的数据大小。如果剩下的字节数大于16, MCU将先发送16字节并用减去参考长度(要求的长度)16。

当下一个Corntol_ In标志来到时,MCU将确定剩余的字节是否为零。如果己经没有数据要发送,MCU需要发送一个空的包以指示主机数据已经发送完毕。如果建立包为Set-Descriptor( )请求,那么建立包中的控制传输将指示此包为控制写类型。在执行完Set_ Descriptor请求过程后,MCU等待数据阶段。主机发送一个Control_ Out标志,MCU从D12缓冲区中减去数据。流程现在处于Control_ Out处理程序的右端。MCU首先确认D12是否处于USB_ Receive模式。然后MCU通过检查选择控制输出端点确认缓冲区是否己满并将数据从缓冲区读出。

控制输入入口 读端点处理状态 清中断标NO 发送状态 Yes 剩下数据〉16字节NO 剩下0 字节 NO Yes 发送一个空包 设置为等待状态 Yes 发送16个字节数据 发送剩下数据 设置为等待状子程序结束

图11 控制输入处理流程

4.1.5 普通端点处理程序

端点1和端点2这里定义为普通输入输出。

普通输出端点配置为从主机接收数据包。当MCU从主机接收Generic_ Out标志(通过读中断寄存器识别)时,D12中断位必须清零。选择端点将清零Generic_ Out缓冲区,接下来MCU需要确认

20