嵌入式系统usb开发学习概述
如未特别说明, 现阶段学习的usb主要是指usb从机/设备.
简单阅读过一些介绍USB应用基础和协议栈的文档之后, 发现协议栈的内容主要是约定要怎样怎样, 数据包格式啊, 通信机制啊. 但是, 真正落实到MCU上的程序设计时, 首要要搞清楚的是, 哪些工作是由硬件完成的, 那些工作是由软件完成的. 需要软件完成的部分, 可以参考已有的很多优秀且开源的usb协议栈程序, 作为用户来讲, 这部分代码就不需要从头设计编写了, 直接复用就好. 而硬件部分在各个芯片上各有不同, 而当我们需要某个特定的芯片平台上使用usb功能时, 就需要使用具体的usb控制器想方设法满足上层协议栈软件对数据和事件响应的需求, 完成usb协议最终栈的移植.
这里以复杂度相当的文件系统fatfs和以太网协议栈lwip作为类比, 用户在移植时, 只要实现底层简单的读写操作, 并嵌入到协议栈的底层函数中, 中间关于协议栈的复杂机制对于大多数用户来讲都是黑盒子, 用户直接调用协议栈的应用层API就能使用. usb相对于这些协议栈来说, 在底层也比较简单, 但需要明确搞清楚对硬件的需求. 作为一个通信类的协议栈, usb协议栈的基本操作就是传数, 全部数据都是通过"端点"传输的, 而端点在硬件上就是一段内存的缓冲区, 可以向其中写数据(发数), 也可以从中读数据(收数). 另外, usb通信过程中还有一些事件告诉usb协议栈需要分情况处理, 这些事件在硬件上反应在usb的通信包, 有些集成度比较高的usb控制器模块简化了软件判断的工作, 能够使用硬件电路自动检测到这些特殊的通信包, 然后在寄存器上通过一个状态标志位告诉软件, 这样usb的软件部分只要安心处理有效数据的收发就好.
但usb相对于fatfs和lwip相对难学一点的主要原因在于:
-
usb从机开发使用典型的从机开发模型. 基本的usb应用是从机部分, 整个通信过程都是受主机控制, 用户需要编程的从机是需要配合主机进行通信, 主动权不在用户手里, 说白了, 不是平时调程序那样, 想走就走, 想停就停. 这里的应对思路是, 就是要用通信系统的从机开发模型考虑usb的开发过程.

本文阐述了嵌入式系统中USB开发的基本思路,强调了理解USB从机开发模型的重要性,介绍了USB协议栈的实现机制及如何在特定硬件平台上移植。文章还对比了USB与fatfs、lwip的开发难度,解析了USB枚举过程,并给出了学习USB开发的建议步骤。
最低0.47元/天 解锁文章
1139

被折叠的 条评论
为什么被折叠?



