购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第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)、I 2 C(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设备的基本原理 v2O6Ik7blJVZRF5enPWPjD3M3jujVCJuatMv3VZ4UqZXde3vl+qw6S8kZTW2vw+p

点击中间区域
呼出菜单
上一章
目录
下一章
×