电脑装配网

如何完整开发一个USB设备?专家手把手带你入门

 人阅读 | 作者pangding | 时间:2023-09-28 14:54

第2章 我们需要做什么

前面已经初步介绍了USB的基础知识,是时候开始着手USB设备开发了。我们先来看看完整开发一个USB设备需要做些什么,这有助于从宏观上建立USB设备开发的概念,如图2.1所示。

图2.1 完整的USB设备开发流程

USB设备开发的首要步骤便是对系统需求进行分析,它的目的就是解决这样一个问题:你打算采用什么方案来开发USB设备呢?不同方案的实现,其复杂程度与开发周期会完全不一样,这需要结合自己的项目来决定,包括设备类型、功能、数据传输类型与速率、硬件资源、成本、功耗等。

既然是进行USB设备的开发,必然最终会有一个能够拿在手里(实实在在)的东西,这就属于硬件范畴。例如,USB鼠标内部通常会有印制电路板模块(Printed Circuit Board Assembly, PCBA),上面安装了一些“采集滚轮位置与轻触按键状态信息并发送到主机”的电路,也就是我们讨论的硬件,而系统需求分析的最后落点就在于USB接口芯片的选型。

现如今市面上的USB接口芯片总体上可以分为单纯的USB接口芯片与带USB接口的单片机两大类,它们在硬件层面的区别如图2.2所示。

图2.2 两种USB接口芯片在硬件层面的区别

单纯的USB接口芯片只负责与USB主机进行通信,通常仅包含直接与外部电信号打交道的物理层(Physical Layer, PHY),以及处理底层USB协议的单元,所以还需要另一个处理器实现其他更高层面的协议处理与数据交换,如菲利浦公司(Philips)生产的PDIUSBD12芯片(现已停产)。这类芯片提供了一些接口供处理器进行控制,不同厂商的USB接口芯片在USB协议上会有着不同程度的支持。所谓的“支持”,是指USB协议由软件还是硬件来实现,因为USB协议在逻辑上分为很多层,具体的实现方法可以是硬件或软件。接口芯片的硬件实现层面越多,成本越高,但速度会更快,软件编程方面也会更简单。带USB接口的单片机则将USB接口芯片集成到了单片机中,将其作为一个USB控制器挂在内部总线,这样我们就可以像访问单片机中其他诸如SPI(Serial Peripheral Interface)、I2C(Inter-Integrated Circuit)等总线控制器一样,只需要访问为其分配的一些寄存器或缓冲区即可,是不是很简单!相应的典型芯片是由赛普拉斯公司(Cypress)生产的基于51内核的CY7C68013。简单地说,带USB接口的单片机属于单芯片解决方案。

那么实际进行USB设备应用开发时选择哪种好一些呢?主要考虑因素还是成本。单纯的USB接口芯片成本低,接口使用也方便,即使现有产品需要重新设计时也不需要做很大的改变,非常有利于整合与重用现有资源。例如,你们公司所有产品如果都在使用某几款基于51内核的单片机,那么在进行新的USB设备开发时,肯定也希望能够重用它们,这样有利于共享其他资源,而且开发工程师对相应单片机已经非常熟悉,也就能够缩短开发周期,提前一步将产品推出去,这些都有利于降低成本。带USB控制器的单片机的优势当然是更简单,但它不一定与你们公司现有的单片机内核相同,开发者可能需要重新学习。更重要的是,如果某一天需要切换到另一款带USB控制器的单片机更是困难,源码移植可得费不少工夫。如果采用单纯的USB接口芯片,则没有这个问题,USB接口芯片即使进行了更换,单片机源代码只需要修改与USB接口芯片通信的那部分即可。

本书为了阐述的方便,决定采用带USB控制器的单片机,即基于ARM 32位Cortex-M3内核的STM32F103C8T6单片机,它集成了USB 2.0全速控制器。需要特别注意的是:本书虽然使用STM32F103C8T6作为阐述平台,但并没有对与USB控制器无关的其他模块进行深入探讨,因为本书旨在详尽阐述USB设备的开发思路及透彻理解USB 2.0规范,这对于所有平台都是通用的。换句话说,只要你需要学习USB设备开发,无论使用的单片机型号与本书是否相同(包括其他厂商带USB控制器的单片机,或单纯的USB接口芯片),本书所述内容对你都是适用的。

