代码改变世界

[转载] USB设备流程

2018-07-06 09:53  Lyp_02  阅读(400)  评论(0)    收藏  举报

Microsemi开发用来参考
来自 https://blog.csdn.net/suipingsp/article/details/30238891

USB设备内部都有USB的芯片和MCU(Micro CPU Unit)。 USB设备上电后,首先初始化(设备自身逻辑和USB芯片的初始化) 。连接PC后即可开始USB设备与主机的交互进程。

1,Firmware程序的基本框架

设备Firmware的工作往往采用前、后台的方,前后台通过中断标志位进行通信,中断标志位可设置成全局变量以简化设计。

前台程序:死循环。不断的检测标志位,判断是否有中断,有则进入到相应的时间处理函数中。如果有操作系统则会不止这么简单 。

后台程序:中断处理程序。读取中断标记,判断并处理中断事务(如传输错误、收到Setup包、收到令牌包、传输完成等),设置相应的标志位。

下面是一个基本的USB firmware的基本交互框架。

后台==== 前台=====

•中断处理函数(ISR) 循环{

• 读USB芯片的中断寄存器

• 清USB芯片中断 检测USB中断标志

• 判断中断类型 置中断标志位

• 中断事件处理

• 调用相应的请求处理函数

•======================= }

• ==================================

设备中数据的接收过程:USB芯片完成数据的解包和打包,存放在内部的缓存中,通过中断的方式告知MCU,MCU:完成数据包的分析和处理。

设备中数据的数据发送:MCU将数据写入USB芯片内部缓存,USB芯片接收到来自HOST的IN令牌包时,将缓存中的数据送到USB总线上。当发送完成后,通常USB芯片通过中断的方式告知MCU。

2,USB request处理过程

本节通过一次典型的Get Descriptor请求交互过程来描绘USB设备firmware和主机间的通信过程:

•设备收到SETUP令牌包---->引起USB芯片中断MCU,设置中断标志为SETUP

•设备收到SETUP数据包---->USB芯片接收数据包,并存放在断点缓存中,以ACK响应Host

•设备 Firmware中检测中断标志,进入到SETUP事件处理函数,读取并解析SETUP数据包,将设备描述符填入USB芯片缓存,等待发送完成

•设备收到IN令牌包--- >若此时MCU已经完成数据填充,则USB芯片将数据发回HOST,否则以NAK响应

•设备循环上一步骤,直至数据被发送完成

•HOST收到描述符,并以ACK响应USB设备--->USB芯片中断通知MCU此次传输完成,MCU设置USB芯片在收到下一个IN令牌包时回复ZLP。

•HOST发送IN令牌包--- >USB芯片自动回复ZLP数据包。

•HOST收到数据包,并回ACK-----> USB请求完成