USB接口芯片选型完成后,就开始进入USB设备的硬件设计环节,包括原理图与PCB设计、PCB制造、元器件采购及焊接调试等步骤,如图2.3所示。值得一提的是,现如今网络电商已经非常发达了,不仅仅是元器件采购,即使是PCB制造也能够轻松找到PCB厂商,我们只需要到相应的官方网站自助上传PCB生产文件(通常是PCB光绘文件)下单,再等待比较短的周期就能够(通过快递方式)收到制作完成的高质量PCB,跟以前在学校使用机器手工制作单面PCB相比,实在是太方便了。

图2.3 USB设备的硬件设计

USB设备的硬件设计完成之后,就得着手USB设备的软件设计了,我们将最终下载(也常称为“烧写”或“编程”)到单片机内部只读存储器(Read-Only Memory, ROM)的程序称为固件(Firmware),它是USB设备的核心,通常总是会完成至少一个功能。例如,对于USB鼠标设备,固件的作用是采集用户的操作信息并将其上传到主机。对于使用USB接口的逻辑分析仪,固件的作用是根据主机设置的数据采集参数,将采集到的参数回传给主机。为了区别于主机端的软件设计,我们称为USB设备的固件设计。

一般说来,硬件方案确定之后,相应USB设备的开发环境也就基本确定了。为什么这样说呢?因为芯片的制造厂商并不单纯地制造出芯片就完事了,为了让客户更容易地使用而达到快速占领市场的目的,总会有单独的部门进行演示板(Demonstration, DEMO)或评估板(Evaluation Board, EVB)的设计与开发,笔者曾经入职过的某集成电路设计公司的客户服务(Customer Service,CS)部门就是做这种事情的。简单地说,评估板存在的意义就是将厂商制造该芯片的市场战略意图表达出来,它通常包含相关的硬件原理图、PCB文件、物料清单(Bill of Material, BOM)、数据手册(Datasheet)、设计说明书及必要的软件例程等。通俗地说,评估板就是想告诉你:我这个芯片可以做什么?如果你要快速使用它,应该怎么做?

评估板在芯片推广过程中扮演了非常重要的角色,它不仅存在于很多简单的纯硬件类芯片中,对于稍显复杂(或需要单片机控制)的芯片更是如此,USB接口芯片的底层还是有些复杂的,所以相应的芯片厂商必然会准备好配套的评估板。

当我们开始设计USB设备固件时,一般都会直接参考厂商发布的固件例程。例如,将相关源代码复制到自己原来产品的工程目录下。当然,也有更直接的方式:直接在厂商发布例程的基础上更改!有些人可能会想:这也太没有技术含量了吧?我要重新编写固件来体现自己非凡的技术水平!行,你想这么做我当然不会阻止,但你的老板肯定不会答应,既然有现成且经过验证的成熟案例参考,为什么还要自己重新编写呢?在这方面,我还是跟你的老板站在同一战线的,因为芯片厂商肯定对自己的产品理解更深刻,发布的例程相对而言会更稳定。在极端情况下,芯片本身可能存在一些设计缺陷,需要在固件层面进行弥补,这种情况我们通常是无法知道的。有些芯片厂商会针对内部与外部(客户)开放两套数据手册(披露的细节不一样),所以我劝你还是别打“重新设计固件”的主意了!

对于有些USB设备,设计完硬件电路与设备固件后,整个USB设备开发流程可以算是完成了。有些人会想:好像不对吧!不是听说还要开发主机端的设备驱动程序与应用程序吗?这里可以回复:它们并不是必需的步骤!当你购买USB鼠标或键盘时,恐怕很少听说还要安装驱动或应用程序吧!换句话说,是否需要设计USB主机端的设备驱动程序与应用程序,取决于你开发的USB设备的具体功能。Windows操作系统为了方便用户使用USB总线与主机进行通信,已经提供了很多USB标准设备类驱动程序,如果你开发的USB设备符合某一种标准设备类,那么设备驱动程序的开发并不是必需的。例如,USB鼠标与键盘就不需要开发驱动程序与应用程序,因为它们是按照一定的规范(格式)向主机传递数据的,操作系统有能力进行适当的解析。

当然,是否需要开发设备驱动程序,还取决于选择的开发方式,即使两个USB设备的功能完全一样,你可以选择按某类标准设备进行开发,也可以自行开发设备驱动程序。选择前者就意味着不需要单独开发设备驱动程序(甚至应用程序),带来的好处就是开发流程简洁且周期短,大多数简单的USB设备都可以这么做,而缺点在于无法最大限度地挖掘USB设备的潜力。换句话说,USB主机只能以一定有限的能力与USB设备打交道。如果你对USB设备开发已经非常熟悉了,开发周期对你来说也完全不是事,而且对USB设备要求比较高,那么你也可以选择自行开发设备驱动程序。

设备驱动程序的具体开发形式也有几种,Windows 2000/XP/2003平台采用Windows驱动模型(Windows Driver Model, WDM),使用相应的驱动程序开发包(Driver Developer Kit, DDK)是开发方式之一,但是它对开发者要求比较高,可以理解为专门开发驱动的工程师采用的方式(简单地说,开发难度大)。为了简化驱动程序的开发,康博(Compuware)公司开发的DriverStudio软件平台对DDK进行了封装,使用起来更加方便,减少了开发时间,曾一度成为设备驱动程序的主流开发方式之一。后来,微软对WDM进行了优化,推出了全新的Windows驱动框架(Windows Driver Foundation, WDF),并提供相应的驱动开发包(Windows Driver Kit, WDK),它提供了面向对象和事件驱动的驱动程序开发框架,大大降低了开发难度,也直接导致了DriverStudio软件平台退出了历史舞台(不再支持最新的操作系统),掌握Windows设备驱动程序的开发人员,由过去的“专业”人士变为“普通”大众。

随着时代的快速发展,设备驱动程序的开发也已经变得更加简单了,即使我们不编写任何一行核心驱动程序代码,也能够轻松访问操作系统上的任意一个USB设备,只需要安装USB通用设备驱动程序即可,WinUSB与LibUSB就是目前应用广泛的两种,前者由微软提供且仅适用于Windows操作系统,后者则适用于包含Windows在内的多种操作系统,也是本书重点讨论的对象。

如果实在有必要,可能还需要开发与USB设备配套的应用程序,你可以将其理解为“能够进行数据分析、展示、控制等功能”的窗口界面(当然,也可以没有窗口界面)。如果你的USB设备不需要这样的功能,那就不需要做什么。例如,USB鼠标就不需要开发对应的应用程序,我们直接将其插入主机的USB接口就可以使用。而很多诸如逻辑分析仪、示波器等USB设备还会配带相应的应用程序,设备采集完数据发送到主机之后,还需要配套的应用程序进行数据分析并以图形的方式展示出来方便观察,此时应用程序设计就是必需的步骤。换句话说,如果USB设备往主机传输的数据需要特定应用程序去解析,通常就需要进行应用程序的设计。

使用成熟的框架是Windows应用程序的主要开发手段,比较常用的有MFC(Microsoft Foundation Class,微软基础类库)、.NET与QT。其中,MFC与.NET是微软提供的框架(相应的开发工具为Microsoft Visual Studio),后者更是微软当前主推的框架,QT是一个跨平台的C++图形用户界面应用程序开发框架。本书决定选择MFC,因为其相关学习资料很丰富,非常有利于初学者快速定位开发过程中的问题所在。当然,你并不需要对MFC很熟悉,我们只会使用向导创建一个对话框应用程序,并在其中编写一些用来访问USB设备的简单源代码。你也可以根据自身的知识储备选择其他熟悉的框架,只要在Windows平台下进行USB主机应用程序的开发,不同开发框架的选择对理解相关内容并没有影响,关键在于掌握Windows平台下访问USB设备的基本原理。


文章标签:

本文链接:『转载请注明出处』