首页资源分类嵌入式处理器PSoC > EZ-USB FX2单片机原理、编程及应用

EZ-USB FX2单片机原理、编程及应用

已有 445464个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:EZUSBFX2单片机原理编程及应用

    分    享:

    文档简介

    EZ-USB FX2单片机原理、编程及应用

    文档预览

    第章 基本概念和特性 支持主机与各种即插即用的外设之间进行数据传输。由主机预定的标准协议使各 种设备分享 带宽。当其他设备和主机运行时,总线允许添加、设置、使用以及拆除外设。 技术的提出是基于采用通用连接技术实现外设的简单快速连接,可达到方便用户,降低 成本,扩展电脑连接外设范围的目的,使电脑的功能扩展变得非常简便,并且能最大限度地降 低用户对计算机技术掌握程度的要求,使所有外设均成为所谓的“傻瓜”式设备。 技术具 有开放性,是非赢利性的规范,得到了广泛的工业支持。它在数字图像、电话语音合成、交互式 多媒体、消费电子产品等领域得到了广泛的应用。可以预见, 技术将成为今后 应用的 主流技术之一。本章主要叙述 的基本概念和基本特性,并对 技术的发展和应用进 行介绍。 的一般概念 是英文 的缩写,中文意思就是“通用串行总线”。它不但是一种 新的总线标准,而且也是应用在 领域的一种新型的接口技术。 以往的电脑系统连接外围设备的接口并无统一的标准,如键盘用 接口,连接打印机 要 用 针的并行接口,鼠标则要用串行或 接口。 则将这些不同的接口统一起来, 使用一个 针插头作为标准插头。通过这个标准插头,采用菊花链形式可把所有外设连接起 来,并且不会损失带宽。 设备具有连接单一化、软件自动“侦测”以及热插拔的功能。也 就是说,在电脑不关机的情况下,就可将设备连接到电脑上,或者将设备从电脑上拔下。这可 以说是做到了真正的即插即用。 近年来, 技术已成为计算机领域发展最快的技术之一,并为越来越多的个人电脑使 用者所接受 。现在 ,如果想买 了一台没有 接口的电脑都很困难了。 技术并不仅限 于 行业,现在每一个计算机硬件的生产商都在尝试在自己的平台上应用 技术。那么 什么是 呢? 最 初 , 是由 以及 这 家公司共同开发的一种新的外设连接技术。这一技术将最终解决对串行设备和 并行设备如何与计算机相连的争论,大大简化了计算机与外设的连接过程。 年,通用串 行总线由“通用串行总线应用论坛( ”进行了标准化。目前已有许多串行端口和串行 总线技术应用于主机与外设之间的通信,但它们都有其特定的目的和缺点。 而该组织的目标 就是发展一种兼容低速和高速的技术,从而可以为广大用户提供一种可共享、可扩充、使用方 便的串行总线。该总线应独立于主计算机系统,并在整个计算机系统结构中保持一致。为了 实现上述目标, 发布了一种称为通用串行总线的串行技术规范( ,简称为 读者可能对串口有所了解,通常所用的鼠标和调制/解调器都是连接在串口上的。但 并不完全是一个串口,它实际上是一种串行总线。这意味着电脑上的 接口可以连 接许多设备,这些设备可以相互连接在一起,而且不同类型的设备可通过一种称为 集线 器的硬件分离开来。这些与传统的串口上只能连接一个设备是有着本质区别的。 但是要想在同一条总线上连接不同的设备并不容易实现,因为这意味着会有许多设备来 共享总线上有限的带宽。对于我们所熟悉的 串口通信的标准来说,其带宽就非常有 限,不能用来与打印机相连。当然,也就更不可能利用它来从数码相机上下载图片了。一条 串口通信电缆只能连接一个物理设备,而 上却可以连接多达 个外设。所有 这些外设都有可能与主机进行通信。 不仅要处理好总线竞争问题,还要保证各设备的正 常数据通信要求。因此,相对于 而言, 总线的实现机制要复杂得多。 的发展和应用 随着个人电脑用户向各层次发展,个人电脑已经进入到了办公室、家庭,成为一个不可缺 少的辅助工具。随着个人电脑的普及,不了解个人电脑内部结构的用户日益增多。如何简化 外围设备和扩充作业,使之方便易行,这是众多个人电脑厂家面临的重大研究课题。在这个背 景下, 公司于 年提出了 即插即用方案,其思想是把 机的外围 设备和扩充电路板连接起来,系统可以自动分配中断和端口等资源,而无须用户干预。也就是 说,在软件方面增设外围设备和扩充电路板时较以前相对简化了许多。但是在硬件方面,扩充 各 种 扩 展 卡,例 如 网卡、 声卡等,用户就不得不拆开机箱才能把扩展卡插到主板上的 相应扩展槽内,这相当麻烦。 因 此,在 年召开的面向个人电脑硬件技术工作者会议上, 和 这 家厂商提出了设备插架( )概 念 ,并 于 年 月公布设备插架标准规格 版。经过一段时间对 版的大幅度修正,设备插架标准规格终于在 年第 季度正式确 定下来。 在设备标准插架规格里,可以利用串行接口 另外一种串行总线)和 连 接外围设备。设备插架的连接器分别备有 和 的连接端。究竟利用哪种串 行接口,可由外围设备的使用情况而定。对于数据传输速率为 以下的低速外围设 备 ,应 使 用 适用于数据传输速率为 以上的高速外围设备。 是一个新接口。新接口的出现往往一波三折,因为人们已经习惯于原有的接口,对 于新接口往往不会立即全盘接受。如果新接口是建立在原有接口的基础上,则不仅可缩短开 发时间,降低开发成本,而且用户也比较能够接受。 最早的设计,就是使用已经存在了 年的并行端口( )和 串 行 端 口( 。这不仅加速了原始 设计的流程,并且允许已经在市场上出现的打印 机与调制/解调器可以立即连接到 上 。 不过,随着计算机与外围设备的发展,并行端口与 串行端口反而成为通信的瓶 颈,并且越来越严重。 突破原有接口的限制,不仅具备较高的通信速率,而且其弹性化设 计可以取代各种外围设备所使用的接口。 在过去,一个新接口的开发通常都是某个公司独自的努力。例如, 公司开发了 接 口 总 线 ),也 称 作 通用 接口总线),用于连接到实验室仪器。现在打印机所使用的并行接口,则是由 数据 计 算 机 公 司( )开 发 的 ,因 此 仍 然 称 作 接口。 由某一个公司单独开发的接口,常会禁止其他公司使用,或者要求付费。即使此接口可以 免费使用,基于与原开发公司是竞争对手,或者对该公司可能修改接口而不做另行通知的考 虑,使得许多公司不愿使用由单一公司开发的接口。 现在开发的接口,通常由一些有共同利益的公司或组织联合开发。例如 电气和电子工程师学会)组织和 电信工业协会)组织就制定了许多标准规范。许多旧的 制造业标准,都已被这些组织所制定的新标准所取代。例如, 接口被 标 准 取 代 ,而 则是 的基础。 这些组织除了更改旧的规范外,也制定新的规范。 就是由 家公司共同制定的标准规 范。这 家公司是 和 于 年 月发表,新增了高速模式。 是版本更新的一大跃进,它加 入了许多高速传输的特性支持。原来的预测是希望增进 倍的传输速率,实际上增进了 倍 的 传 输 速 率( 。对打印机、扫描仪、硬盘以及影像设备等,无疑是一大福音。同 时, 与 兼容,它们使用相同的连接器和电缆。不过,如果要使用最新的高速 传输,则必须使用与 兼容的主机与集线器。如果将较慢的外围设备连接至与 兼容的集线器上,集线器会自动转换外围设备的速率和 的速率。可在网站免费 下载 规范,同时也可找到最新的 信息。其网址是 在 方式下,所有外设都在机箱外连接,不必再打开机箱,允许外设热插拔,而不必关 闭主机电源。 采 用“ 级 联 ”方 式,即 每 个 设备用一个 插头连接到一个外设的 插座上,而其本身又提供一个 插座供下一个 外设连接使用。通过这种类似菊 花瓣 式的连 接(星 型结 构),一个 控制器可连接多达 个外设,而每个 外设间距离(线缆 长 度 )为 能智能识别 链上外围设备的插入或拔出, 为 的外设扩充提 供了一个很好的解决方案。 主机和 设备之间的连接拓扑结构是星型连接。 连接器分 系列和 系 列 ,一 般 设备利用 系列连接器与主机连接,而键盘、鼠标和扩充集线器等 设备则利用 系列连接器与主机实现连接。主机与要求全速传输的 设备连 接时,可利用 级联方 式延长连接距离,但最多允许 个 级联,最长扩展连接距离不得超过 对一般外设而言, 有足够的带宽和连接距离来支持它。 允许 种数据传输速 率,低速传输为 ,全 速 传输 为 ,而高速传输为 。其连接采用 芯电 缆(电源线 条和信号线 条 )。 能 支 持 高 速 接 口,如 和 ,使用户拥有足够 的带宽供新的数字外设使用。 技术正在不断地发展和完善,因而支持 技术的外设也在不断地涌现,如 键 盘 、 鼠 标、 调制/解调器等。可以预见,以后的主板上将没有 等规格不 一的外设接口,取而代之的是数个 接口,所有外设都通过这一接口连接。 不管是计算机还是连接的外围设备,在新产品开发时保持兼容性是必须考虑的。即使是 革命性的新外围设备,也必须使用到所连接计算机提供的接口。当设计一个外围设备的接口 时,该外围设备应具备以下特性。 稳定性:具备自动查错和除错的功能,使错误的发生率几乎为零。 便宜:让大部分用户都有能力购买。 省电:在便携式计算机上能降低电池的消耗。 有弹性:让许多不同种类的外围设备都可以使用这个接口。 快速:此接口不可以成为传输的瓶颈。 容易使用:用户容易安装、设置与使用。 操作系统的支持:如果操作系统支持此接口,则开发者就不必自行开发底层的驱动 程序。 就是一个符合上述条件且便于开发最新外围设备的接口。 不仅设计简单,而且 使用起来非常有效。许多不同种类的外围设备,例如鼠标、键盘、扫描仪、移动硬盘、打印机等, 都可以使用 接口。 由于要求设计的 外围设备使用时比较灵活,使得 接口开发比起以前的接口开 发更复杂,所以对设计 外围设备的人来说,开发 接口是一项挑战。 当 最早出现在 上 时 , 操作系统尚未包含所有外围设备的驱动程序。不 过,这些问题现在都已经解决。因为越来越多的控制芯片、开发工具以及操作系统支持 接 口 ,所 以 已成为在外围设备上广泛采用的标准接口。 的特点 若将外围设备连接到计算机上, 接口是优先的选择,不管是使用外围设备的用户,还 是开发 软硬件的设计者, 都有让双方满意的特性。 使用方便 使用 接口可连接多个不同的设备,支持热插拔;在软件方面,为 设计的驱动程 序和应用软件可自动启动,无须用户干预。 设备也不涉及 冲突等问题,它单独使用 自己的保留中断,不会与其他设备争用 机有限的资源,为用户省去了硬件配置的烦恼。 设备能真正做到“即插即用”。 传输速率高 在传输速率方面, 支 持 种信道速率:低速( )的 、全速( )的 以 及 高 速( )的 。具备 功能的 都支持低速与全 速,而高速则需要支持 的主机板或扩充卡。通常 传输速率指的是信号或信道 支持的位速率,每一个 设备的实际数据传输速率会比理想值低。除了数据之外,信道还 需要传输状态、控制与错误检查的信号。由于多个 设 备可 能分 享同 一个 信道 ,所 以在 实 际应用中,对于单一传输最大速率,在高速模式下为 ,在全速模式下为 ,在 低速模式下则为 连接灵活 接口支持多个不同设备的串列连接,一个 接口理论上可连接 个 设 备。连接的方式也十分灵活,既可以使用串行连接,也可以使用集线器( 把多个设备连 接 在 一 起 ,再 与 机 的 接口相连。在 方式下,所有外设都在机箱外连接,不必打 开机箱;并且允许外设热插拔,而不必关闭主机电源。 采用“级联”方式,即每个 设 备用一个 插头连接到一个外设的 插座上,而其本身又提供一个 插座供下一个 外设连接用。通过这种类似菊花链式的连接,一个 控制器可连接多达 个外设, 而每个外设间距离(线缆长度)可达 还能智能识别 链上外围设备的接入或 拆卸。 独立供电 普通使用串口、并口的设备都需要单独的供电系统,而 设备则不需要,这是因为 接口提供了内置电源。由于 电源能向低压设备提供 的电源,因此新的设备就 不需要专门的交流电源,从而降低了这些设备的成本并提高了性价比。 支持多媒体 提供了对电话的两路数据支持,并可支持异步以及同步数据传输,使电话可与 集 成,共享语音邮件及其他特性。 还具有高保真音频。由于 音频信息生成于计算机 外,因而减少了电子噪音干扰声音质量的机会,从而使音频系统具有更高的保真度。 另外, 还具有稳定的传输,可工作在低功耗模式以及高性价比等优点。 但 同时还存在着一些不足,主要表现在:缺乏对旧的设备和操作系统的支持,传输 速率与电缆长度的限制及不支持点对点( )的连接等方面。 设备不支持点对点的连接,外围设备之间不能直接彼此沟通,必须通过主计算机才 行。而 设备支持点对点的连接,允许外围设备直接通信。这样就大大地限制了 设 备 的应 用 领 域 。针 对 这 个问 题 , 的相关组织在 年定义了一个 规范来补充 规范,从而弥补了原来的不足。 系统的描述 一个 系统主要被定义为以下 部 分: 的 互 连; 的 设 备; 的主机。 的互连是指 设备与主机之间进行连接和通信的操作,主要包括以下几方面。 总线的拓扑结构: 设备与主机之间的各种连接方式。 层间 关系: 的任务被分配到系统的每一个层,每一层完成特定的任务。 数据流模式:描述了数据在系统中通过 从产生方到使用方的流动方式。 的调度: 提供了一个共享的连接。对可以使用的连接进行调度,以支持同 步数据传输,并且避免了优先级判别的开销。 设备与 主机通过 连 接 。 的物理连接是有层次性的星型结构,每个网 络集线器是在星型的中心,每一段都是从主机到集线器或其功能部件,或者从集线器到集线器 或其功能部件之间的一个点到另一个点的连接,从图 中可看出 的拓扑结构。 图 总线的拓扑结构 的主机 在任何 系统中,只有一个主机。 与主机系统的接口称作主机控制器。主机控 制器可由硬件、固件和软件综合实现。根集线器是由主机系统整合的,用以提供更多的连 接点。 的设备 从 协议的角度来分析, 的设备可分为以下两类。 网络集线器:提供 更多的连接点。 功能器件:为系统提供特定的功能,如 的 连 接 设 备、鼠 标、键 盘 等 具 体 设 备 。 为了满足 设 备 正 常 工 作 需 要,提 供 的 标 准 接 口 应 当 满 足 以 下 要 求: 符合 协议 标准; 可以响应标准 操作,如配置和复位操作等; 具有标准的描述信息。 电缆和连接器 电缆 电缆的外形如图 所示。 标准的 电缆包括一对用于电源分配 的 规格的线对和一对 规 格的双绞线,并具有屏蔽和完整的保护层。它 适用于工作在 信号速率下典型的 外设。 另外一种同样规格的可以替代的电缆没有 绞缠在一起的线对和屏蔽,只能应用于 信号速率下。在不需要更多带宽的 图 电缆 子通道应用中可以使用这种电缆。在其他方面,子通道和全速率信道具有同样的机械规范。 兼容于 的低速电缆不需要屏蔽层, 的低速电缆则需要与全速电缆相同 的内层屏蔽。全速和高速使用相同的电缆。在全速和高速的电缆中,信号线必须有 的差 分特性阻抗。低速电缆的差分特性阻抗没有定义。 在全速和高速的 电缆中,两条信号线必须双绞;低速则只是建议使用双绞线,但不是 必需的。双绞线是将导线呈麻花状绞合,能有效地降低噪声,尤其是低频磁耦合的信号,例如 电源线 工频噪声。这是因为其麻花状的关系,任何电磁耦合进入导线的噪声,在绞线的 每一圈都会颠倒极性,结果使得进入导线的噪声信号彼此抵消,从而达到了降噪的目的。这种 方法在其他电路设计时也经常采用。 低速设备可以使用全速电缆,只要此电缆符合所有低速电缆的规格。这里所指的规格包 括在设备尾端不使用标准的 或 连接器以及最大长度为 在 规范中,低速电缆可达到 ,全速电缆可达到 的长度。 兼容的 全速电缆也可使用在高速上。整个 系统最长可到 ,即 使 用 个集线器与 条 的电缆。 规范禁止延长电缆,也就是禁止将电缆串联。延伸电缆的上游端有一个 系列插 头,在另一端有一个 系列插头。延伸电缆的下游端有一个 系列 插座和 插座。直接将电 缆串联并不能正常工作,应使用集线器来连接电缆。但如果延伸电缆包含一个集线器、一个下 游连接端口以及一条电缆,则可以正常工作,这是因为它包含所有集线器。 要连接较长距离的方法是:使用标准 电缆来连接一个设备。此设备转换 与设计使 用适应长距离传输的 或其他接口,而此时远程的设备必须支持长距离的接口而不是 任何合格的电缆都必须能够携带总线的快速信号,而不会因为噪声的影响引起误码。在 市面上选购电缆时应当注意质量,建议选择正规厂家的产品,并且注意低速和全/高速的标志。 连接器 协议定义了两种连接器:使用在电缆“上游( ”端的 系 列( )和 使 用 在 电 缆 “ 下 游( 端 的 系列( 。例如,连接器 通 常 与 主 机( 连接,而连接器 通常与 设备相连接。对于所有 设 备 都 有 一 个“ 上 游 ”的 连 接 ,与 连 接器是不可以互换的,这样可以避免集线器间非法的循环往复的连接。 系列 连接器的外形及尺寸分别如图 和图 所示。 有时 设备设计得很小巧,所以系列 连接器就显得过于庞大了。在 规范 里新增加了一个 连接器,尺寸比系列 连接器小得多,开发者可在任何使用系列 连 接器的场合选用这一款迷你型的 连接器。 各种连接器的引脚和电缆颜色如表 所列。 表 连 接器 的 引 脚 和 电 缆 颜 色 图 系 列 连接器(单 位: ) 图 系 列 连接器(单 位 : 连接器有方向性,插入时线不能颠倒,仔细观察连接器的结构就可以发现,电源线引脚比 信 号 线 引 脚( )略 长。因 此,当 电 缆 连 接 时,其 电 源 线 会 先 接 入,然 后 才 是 信 号 线;而 当 拔去电缆连接时则相反。这是即插即用设备对连接器的要求,对于这一点应该不难理解。 电气特性 传输信号和电源采用一种四线电缆。图 所示的两根线是用于发送信号。 存 在 两 种 数 据 传 输 率: 高速信号传输模式的比特率定为 低速信号传输模式的比特率定为 。 低速模式需要更少的 保护。两种模式可在用同一 总线传输的情况下自动地动 态切换。因为过多的低速模式的使用将降低总线的利用率,所以该模式只支持有限个低带宽 的设备(如鼠标)。时钟被调制后和差分数据一同被传输出去,时钟信号被转换成 码 ,并 填充了比特,以保证转换的连续性。每一数据包中附有同步信号,以使收方可还原出原时钟 信号。 电缆中包括 两条线,可向设备提供电源。 使用+ 电 源 。 对 电缆长度的要求很低,最长可为几米。通过选择合适的导线长度,以匹配指定的 和其 他一些特性,如设备能源预算和电缆适应度。为了保证足够的输入电压和终端阻抗,重要的终 端设备应位于电缆的尾部。在每个端口都可检测终端是否连接或分离,并区分出高速或低速 设备。 高/低速设备与电阻连接的方式分别如图 和图 所示。 图 高速设备电缆与电阻连接 图 低速设备电缆与电阻连接 电源 关于电源的规范主要包括以下两方面。 电 源 分配: 的设备如何通过 分配得到由主计算机提供的能源。 电源管理:通过电源管理系统, 的系统软件和设备如何与主机协调工作。 电源分配 每个 单元通过电缆只能提供有限的能源。主机对那种直接相连的 设备提供电 源,并且每个 设备都 可能有自己 的电源 。那 些完全依靠电 缆提供能源 的设备称作 “总线 供能”设备;相反,那些可选择能源来源的设备称作“自供电”设备。集线器可由与之相连的 设备提供电源。 电源管理 主机与 系统有相互独立的电源管理系统。 的系统软件可与主机的能源管 理系统结合共同处理各种电源子件,如挂起、唤醒,并且有特色的是, 设备具有特有的电 源管理特性,可让系统软件控制其电源管理。 的电源分配和电源管理特性使之可以被设计在电源传感系统中,如采用电池的笔记 本电脑。 总线协议 总线属于一种轮询方式的总线,主机控制端口初始化所有的数据传输。 每一总线执行动作最多可传输 个数据包。按照传输前制定好的原则,在每次传输开始 时,主机控制器发送一个描述传输运作的种类、方向, 设备地址和终端号的 数据包。 这 个 数 据 包 通 常 称 为 令 牌( 设备从解码后的数据包的适当位置取出属于 自己的数据。数据传输方向不是从主机到设备,就是从设备到主机。在传输开始时,由令牌来 指示数据的传输方向,然后发送端开始发送包含信息的数据包或表明没有数据发送。接收端 也要相应地发送一个握手的数据包,表明是否传输成功。发送端和接收端之间的 数据传 输,在主机和设备的端口之间可视为一个通道。通常存在两种类型的通道:流和消息。流的 数据不像消息的数据,它没有 所定义的结构,而且通道与数据带宽、传输服务类型和端口 特性(如方向和缓冲区大小)有关。多数通道在 设备设置完成后即存在。 中有一个 特殊的通道 缺省控制通道,它属于消息通道,当设备一启动即存在,从而为设备的设置、查 询状况和输入控制信息提供了一个入口。 事务预处理允许对一些数据流的通道进行控制,从而在硬件级上防止了对缓冲区的高估 或低估,通过发送不确认握手信号阻塞了数据的传输速度。当不确认信号发过后,若总线有空 闲,则数据传输将再做一次。这种流控制机制允许灵活的任务安排,可使不同性质的流通道同 时正常工作。这样,多种流通常可在不同间隔进行工作,以传输大小不同的数据包。 稳定性 利用 技术,可使系统运行更加稳定。稳定性的特点主要表现在如下方面: 使用差分的驱动接收和防护,以保证信号完整性; 在数据和控制信息上加了循环冗余码( 对装卸的检测和系统级资源的设置; 对丢失或损坏的数据包暂停传输,利用协议自我恢复; 对数据流进行控制,以保证同步信号和硬件缓冲区管理的安全; 数据和控制通道的建立,使功能部件的相互不利的影响独立分开,以消除负作用。 错误检测 传输介质产生的错误率是与自然界的异常现象的概率相吻合的,是瞬时一现的,因 此就要在每个数据包中加入检测位来发现这些瞬时的错误,并且提供了一系列硬件和软件设 施来保证数据的正确性。 协议中对 每个包中的控制和 数据位都提供了 循环冗余码校验 ,若出现了循环冗 余码的错 误,则被认为是该数据包已被损坏。循环冗余码可对一位或两位的错误进行 的修复。 错误处理 协议在硬件或软件级上提供对错误的处理。硬件的错误处理包括汇报并重新进行上一次 失败的传输。若传输中遇到错误,则 主机控制器将重新进行传输,最多可再进行 次 ;若 错误依然存在,则对客户端软件报告错误,客户端软件可用一种特定的方法进行处理。 系统设置 由于 设备可随时安装和拆卸,因此系统软件在物理的总线布局上必须支持这种动态 变化。 设备的安装 所有的 设备都是通过端口接在 上,网络集线器知道这些指定的 设 备,集 线器有一个状态指示器,指明在其某个端口上 设备是否被安装或拆除了,主机将所有的 集线器排成队列,以取回其状态指示。在 设备安装后,主机通过设备控制通道激活该端 口,并 以 预 设 的 地 址 值 给 设备。 主机对每个设备指定惟一的 地址,并检测这种新装的 设备是集线器还是功能 部件。主机为 设备建立了控制通道,可使用指定的 的地址和零号端口。 如果安装的 设备是 集线器,并且 设备连在其端口上,则上述过程对每个 设备的安装都要做一遍。 如果安装的设备是功能部件,则主机中关于该设备的软件将因设备的连接而被引发。 设备的拆卸 当 设备 从集线器 的端口拆 除后 ,集 线器关 闭该端口 ,并且向 主机报告 该设备已 不存 在 ,则 的系统软件将准确进行处理。如果去除 设 备 上 集 线 器 ,则 的系统软件 将对集线器反连在其上的所有设备进行处理。 总线标号 总线标号就是对连接在总线上的设备指定惟一地址的一种动作。因为 允许 设 备在任何时刻从 上安装或拆卸,所以总线标号是 的系统软件始终要作的动作。而 且总线标号还包括对拆除设备的检测和处理。 数据流种类 数据和控制信号在主机与 设备间 的交换存 在两种通道 :单向和 双向 。 的数据 传输是在主机软件与一个 设备的指定端口之间。这种主机软件与 设备的端口间的 联系称作通道。总的来说,各通道之间的数据流动是相互独立的。一个指定的 设备可有 许 多 通 道 。例 如 ,一 个 设备存在一个端口,可建立一个向其他 设备的端口发送数据 的通道,并可建立一个从其他 设备的端口接收数据的通道。 的结构包含以下 种基本的数据传输类型。 控制 数据 传输 :在 设备 连接 时用 来对 设备 进行设 置 ,还可 对指 定设 备进 行控 制 ,如通 道控制。 批量数据传输:大批量产生并使用的数据,在传输约束下具有很广的动态范围。 中断数据的传输:用来描述或匹配人的感觉或对特征反应的回馈。 同 步数 据的 传输 :由 预先 确定 的传 输延 迟来 填满 预定 的 带宽。 对于任何特定的设备进行设置时,一种通道只能支持上述一种方式的数据传输。 控制传输 当 设备初次安装时, 系统软件采用控制数据来对设备进行设置,设备驱动程序 通过特定的方式使用控制数据来传输,数据传输是无损性的。 批量传输 批量数据是由大量的数据组成,如使用打印机和扫描仪时,批量数据是连续的。在硬件级 上可使用错误检测,以保证可靠的数据传输,并在硬件级上引入了数据的多次传输。此外,根 据其他一些总线动作,被大量数据占用的带宽可以相应地进行改变。 中断传输 中断数据是少量的,且其数据延迟时间也是有范围的。这种数据可由设备在任何时刻发 送,并且以不慢于设备指定的速率在 上传输。 中断数据一般由事件通告、特征及座标号组成,只有一个或几个字节。匹配定点设备的座 标即为一例。虽然精确指定的传输率不必要,但 必须对交互数据提供一个反应时间的最 低界限。 同步传输 同步数据的建立、传输和使用是连续且实时的,并以稳定的速率发送和接收实时的信息, 且使接收者与发送者保持相同的时间安排。除了传输速率,同步数据对传输延迟非常敏感。 因此,同步通道带宽的确定,必须满足对相关功能部件的取样特性。不可避免的信号延迟与每 个端口的可用缓冲区数有关。 一个典型的同步数据的例子是语音。如果数据流的传送率不能保持,数据流是否丢失将 取决于缓冲区的大小和损坏的程度。即使数据在 硬件上以合适的速率传输,软件造成的 传输延迟将对那些如电话会议等实时系统的应用造成损害。 实时地传输同步数据肯定会发生潜在瞬时的数据流丢失现象。换句话说,即使许多硬件 机制(如重传)的引入也不能避免错误的产生。实际应用中, 的数据出错率小到几乎可以 忽略不计。从 的带宽中给 同步数据流分配了专有的一部分,以满足所想得到的传 速率。 还为同步数据的传输设计了最少延迟时间 指定 带宽 的带宽分配给各个通道,当一个通道建立后, 就分配给它一定的带宽, 设 备需要提供一些数据缓冲区。若 提供了更多带宽,则需要更多的缓冲区。 的体系 要保证缓冲引导的硬件的延迟限定在几毫秒( )内 。 的带宽容量可以容纳多种不同的数据流,因此保证 上可以连接大量设备 ,如 可 以容纳从 直到 速率范围的电信设备。同时, 支持在同一时刻不同设备具有不 同比特率,并具有一个动态变动的范围。 规范对总线的每类传输规定了具体的原则。 设备 设备分为诸如集线器、分配器或文本设备等种类。集线器类指的是一种提供 连接点的设备, 设备需要提供自检和属性设置的信息,且必须在任何时刻执行与所定义 设备的状态相一致的动态。 设备特性 当设备被连接、编号后,该设备就拥有一个惟一的 地址。设备就是通过该 地址 被 操 作 的,每 一 个 设备通过一个或多个通道与主机通信。所有 设备必须在零号端 口上有一指定的通道,每个 设备的 控制通道将与之相连。通过此控制通道,所有的 设备都列入一个共同的准入机制,以获得控制操作的信息。 在零号端口上,控制通道中的信息应完整地描述 设备。此类信息主要有以下几类: 标准信息。这类信息是对所有 设备共性的定义,包括厂商识别、设备种类、电源 管理等项目。设备设置、接口及终端的描述在此给出。 类别信息。此类信息给出了不同 设备的定义,主要反映其不同点。 厂商信息。 设备的厂商可自由地提供各种有关信息,其格式不受该规范制 约 。此 外 ,每 个 设备均提供 的控制和状态信息。 设备描述 设备主要分为两类:集线器和功能部件。只有集线器可以提供更多的 的连接 点,而功能部件则为主机提供了具体的功能。 集线器 在即插即用的 的结构体系中,集线器是一种重要设备。从用户的观点出发,集线器 极大地简化了 的互连复杂性,而且以很低的价格和高易用性为设备提供了可靠的连接。 集线器串接在中继器上,可让不同性质的设备连接在 上,其连接点称作端口。每个 集线器将一个连接点转化成许多连接点,并且该体系结构支持多个集线器的连接。 每个集线器的上游端口向主机方向进行连接。每个集线器的下游端口允许连接另外的集 线器或功能部件。集线器可检测每个下游端口设备的安装或拆卸,并可对下游端口的设备分 配能源。每个下游端口都具有独立的能力,不论高速或低速设备均可连接。集线器可将低速 和高速端口的信号分开。 一个集线器包括两部分:集线控制器( )和集线放大器( 。集线放大器 是一种在游端口与下游端口之间的协议控制开关,其硬件上支持复位、挂起、唤醒的信号。集 线控制器提供了接口寄存器,用于与主机之间的通信。集线器允许主机对其特定状态和控制 命令进行设置,并监视和控制其端口。 功能部件 功能部件是一种通过总线进行发送接、收数据和控制信息的 设备,可通过一根电缆 连接在集线器的某个端口上。功能设备一般是一种相互无关的外设。一个物理单元中可以有 多个功能部件和一个内置集线器,并利用一根 电缆进行连接。这通常被称为复合设备, 即一个集线器连向主机,并有一个或多个不可拆卸的 设备连在其上。 每个功能设备都包含设置信息,用以描述该设备的性能和所需资源。主机要在功能部件 使用前对其进行设置。设置信息包括 带宽分配和选择设备的设置信息等。 下面列举了一些功能部件: 定位设备,如鼠标或光笔; 输入设备,如键盘; 电 信 适 配 器,如 主机:硬件和软件 的主机通过主机控制器与 设备进行交互。其功能如下: 检测 设备的安装和拆卸; 管理主机与 设 备 之 间 的 控 制 流; 管理主机与 设 备 之 间 的 数 据 流; 收集状态和动作信息; 提供能量给连接的 设备。 主机上 的系统软件管理 设备与主机上该设备软件之间的交互。 件与设备软件间有以下 种相 互作 用方 式: 设 备 编 号 和 设 置; 同 步 数 据 传 输; 异 步 数 据 传 输; 电 源 管 理; 设备和总线管理信息。 只要可能, 系统软件就会使用目前的主机软件接口来管理上述几种方式。 系统软 第章 简介 通过第 章的介绍,了解了 的基本概念和特性。从本章开始,将开始学习 以下简称 单片机的硬件结构和内部的相关特性。 半导体公司的 系列芯片以其良好的性能和独特的设计在 接口开 发领域中占有重要的位置。 和 系列芯片是全面支持 的全速系列芯片。在此基础上, 半导体公司又研制了 芯片。该芯片符 合 协议标准,同时兼容 全 速工 作 方式 ,是 对 系列产品的又一 推动。 在介绍 前,有 必要列出 半导体公司开发的 系列芯片, 以便了解它们的发展情况。该系列芯片的类型及特性如表 所列。 表 系列芯片类型及特性 系 列( )在 其 他 结构上进行了重要的改进,包括增强型 核 芯、 智能型 核芯和高性能 端口。该系列包括 种不同的产 品 以适应不同系统的需要。 )是 半导体公司第二代全速 系列产品。该产品 比第一代 产品具有更高的性能和集成水平。它基于 特性功能部件,包括 智能 核 芯 、增 强 型 核 芯、 和高性能 端 口 。 以提供更快 的操作和更多与芯片间高速传输数据的方式,增强了 系列芯片的功能。 新 的“ 更 快、扩 展 ” 系列芯片保持与 系列芯片的编码兼容性,并具 有原系列的多种特性。 的 进 一 步 扩 展 ,使 成为高性能和高集成 应用流行部件的特性集,增加了超高速 、直接存储器存取( 、辅 助 先 进 先 出 和 通 用 可 编程接口( )等功能。内部先进先出可配置 位 数据 通道 ,并 允许 主动 操作 或从 属操 作。 可以配置,以无胶粘连接 、数 字 信 号 处 理器 或 标 准 接 口,例 如 ( 增 强 型 并 联 端 口 )无 线 网 络 芯 片 组 和 家 用 芯片组。 )是 半导体公司的新一代高速 系列,可以用 最大数据传输率传输数据。与 相比, 可提供更高的性 能和更高的集成水平,包括提高 倍的 信 号速 率 。该 芯 片基 于 芯片 开发,通过集成的发送器、 微控制器、存储器和可编程 接 口,提 供 支 持。这是一种完全集成的 方 案 ,具 有 的全带宽能力。 高宽带通用串行总线 规范的最终完成,巩固了 作为个人电脑和嵌入式系统 总线技术首选的地位。由于 的出现 ,高清晰度视 频会议摄像机 、高性能外部 海量存 储器装置 、下一代扫描器和 打印机 、更快的宽 带互联网和高速网 络连接都将以更高 的速率传输 数据。 将使外围设备到个人电脑的连接速率从 的 扩展到 因为高速模式的基本结构与 相 同,所 以 由 现 有 外围设备迁移到 上比改用 其他新技术要容易得多;而且因为 与目前的 系统和外围设备向下及向上都完 全兼容,客户可继续使用现有的电缆和连接器。 主机是主控者 主机是惟一的主控者,这是最基本的 概念。在 系 统 中 ,仅 有 一 个 支 配 者 ,那 就 是 主 机 。 设备将会等待主机的请求而加以响应。因此, 设备是无法在其之间相互进 行信息传递的, 并不支持点对点( )的 拓 扑 结 构。 然而,存在一种情况使得 设备无须主机的介入即可开始发出信号,那就是由主机将 设备置入低功耗“挂起”模式之后,设备可发出“远程唤醒”信号。这是惟一的一种设备可以开 始发送信号的情况。除此情况外,除非主机发出设备请求,然后设备才会加以响应。 利用这种以主机为中心的模式, 设计工程师应当特别留心产品的成本,可以设计尽 量低成本的外围设备,而将复杂的部分尽量放置在 主机一侧。当然,如果将 结构设 计为点对点的方式,则每个 设备可能需要性能更好,相对来说,设计产品的成本也将 更高。 方向 由于主机总是总线主控者,这样就很容易记得 方 向: 是指从主机到设备,而 是指从设备到主机。 的术语采用这个约定。例如,一个端点发送数据到主机,则定义 为 端点。刚刚开始接触,可能会不太理解,为什么 “发送”数据到主机反而定义为 呢?其实 和 数据。 主要是从哪个方向看的问题。相应地, 通过从主机 令牌和 码 端点接收 数据交换中,包含了特殊程序代码所定义的数据包,即所谓的信息包 或 表示何种信息包正在传送信息。表 列 出了 种 类型。 图 为 所示为 传输示意图。 令牌,用来指示 信息包表 信息包 令牌表示数据从主机传送到总线。信息包②包 含了数据,用来指示 。信息包③为 握手包,在此,设备会送出 给主机,以 表示正确无误地接收到主机所传送的数据。 同 样 ,在 图 中,用户可以看到第二个数 据交换是由另一个 令牌④开始的,而后再跟随更多的数据⑤。在这一时刻,用户使用了 另一个 。最后,设备再一次以握手包 来说明已经成功地传送了 数据。 图 传输 当工作在全速方式时,每一个 传输都发送 数据(即使此时设备因为忙而无法 接收数据)。当工作在高速方式时,通过采用新的“ 来补偿 带宽的微小的闲置。 主机向 端点首次发送短 令牌 ,询 问外围 设备 是否有 空间 接收 数 据,只有 当 令牌得到了 的 回 答,主 机 才 发 送 令牌和数据。 设计者采取非常周密的错误检测,这也就是为什么会采用两个 和 的原因。正如前面提到的一样, 握手是用来指示主机和外围设备已经无错 误地接收了数据(包最后的 字段是用来检测错误的)。但是,如果握手包本身在传输过程 中就已经扭曲或损坏又当如何呢? 为了检测这个错误,可在每一侧(主机和外围设备)维护 位,用 于在 每个 包传 输时加以 。而这个内部 位的状态,将会与到达伴随着数据的 相 比 较 ,如 或 。当送出数据时,主机和外围设备交替发送 和 通过内部 位的状态与 相比较的方式 ,主机和外围设备就能 检测到错误或 损坏的握手包。 令牌仅供控制传输使用,其中放了 字节的前导数据,用于主机的设备请求进行 译码。在全速方式下, )令 牌 每 产生一次,用来表示 帧 的 到达; 而 在 高 速 方 式 下,每 一 个 帧中包含 个 令牌。 有 种握手 用来表示 传 输 的 状 态: )表示一个令牌或数据包接收成功。 )表示接收器当前太忙或没有资源来处理令牌或数据包。 它表示的是“忙,再试一次”,不要误解为 表示的是错误。它不是表示发生了错 误 , 设备通常会通过“无响应”来表示发生了错误。外围设备可对除了 令 牌以外的任何事务处理做出 握手。 停滞)表示发生了一些无法预料的错误(可能是通信错误导致,也可能是主机 与外围设备软件之间无法配合的原因)。设备发送 握手包用来表示不了解这 个设备的请求,这可能是在外围设备端发生了错误,或者是主机试图去尝试存取一些 不存在的资源。这个状态有点儿像“停止( ,但是情况要好些,因为此时 会 提供从 恢 复( )的 方 法 。 )表示的意思与 相同,即数据接收无误,但是,它还表示端点还 没有准备好接收“另外的” 传输。 仅在高速方式时有效。 此外, 前 导 ) 置于低速( 传输之前,而 只 支 持 全 速( ) 和 高 速( )的 传输方式,它将忽略 包以及其后 跟随的低速传输。 从主机接收数据 为了发送数据到 外围设备,主机会在数据之后发出 令 牌包 。如 果 外围 设备 还 有容量空间,并能无错误地接收数据,就会回复 ,让主机知道。如果处在忙状态,则以 来取 代传 输 。假 如发 现了一 个错 误 ,则 不传 输任 何信息 。对 于后两 种情 况 ,主 机会 在稍 后传输数据。 发送数据到主机 设 备 不 会“ 自 然 地 ”将 数 据 传 输 到 主 机 上,为 了 传 输 , 的固件或外部逻 辑任何时刻都能装载数据到 端点缓冲区并“保持( 。然而,直到主机向 端点发 出 请求,这些数据才被传输。如果主机一直不发 令牌,则这些数据是否还保存在 的端点缓冲区就不一定了。 帧 对于所有 设备, 主机通过每 传输一个 帧起始)包来作为时间基准。 包包含对每一帧进行累加计数的 位计数值。当前的帧计数值[ ]可 在 任 何 时 刻从 内部寄存器中读到。 在 高 速( )方 式 下 ,每 帧被分为 个 “微帧 ,每 一个微 帧都由 包作为先导。而帧计数值则仍然是每 累 加 一 次 ,所 以 这 些 包中包含同 样的帧计数值。为了保持当前的微帧计数值 提供了一个可读的微帧计数器。 只要 接收到一个 ,它 就 生 成 一 次 中 断 请 求( 全 速 方 式 时 ,每 一 次;高速 方式 时 ,每 一次)。这个 中断非常有用,例如可以用于同步端点数据传输等。 传输类型 定义了 种传输类型,这些传输类型必须符合通过总线来传输不同数据类型的需求。 批量 传 输 批量传输是一种突发的传输模式。此种传输模式中,在全速方式时,以 字节 信息包传输;在高速方式时,以 字节信息包传输。此外,由于其具有自动的错误数据校验 机 制( ,所以批量传输能够确保其正确性。若总线上有可用的带宽时,则主机会安排批量 信息包。使用批量传输的典型外围设备有打印机、扫描仪和调制/解调器等。另外,批量传输 可通过握手包所提供的内建流程来控制。批量传输示意图如图 所示。 图 两种批量 传 输 形 式: 和 中断传输 中断 传输 有点 儿类似 于批 量传输 。中 断传 输的信 息包 大小在 全速 方式 时为 字节, 而在高速方式时可达到 字 节 。中 断 端 点必 须 设 置轮 询 间 隔 ,以 保 证 经过 主 机 做有 规 则 的询问(接收 令牌 )。因 此,此种 中断 传输 方式 有点 儿像 主机的轮询方式。早期的 协议,仅具备中断 传输;而在 以 后 的 协 议,则 增 加 了 中 断 传输。中断传 输示意图如图 所示。 图 中断传输 同步传输 同步传输具有时间临界的特性,应用在如音频和视频的数据流中。一个同步信息包,在全 速方式时可达到 字节;而在高速方式时可达到 字节。对于同步传输,传输的时间 是最重要的请求信息。在每一个 帧中,会声明某些带宽给同步传输使用。为了减轻带宽 分配的负担,同步传输没有设置任何的握手包( ,而且也不会在 发生错误时重试。错误检测仅限于 位 错误校验码。由于同步传输没有采用 机制,所以在全速方式中,同步传输仅使用了 ;而在 高 速方 式中,同步 传输 使 用了 和 。在全速方式下,每一个端点、每一帧仅只有一个 同步信息包能被传输;而在高速方式下,可以有 个同步信息包。同步传输示意图如图 所示。 图 同步传输 控制传输 控制传输用 于配置设备和给设备 发送命令 。由于控制传 输的作用是如此重要 ,所以传输 中采用了最强的 错误校验。对于控制传输,主机在每一 帧中都留有余量(一般为 。控制传输示意图如图 所示。 图 控制传输 控制传输包含 个阶段。其中, 阶段中包含了 个 数据。 如有必要,可执行 阶段,此阶段包含有更多的数据。在 ( 或 握 手 )阶 段 中 ,允 许设备指示一个控制操作已经成功完成。 上面讨论了 种传输类型,需要注意的是这些内容必须与以后讨论的有关端点的知识相 结合,每一种传输类型都是通过相应的端点来实现的。 设备枚举 当用户打开计算机,将 设备连接到 总线 后,主 机的 系统将自动检测 设 备 并 连 接 设 备 ,经 过 很 短 的 时 间 ,将 会 发 现 设备已经神奇地与计算机连接好了。一般 都有这样的经验,当要将一个声卡安装到计算机中时,要设置很多跳线,安装驱动,设置 /中 断/ 等。这时我们都在想,如果能够实现即插即用就好了,而 则将此变成了现实。 这一切是如何进行的呢?在每一个 设备的内部都有一个设备描述表,在这个设备描 述表中包含了设备全部的要求和特性。在 设备插入主机后,主机就会执行认证程序,这 个过程称为设备枚举。可将这个程序简化为如下 个步 骤: ① 使 用 预设 的 地 址 取得设备描述符; ②设定设备的新地址; ③使用新地址取得设备描述符; ④取得配置描述符; ⑤设定配置描述符。 由此可知,设备枚举就是通过连接主机与设备之间的控制传输来辨识和配置新连接上的 设备的过程。如果主机成功地对设备进行了枚举,在 系统中的注册表编辑器 中就可以发现设备相应的 和 码(制 造商 码和 产品 码)。 芯片符合 协议的规定,而 协 议 要 求 高 速( )设 备也能在全速方式下完成设备枚举。实际上,所有高速设备在枚举的开始阶段都是工作在全 速方式;只有当主机和设备“同意”工作在高速方式时,才切换到高速方式。如果主机是全速 的 ,那 么 将在全速方式下进行设备枚举。如果设备连接到了高速的主机,那么它将自动 切换到高速方式。 串行接口引擎 每一个 设备都有串行接口引擎 用于连接 数 据 线( 从 设备发送和接收字节数据。如图 所示, 的功能是对信息包 用传输的 位进行错误检测,并且传输下载数据到 设备。 + 和 )以 及 进行译码,利 图 串行 接口引擎 工 作 流 程 图 批量传输是一种异步传输方式,这就意味着其包含了使用 及 握手 码来传 输控制机制。而 可以送出 握手包给主机,表示目前正处在“忙”状态。若当外围设 备已经成功地传输数据后,则它会命令 送 出 握手包,用来指示已经成功。如果 遇到数据发生错误,则它将自动用“无响应”来代替握手 ,通知主机重新发送数据。 为了发送数据到主机, 从 设备接收字节及控制信号,并为 传输做格式化, 且通过两条 传输线 + 和 传输数据。由于 采用了自时钟数据格式( ,为 了保证在串行数据传输品质, 会在适当的地方插入位,这个动作称之为位填充。显然,这 一动作是由 的 控制的。 系列芯片与其他 芯片一样,具有一个非常重要的特性,就是以 “软 ”为主,取代了以 往需要 或者可烧写存储器的要求。它包含了内部程序、数据 可通过 总线 本身 来下 载运 行 ,并 且可 赋予 设备基 本特 性 。这样 ,可方 便修 改和 更新 程序 代码。 中设计“前卫”的 ,不但能够完成图 所示的基本功能,而且可完全独立地完成 设备枚举的任务,并且将 作为一个 设备进行连接,同时下载固件代码到其 和 对 进行复位操作。这种增强的 功能也使得用 进行开发的用户非常 方便,缩短了开发的周期。 设备重枚举 由于 芯片采用所谓的“软”解决方案,所以同一个芯片可扮演多重特性的 设备。当首次插入 时, 通过 电缆自动进行设备枚举,下载固件 程序和 设备描述表;之后, 将对设备进行再次枚举,在这次枚举中将根据 第一次枚举中下载的信息进行设备定义。这一次的枚举过程称之为重枚举。它在初次设备枚 举完成后会立即进行,没有提示信息。当然, 也可以与一般的 接口芯片一 样,从外接 中下载固件程序并且运行。关于枚举和重枚举的细节,将在第 章中详 细讨论。 构成 公司推出的 芯 片 ,将 外围接口设备所需的各种功能包装成 一个简洁的集成电路。如图 所示,集成的 收发器连接到 总线中的 和 串行接口引擎 )进 行 译 码、编 码、错 误 纠 正 和 位 填 充,变 换 所需的信号电平;最终,从 接口 发送和接收数据。 的 可工作在全速( )或高速( )传输速率下。为适应 的增强带宽, 端点 和从属 端点统一采取措施,省去了内 部传输所花费的时间。 的 采用增强 ,提高了运行速度,增强了功能。同时,该芯片采用 内部 用于程序和数据存取。 典型的基于 的 外 设 具 有 双 重 功 能: 图 的 引脚封装简化框图 通过主机请求,从控制端点(端点 实现高级别 的 协 议; 可作为通用系统使用。 由于高级 协 议 没 有 带 宽 的 限 制,所 以 的 能够很适应地通过控制端点处理 主机请求。然而,由 所提供的数据速率,对于 来说实在太高了,以至于它不能 直接处理 的数据。由于这个原因,通常 不能工作在 端点与外部接口之间的 高带宽数据通路上。为此, 进行了简单的处置,就是退出处理,不干预操作过程。此时 直接在 与外部接口之间传递数据。 可通过外部的主控器控制,可通过外部提供的时钟信号同步运行,或者通过选通信 号工作在异步方式。 另外, 也能够由内部的 时序生 成器控制 ,这个时序 生成器即所 谓的通用 可编程 接口( 作为内部的主控制器工作,直接连接 ,并且产生用户编程控制信号, 用于连接外部逻辑。此外, 通过采样 引脚上的外部信号,还能用于等待外部触发 事件。对于时序信号, 运行速率比 数据传输速率要快的多, 提供了更好的 编程方法。它的时钟可以是 内部的时钟,也可以是由外部提供的时钟。 的 具有更好的性能,提供了 个 口、 个 接 口 、 个计数/定时器以 及增强的中断系统。它工作在 时钟频率,并且使用每个命令只需要 个时钟周期,用 以代替标准 必需的 个时钟周期。 系列芯片采用增强的 接口,通过执行更多的 协 议,大 大简 化 了 的编程量。实际上, 无须固件程序就能构成完整的一个 设备。 与所有的 系列芯片一样, 芯片也工作在 电源下。用户可直接应用 连接器上的 电源(根据 规 范,最 低 可 达 )去 驱 动 电压调整器,以提 供 芯片和相关电路所需的电源 ,这样就简化了总线供电的 设备的设计。 的 引脚封装结构带有 地址总线、数据总线及控制信号,使得它可以方便地 扩展连接外部存储器以及存储器映像 。图 是该种封装的框图。在第 章中,将 详细 讨论扩展外部存储器接口方面的内容。 图 的 引脚封装简化框图 特性 具有如下特性。 芯片内有 的收发器( 和智能 ,包含全部 物 理 层( 倍增缓冲端点 内部嵌入可运行在 以适应 频率的增强型 的 数据传输速率。 \ 内核。 性能全面:含有 字节寄存器 个 个定时/计数器和 个 数据 、  指针。 快速性:每条命令只需要 个时钟周期(工作在  频率时为 采用 存取控制寄存器(包括 端口),以便满足高速要求。 为缩短 等待时间,采用 矢量中断。 使用 内部事务处理和控制,而不是采用高速数据传输。 “软 方 式 ”处 理: 固件程序可通过 下载到芯片,并且不需要硬件编码存储器。 个接口 :它们都可以由外部和内部来提供时钟,端点 与接口 两者 相结合可实现缩短 和外部逻辑电路数据传输的时间。 通用可编程接口( )作 为 一 种 微 编码 状 态 设 备,可 实 现时 序 管 理,使 得 达到无缝连接。 提供了一款全面 外围设备解决方案的接口芯片,设计时无须考 虑外部物理层( 集成了所有的功能,这样就大大降低了成本,并也减少 了芯片之间高速信号布线的困难。 集成微处理器 置地址在 的 采用片上 作为程序存储器和数据存储器, 通过使用设 的片上 中的寄存器来与 通 信 。 的 有 两个 职 责 。首 先 ,它 要 负责 在 协议第 章“ 设备 固件”中所定义的协议标准。幸好,对于 的智能 来说,固件程序与 协 议的配合被简化了。其次,剩余的代码空间和带宽可满足 的基本工作,并完成对设备的 操作。在设备端,富余的输入/输出资源也可被利用,包括 端 口、 以及 总线主 控制器。 把 的体系结构理解为 设置和控制数据收发器,这一点很重要,但也 要 知 道 ,通 常 不参与高带宽传输。 不在数据通道上,代替 的是能够处理端点 数据的大数据 ,进而直 接与外部接口连接 。为了使得接口通 用 ,引入了可编程 时序生成 器 ,也 就 是 通用可编程接口)。它能够产生用户程序波形,满足内部 与外部逻辑 电路之间的高带宽传输。 与标准的 中断系统相比, 的 增加了以下 个中断源。 中断。 总线中断。 中断。 :外 部 中 断 :外 部 中 断 :外 部 中 断 中断。 唤醒中断。 提供了 个 独立 的 中 断源,与 中 断 共 享; 个 中 断 源,与 中断共享。为了保存代码及正常情况下由一个特殊中断源请求加以区别的 处理时间, 提供了第二层中断向量,就是所谓的“自动向量”。每一个 和 中断源都有其自己的中断向量,所以,当一个中断请求接收中断服务时,特定的中断服 务 程 序( )就自动被调用。关于这一点将在第 章 中 详 细 讨论。 硬件框图和封装 硬件框图如图 所示。 的封装形式有 种 ,即 引脚封装,如图 所示。 引脚封装 引出 个通用 引 脚( 口),其中 个 引脚可被设置成 位数据接口,用 于 的高速 位 。它可用于开发高性价比的接口,例如 等。 引 脚 封 装 具 体 功 能 如 下: 个位 口 ,即 和 兼容总 线; 个 位 或 位的通用可编程接口( )与 及 复用,还带有 个 非 复 用 的 控 制 信 号; 个 位 或 位的从属 ,带 个非复用的控制信号和 或 个与 复用 的控制信号。 图 硬件框图 图 引 脚、 引脚和 引脚 封装 引脚封装 引脚封装比 引脚封装芯片增加的功能如下: 增加了 个 位 口 ,即 和 增加了 个 控 制 信 号( )和准备信号( 个非复用外设信号 个 个计数器 输入、 和 增加了 个控制信号(同 复用); 个 地址线(复用, 口( 个 )、 口( 个 )); 和 信 号 用 于 读 / 写 选 通( 复 用 ,在 口)。 引脚封装 引脚封装增加了 地址、数据总线以及控制信号。其中 和 选通信 号是标准 单片机的控制信号,用于带有 地址和数据总线的外部扩展存储器的读/写 选 通 。 的译码信号 和 用于自动识别存储器位置并进行操作,以区分是片内的还 是片外的存储空间。 引脚封装增加的功能如下: 位 地 址 总 线; 位 数 据总 线; 地址/数据总线的控制信号。 种类型封装芯片的有效信号 中采用 种接口模式,即端口模式、 控制器模式和从属 模式。 图 所示的是 种封装类型中有效信号的逻辑框图。在图中,框图左边的信号是所有接口 模式都通用的信号,而在框图右边的信号则分别对应不同的接口模式。通过 内部的寄存器,由软件编程来实现接口模式的选择。 在端口模式中,所有的 引脚都是通用的 端口。 在 主 控 制 器 模 式 中 ,采 用 和 引脚作为 位数据与 个 端点 和 进行连接。在这个主控制器模式中, 是由内部 控制的。实际上,它就是一个可编程波形生成器,能够响应 状态 标志,能够利用它的 输出引脚发出时序信号,也能够在它的 输入引脚上等待变为 “真(  ”的外部条件。值得注意的是,在 引 脚 封 装 的 上, 信号只有一部分 和 被 运 用 ,而 在 引脚和 引脚的 上,则全部都被运用了 和 在从属 。 模式中,外部逻辑或外部处理器直接连接 的 端点 。在 这种模式中, 模式不起作用,这是由于外部逻辑已经直接对 进行了控制。因此,基 本的 信 号( 标 志、选 择、选 通 信 号 )没 有 从 引脚引出。外部主控制器能够 工作在同步或异步方式,并且可以向 接口提供自己独立的时钟。 引脚封装的 包括了 引脚封装的所有功能,并且增加了两个 端 口 ,即 和 端口,以及全部的 、定 时 器、中 断 和 信号。 和 引脚在 引脚封装中用于 端口的选通,而在 引脚封装中则用于扩 展存储器的 选通信号。 引脚封装的 比 引脚封装增加了 个引脚,用于引出全部 的 图 扩展存储器总线。这样,在加电和连接 脚的封装同时也提供 试监控程序,程序代码可下载到 的 种封装芯片的有效信号框图 前的运行应用中,允许连接扩展存储器。 引 开发套件的功能,利用运行在扩展 中的调 中。 几种封装的引脚分配参见附录 端点缓冲区 协 议定 义 了用 于 发送 和 接 收数 据 的端 点 。由 于 是一个串行总线,所以设备端 点实际上是一个用 数据字节不断取空和填满的 。主机通过发送 位地址和 个方 向位来选择端点,因此, 能够选择 个具有特定地址的端点,即 以及 。 从 的角度来看,端点就是一个充满了总线上接收或保持传输字节的缓冲区。 从 端点缓冲区读主机发出的数据,并且向 端点缓冲区写要传输给主机的数据。 包含了 个 字节的端点缓冲区,加上可定义为不同端点方式的 缓冲区空 间,如图 所示。在所有的配置中, 个 字节缓冲区是共有的。 图 端点缓冲区 个 字节的缓冲区被设计成 和 是默认的控制端点 ,是 一个用于 和 数据的单 字节缓冲区双向端点。当在控制传输的数据操作发出请求 时 , 的固件程序就会读或者填充 缓冲区。 在控制传输中, 个设置字节不会出现在 字节 端点缓冲区,而是用简单的编程来 替代, 自动存储这 字节到独自的缓冲区( ,地址为 和 使用各自独立的 字节缓冲区。 固件程序能够配置这些端点 作为 或 。这些端点以及端点 只有通过 的固 件程序进行存取,而大端点 和 缓冲区被设计用于高带宽数据在片上或片 外直接传输,而无须固件程序的干预。 端点 和 是大端点,适用于高带宽的数据传输。它们能够配置成各种不同的方式, 从而适应带宽的要求。图 中的下方带阴影的部分指示了大端点的各种方式中双、三、四 缓冲区的情况。双缓冲区意味着,一个数据包能够取空或用 数据填充,同时另外一个数 据包(从同一个端点来的)由外部逻辑电路处理。三缓冲区增加了第 个包缓冲区作为储备, 根据需要通过任何一边( 或接口)来使用。四缓冲区增加了第 个数据包缓冲区。当数 据提供和消耗速率相似时,多个缓冲能够有效地提高 的带宽性能,但会产生数据漏缺。 为弥补这一情况,减小或消除它,需要一边等待另一边。 端点 和 的配置选择如表 所 列。 表 端点 和 的配置选择 当 工 作 在全 速( 时 ,如 图 所 示 ,一 些或者全部的端点缓冲区字节可根据端点的类型被采用。 不管物理缓冲区的大小如何,端点缓冲区只提供一个全 速包。 例 如 ,如 果 被用于全速批量端点,则字节的最大 数 量( )提 供 字节,即使物理缓冲区大 小是 或 字节。虽然,它使得我们感觉配置全速批量端点为 字节没有 字节 好,但浪费的无效字节更少。另一方面,同步全速端点应当全部采用 或 字节缓 冲区。 外部 接口 的大数据 (端 点 和 )设计用于传输高速( )片上和片 外的 数据,而不用考虑任何带宽瓶颈。它们通过贯彻如下的特性来完成这个目的: 利用 的 外部数据通路,直接与外部逻辑连接; 在 和 之 间“,定 量 ”的 结构保证 瞬时传 输(提 交)数据 包; 具有多功能接口,包括从属 ( 外 部 主 控 制 器 )或 ( 内 部 主 控 制 器 )、同 步 或 异 步时钟、内部或外部时钟等。 固件程序设置切换配置外部 接 口 ,然 后,它 就 不 参 与 的数据输入和输出传 输了。 为了理解“定量 ,这里有必要提出两个数据域的概念。这两个数据域是 数据 域和接口数据域。每一个数据域都是独立的,允许不同的时钟和逻辑来处理它的数据。 域是由串行接口引擎实现的, 串行接口引擎在 总线的两根信号线上接收 和发送 数据 包, 域利用源自 芯片外围附加的 晶体的参考时钟。 接口域加载和卸载 端 点 。扩 展 设 备 ,如 或 等 ,能 够 为 接口提供它 本身的时钟,或者也可由 的 内 部 接 口 时 钟( )来向它提供时钟。 对于协调两者的不同和独立时钟的问题,经典的解决办法就是利用 的 有一个通用的性质,那就是它们是定量的 。这 就 意 味 着 ,在 大小的数据包范围内数 据提交给 ,总比在某一刻只提供一字节好。对于外部接口,这是不可视的。这是由于它 处理 时 ,就 像 任 何 普 通 一 样( 例 如 ,通 过 检 测 满 和 空 标 志 )“。定 量 ”与 普 通 相比只有很小的差别,这就是当空标志从 空 )向 ( 非 空 )转 换 时 ,在 中的字节数 量就跳变到 包的大小。显然,这比仅有一字节要好。 的“定量 ,可在数据域之间以几乎瞬间就被传输。这个 定量的特性也简 化了差错预防。如果端点数据是连续地由时钟同步控制进入 接口 ,那 么 ,由 于此 时在 包的结尾检测到一个差错,某些包数据可能就已经准备好了时钟同步输出。通过切换在 包大小区中域之间的 数据,在任何一个 包被提交给另外的域之前,它们都能 够进行差错检测,并且重试,这是非常必要的。 图 和图 显示了外部逻辑连接到 端点 和 的两种 方法。 图 主控制器模式中, 的 如图 所示,图中列举了从外部的视角来看 数据 配置成从属 的情 况。外部逻辑提供了一个时钟信号,响应 的标志,并采用选通信号进行时钟同步 数据的输入和输出。外部逻辑可方便地用内部 接 口 时 钟( )作为参考时钟。 图 中的 个 标志由圆括号括了起来,这是因为它们实际上在引脚图中被称为 个标志引脚)。利用配置位,不同的 标志能够被分配用于这些通 用标志引脚,名称由圆括号括起来。它们是这些配置标志的典型应用例子。可编程级标志 )能被设置成任意值去指示 “ 满 ”的 程 度。外 部 接 口 利 用 引脚来 选择 个 中 的 一 个,然 后 利 用 ( 从 属 读 )和 (从属写)信号进行时钟同步 位 数据的读/写。 被用于分派一个非“满”的 包 到 连接到 的外部系统必须提供控制电路来选择 、检查标志和时钟数据等。 包括成熟的控制单元( 通用 可编程接 口) ,它能够代 替这个 外部逻辑 。如 图 所 示 ,在 主控制器 模式中, 读 标 志 ,控 制 的选通,并且 对外部提供了用户专用接口。 运行速度非常高(工作频率最高可达到 ,便 于 开 发高分辨率的控制波形。它可以由内部两个时钟源 或 )中 的 一 个,或 者 从 外 部 来 提供时钟。 控制信号( 是可编程波形输出;而准备信号 )是 在输入引 脚,在 的暂停和 恢复操作时处于“等待状态”。这时,这些引脚可以被测试。 引脚对于接口呈现 位地址,这个接口在有数据被传输时可以增大。 的 中 断 信 号 是 一 个“ 挂 钩 ”,在 传 输 当 中 , 它可以向 的 发信号。一旦 声明它自己的 信号, 操作就会恢 复 。在 波形生成中,这个“挂钩”允许有很大的灵活性。 系列芯片 如表 所列, 系列芯片有 种封装形式,以便适应用户不同的需求。 表 系列芯片 第章 控制端点 引言 端点 在 系统中具有特殊的意义,它被用作控制端点,并且是每一个 设备都必 需的。 主机采用特殊的 令牌传输处理设备控制的信号,而且只有这种控制端点 能够接收这些特殊的令牌。 主机通过端点 发送一串标准设备请求。这些标准请求在《 规范说明》的第 章中有完整的定义。本章介绍 芯片如何处理端点 的请求。 在处理端点 的操作 上提供了大量的硬件支持,本章介绍这些操作以及 资源中简化处理这些操作的固件。 端点 是 芯片中惟一的控制端点。该控制端点是双向的,所以 提供一个 字 节的缓冲区 ,固件对此缓冲区的处理就如同对用于传输控制数据流的批量端点缓冲 区的处理一样。第 个 字节缓冲区 是端点 所独有的,它保存了控制传输阶 段中 段到达数据。这减轻了 固件必须保存的控制传输的 个 阶 段 ,即 和 的程序量。 还可能在各个传输阶段产生各自的中断请求,以进一步 简化程序代码。端点 总是由 主机激活并且处于可操作状态。 控制端点 的 控 制 传 输( 包 括 段 )如 图 所 示 。 端点 接受一个特定 信息包,它包含一个提供关于控制传输的主机信息的 字 节数据结构。控制传输包含最后的 段(状态段),它由标准的 和 )构 成 。 有些控制传输在 字节 数据包中包含所有需要数据。另一些控制传输比装入的 字节需要更多的 数据,或需要来自设备的 数据。这些传输使用标准批量 传 输来传递数据。 注 意:在 图 中, 段 ”看 上 去很 像 一个 批 量传 输 。当 有 端点时,端点 字节计数寄存器必须被装入,以正确地应答控制传输的每个数据传输段。 段由一个与数据段相反方向的空数据包或一个没有数据段的 包组成。这个 空数据包给设备提供了一个用 或者 应答整个控制传输的机会。 位用于 拖延控制传输的完成,直到设备有时间响应这个请求。例如,如果主机发出一个 请求, 固件将执行各种内部操作,如调整内部模式和重新初始化端点等。在这期间,主机 发出握手信息包( 段 ) 会 自 动 用 表 示“忙 ”的 信号响应该信息包。当固件 图 的控制传输(包含 段) 完成了其内部操作,就清除了 位(向该位写入“ ,表示命令 应答 段, 以结束 控制传输 。这个握手 信号预防 主机尝试 在全部配置 之前使用 接口 。 对于端点 传输的 或 段( 阶段不能 ,为 了 执 行 一 个 端 点的 (停 止),固件必 须设置 端点 的 和 位。 有些控制传输没有 段 ,因 此 ,处 理 数据的代码须检验 数据域(在 的 字节缓冲区中)中的长度,而且仅当长度不为 时,才提供端点 的 段( 通 过 装 入 : )。 两个中断提供 包已经到达的报告如图 所示。 图 与 控制传输有关的两个中断 在控制传输的起始, 检测到 令牌信号时,提出 令牌)中断请 求。该中断通常只用于调试。 当 数据的 字节被无错接收并被传输到 缓冲区时, 提出 位( 数据有效)中断请求。如果 发现 数据中有任何错误,就会自动 进行重试。这两个中断请求必须由固件清除。 通过直接检测 的 字节或将它们传输到本地缓冲区作进一步处理时,固件 响应 的中断请求。为 数 据服 务的 程 序应 该 具有 较高 的 中断 优 先级 ,因 为 规范说明》规定控制传输必须总是被接受且必须应答。因此可能发生这种情况,即当新 的控制传输已经到达时,固件仍然在执行前一个服务。在这种情况下,先前的控制传输服务将 被丢弃,转而执行新的服务。 中断进一步发出警告,一个新的控制传输将要覆盖 个 字节。 如果固件 端 点 (通过设置 和 位 为 ,则 会在下一个 令牌信号到达时自动清除 位。像所有 中断请求一样,即使其相应的中 断被中止, 和 位也可由固件直接进行检测和清除(通过写入“ 图 给出了用 处理控制传输的 寄存器。 分配给 (用于处理 传输的寄存器 传输) 图 与 控制传输相关的寄存器 中断使能)寄存器中的两个位使能 令 牌中 断( )和 数据有效中断。实际上,中断请求位在 中 断 请 求 )寄 存 器 中 。 传输 个 字节到 的 字节寄存器中。一个 位 指针 : ,给控制 传输提供了硬件上的支持。另外, 请求将在本章的 后面介绍。 请求 规范说明》版本 第 章“ 设备构架”中定义了一套标准的设备请求规则。 当固件控制再控制端点 时, 只是自动处理了其中的一个请求(设置地 址 ),其 余 的 由 固 件 处 理 。通 过 译 码 信息包中的 字节,固件作用于设备请求。表 列出了这 字节的含义。 表 中的“字节”栏显示的是相对于 的字节偏移。“域”栏显示不同请求中 的字节,比如“ ”作前缀的表示位图, ”作前缀的表示字节 位 , ”作前 缀的 表 示 字( 位, 表 中列出了对应 定义的不同值及固件如何响应每个请求。本章的剩余部 分将详细叙述表 中的每个请求。 注意:当 时,表示由固件而不是 硬件来处理设备请求。 表 令牌包中的 字节 表 固件如何处理 设 备 请 求(当 时)的方式 在 重 枚 举 条 件 下( 传递的除了固件中的设置地址外,还通过 中断传递固件中的所有 请求。 执行一个被称为“固件装载” (仅当请求的字节 ,且 的类型是 (表示为主机专用请求)时, 的值为 才是有效的)的主机专用请 求。装载请求总是有效的,因此甚至在重枚举后,也能使用装载特性。如果应用中执行了主机 专用 请求后,而不想使用固件装载特性,则在通常的请求下,要保证避免使 值 为 。在 第 章中将详细介绍固件装载特性。 为了避免将来的不兼容,制造商请求 由 半导体公司保留。 获取状态 规范说明》定义了 个 状态请求 。关于第 个请求 接口请求,在规范说 明中显示为“保留”。这 个状态请求分别是: 远 程 唤 醒(设 备 请 求 ); 自 上 电( 设 备 请 求 ); 端点请求); 接 口请 求( 保留 )。 自动响应 中 断,告 诉 固件 对 令牌 包进 行译码 ,并 提供适 当的 状态 信息。 如图 所示,通过对 复制到位于 中的 中的 字节的译码,固件 响应中断。通过装入 字 节至 缓冲器及写入“ ”到字节计数寄存器 ,固件应答取状态( 令牌作出响应。最终,固件清除 )请求( 位(对其写入“ 。   ,以 命 令 发送这 字 节 ,以 对 应答传输的状态段。 表 列出了关于取状态请求的 个 字节。 表 取状态请求“ 远 程 唤 醒 位和“自动上电”位) (取状态一设 备)询问两个位 远程唤醒位和自动上电位的状态 。远 程唤醒位表示设备当前是否允许远程唤醒请求(远程唤醒将在第 章的相关内容中解释);而 自动上电位表示设备是否能自上电(例如非 总 线 供 电 )。通 过 装 入 字节到 ,并 将 字 节 计 数 值“ ”装入到 ,固件返回上述的两个位。表 列 出 了 取 端 点 状态的 字节。 图 取状态请求的数据流 表 取端点状态 位) 每一个端点的 寄存器中都有一个 位。如果 设置了该位,则端点的 任何请求都将返回一个 握手信号,而不是 或者 取 状态一端点)请求返回端点的 状态,在请求的第 字节中指示端点号。注意,端点号 字节 中的第 位用于指示方向 。端 点 是一个控制端点,由 定义成双向端点,因此它只有一个 位。 关于  的 握手信号表示发生了意外。比如说,如果主机请求一个无效的交替设置 或者试图发送数据到一个并不存在的端点,这时设备就通过端点 发出 握手信号,而 不是 或 作为应答。 所有端点类型中都定义了 ,除了不使用握手信号的 (同步端 点 )。每 一 个 批量端点都有自己的 位。固件设置端点的 条件是在端点 的 寄存器里设置 位。主机通过 和 请求 来告诉固件对 条件进行设置和清除。 固件也可能决定自己设置 位。在端点 处理请求的日常工作中,例如当一个没 有定义或者不支持的请求被译码,固件就会设置 的 位。 一旦固件 一个端点,就无法离开 状态,除非主机发出一个 请求。但端点 是一个例外,它只为当前的事务报告 条件,然后自动清除 条 件 。这 就 避 免了 端 点 默认 端点 将设备请求锁住。 (取接口状态)命令是很简便的:固件通过 来返回两个 字 节 ,并 且 清 除 位(通 过写入 。在《 规范说明》中,被请求的字节显示为“保留(复 位到 。表 列出了取接口状态的 字节。 表 取接口状态 设置特性 设 置 特 性( )用 来 远 程 唤 醒 或 者 性(设 备远程唤醒位 )如表 所列,设置端点特性( 一个端点,没有数据段。设置设备特 )如 表 所 列。 表 设置 设备特性(设置远 程唤醒位) 表 设置端点特性( 在《 规范说明》中,目前定义的只有 请求是用来设置远程唤醒位 的。该请求与 请求一样,返回相同的位报告给主机(见表 。主机通过 设备利用这一位允许或者禁止远程唤醒。 在《 规范说明》中目前定义的只有 请求是用来 一个端 点 的 。对 指 定 的 端 点 请求中的第 字节),通过在 寄存器中设置 位 ,固 件 应答该请求。固件也可以自己 一个端点或者响应设备请求。通过主机的 请求将清除端点的 位。 固件可通过执行以下几个步骤来响应 请 求: ①在指定端点的 寄存器中设置 位。 ②复位指定端点的数据轮换位。 ③修复已经被 的端点回到它默认的状态,在主机离开 状态(通过一个 请 求) 之 后 做好 准 备 发送 或 接收 数 据 。对 于 的 端 点 ,例 如 ,固 件 清 除 寄存器中的 位;而 对 于 的 端点,固件写入任意 值到 的字节计数寄存器。 ④清除 寄存器中的 位( 写 入 ,终止 控制传输。 其中步骤③在主机发送 的任何时候都是需要的。 关于数据触发 会自动保持端点触发位来保证 传输数据的完整性。固件仅在一些非常有限的 情况下才会直接操作以下这些位: 清除特性 清 除 特 性( )是用来禁止远程唤醒或清除一个已经被 的端点。清除 设备特性(清除远程唤醒位)如表 所列,清除端点特性(清除 如表 所 列 。 表 清除设备特性 清除远程唤醒位) 表 清除端点特性(清除 如果 设备支持远程唤醒(当设备枚举时在其描述符表中告知), 请求会禁止唤醒能力。 从一个端点中删除 条 件。固件通过清除指定端点存放的 寄存器中的 位来进行应答。 获取描述符 在枚举过程中,主机使用获取描述符 )请求询问某一 设备来获悉它 的性能和需求。通过使用描述符表,设备返回如下信息(通过 的 端 点 ):装 载 的 何 种 设备驱动程序、拥有端点的数量、其不同的配置、可能使用的交替进行的设置及有关设备的文 本字符串信息。 提供了专门的 为 请求简化固件服务程序。固件 用所请求的描述符的起始地址装载这个 位的指针,清除 位( 写 入 ,而且 传 输整个描述符。 图 说明 的使用。这个指针由两个寄存器 和 实 现 。大 多 数 请求包含传输更多的数据,已经无法放进一个数据包 中 。在 图 的样例中,描述符由 字节组成。 通 常 情 况 下 ,以 控 制 传 输 开 始,由 自动将 包中的 字节传输到 图 对 请求使用 中的 ,并激活 中断请求。固件程序译出 请求,并通过清除 位(写入 应答 ,然后用请求 描述符的地址 装入到 寄存器。装载 寄存器使得 自动响应两个使用 作为基址、大小分别为 字节和 字节 ,然 后应 答( 段。 通 常 ,端 点 中断 和 ,在自动传输期间保持有效。因此,由于传输不需要 固件的介入,所以固件一般都会禁止这些中断。 描述符的类型有 种 : ( 设 备 )、 ( 配 置 )和 ( 字 符 串 )。 获取设备描述符 获取设备描述符如表 所列。 如图 所示,固件用设备描述符表的起始地址装载 字节的 。当 被写入后, 自动执行以下操作步骤: ①从 包中的字节 和字节 表 中的 和 )里 读 出 传 输 所 需 的 请 求字节数。 ②读被请求的描述符域长,以决定实际字符串的长度。 ③将步骤①中所需的字节数或步骤②中字符串的实际字节数中较小者送到 ,将 用作数据表索引,组成控制传输 个段中的第 段。必要时,分成 多个数据包完成数据传输。 ④自动检查错误,若需要,就重传数据包。 ⑤ 应答 控制 传输 的第 段(握 手 信 号段 ),以 终 止 操作。 表 获取设备描述符 可用于任何的 请 求( 例 如 取 描述符字符串),也可用于主机特定的请求。如果字节 和 字节 包含了传输所需的字节数 ( 见 上 面 的 第 ① 步 ),则 会自动进行操作。对于 请求也同样 如此。如果字节 和字节 没有包含传输长度(见上面的第①步),则长度可以明确地被装载 (见 节 )。 对于固件而言,手动进行控制传输也是可能的,可直接将各种包和使 段有效的数 据写入 缓冲区。这是很好的 训练,但不是必需的,因为对控制传输而言, 中已经有相应的硬件支持。 对于少于 字节的 段传输,数据被传送到 缓冲区,把字节数装入到 寄存器,相当于装载 。当然,这样会浪费带宽,因为 不需要把字节传输到 缓冲器。 获取设备限定描述符 获取设备限定描述符如表 所列。 表 获取设备限定描述符 设备限定描述符只用于有能力进行高速( )运行的设备中。它描述的信息是关 于设备的运行速度是否变化(例如,如果设备当前运行在高速情况下,设备限定描述符就会返 回设备如何运行在全速模式下的信息;反之亦然)。 设备限定描述符的处理与设备描述符的相同,固件装载相应的描述符地址到 : 剩下的由 完成。 获取配置描述符 获取配置描述符如表 所列。 表 获取配置描述符 获取字符串描述符 获取字符串描述符如表 所列。 表 获取字符串描述符 配置描述符和字符串描述符的处理与设备描述符的处理相似。固件读取 的字节 中的数据来确定哪个配置或者字符串被请求,再装载相应的描述符地址到 剩下的工作由 完成。 获取其他速度配置描述符 获取其他速度配置描述符如表 所列。 其他速度配置描述符只用于有能力高速( )运行的设备。它用来描述设备在其 他速度运行下的配置信息 (例如 ,如果设备当前运行在高速情况下 ,其他速度配置描述符就会 返回设备如何全速运行的信息;反之亦然)。 其他速度配置描述符的处理与设备描述符的处理相同。固件装载相应的描述符地址到 ,剩下的工作由 完成。 表 获取其他速度配置描述符 设置描述符 设置设备描述符、配置描述符、字符串描述符分别如表 表  设置设 备 描 述 符 所列。 表 设置 配置描述符 表 设置字符串描述符 固件通过清除 位( 写 入 来处理 (设 置 描述 符 )请 求,然 后直 接 从 缓冲区中读出描述符数据。 保留从主机传送到 的 字 节 数 ,并 将 该 数 与 字节 和字节 中的域长进行比较。当传输的字节数正确时, 就会自动对 段 控制传输的第 段,亦是最后一个段进行应答。 固件再控制传输 数据段)中控制数据的流向。在处理完每一个 包之后, 固件写入任意值到端点字节计数寄存器,以使端点再次可用。 配置 、接口和交替设置 配置、接口和交替设置示意图如图 所示。 图 配置 、接 口和 交 替 设置 一个 设备可以有一个或多个配置( ,但 在 任 何 时 候,只有 一 个 配 置 是有效的。 一个配置可以有一个或多个接口( ,它们可同时有效。多个接口允许对 的不同部分有相应不同的主机设备驱动程序。 每一个接口有一个或多个交替设置( ,每一个交替设置都是一个或多 个端点的集合。 这种结构是一个软件模型。当这些设置改变时, 不采 取措施 。当然 ,当主机 改变 了配置或者接口交替设置时,固件必须重新初始化端点。 直到固件被连接上,一个 配置)可简化成一个表明当前设置的字节参数。 主机发出一个 请求来选择配置,发出一个 请求来 确定当前配置。 设置配置 设置配置 )如 表 表 所列。 设置配置 当主机发出 请求时,固件保存配置 号(表 中的字节 ,值为 执行任何必要的内部操作以支持配置,最后清除 位(写入 来 结束 的控制传输。设置配置后,主机发出 命令来设定配置所包含的各种接口。 获取配置 获 取 配 置( )如 表 表 所列。 获取配置 当主机发出 数 : ,最 后 清 除 请求时,固件返回当前配置号并装至 ,装入 字节 ( 写 入 )来 结 束 的控制传输。 设置接口 设置 接口( 看似易让人混淆的 命令,实际上是为了指定接口的交替设 置( 。 设 备 可以 有 多 个 同时 发 生 的 接口 。例 如 ,一 个 拥 有 音响 系 统 的 设备 可 支 持 不同 的 采 样频率,图形控制面板支持不同的语言。每一个接口都有一个端点采集器。除了端点 ,每一 个用于设备控制的接口在各接口之间都不能共享。 在接口的描述符中可以报告交替设置。例如,音频接口可有 三种设置分别对应 和 的采样频率;面板接口可有 和 两种设置分别对应英语和西班牙 语。 请求在接口的各种交替设置中进行选择。 设置接口如表 所列。 表 设置接口 实际上是对接口# 的交替设置 固件通过执行以下几步对 请 求 作 出 回 应: ①执行要求的内部操作(比如调整采样频率)。 ②为接口中的每个端点复位数据触发位。 ③ 恢复 端点 至默 认状 态 ,并做 好 发送 或接 受数 据的 准备 。对 于 的 端 点,固件 需 清除 寄存器里的 位;对 于 的 端 点,固 件 需 写 入 任 意 值 到 字节计数寄存器。 清除 位( 写 入 )来结束 的控制传输。 获取接口 获 取 接 口( 当主机发出 位( 写 入 )如 表 所列。 请 求 时 ,固 件 只 是 简 单 地返 回 接 口 的交替设置,并清除 表 获取接口(实际上是对接口 获取交替设 设置地址 当 设备第一次被插上电源时,它响应设备地址 ,直到主机使用 请求给 其分配一个惟一的地址。 复制这个设备地址到 (功 能 地址 ),接 着 只 对该 地 址 的请求作出响应。直到 设备被拔下电源,或主机发出 复位 命令 ,或 主机 断电 之前, 这个地址一直是有效的。 寄存器是只读的。任何时候 进行重枚举(参看第 章)时,它都会自动地 复位 为 ,允许设备复原重新开始。 一个 程序不必知道设备地址,因为 只对主机分配的 地址值自动响 应。仅对于调试或诊断,设备地址才是可读的。 同步帧 同步帧 )如 表 所列。 表 同步帧 请求时用来建立一个时间标记,使主机和 设备能在同步端点上同步进 行多帧传输。 假设一次同步传输由从主机通过 传送到设备的 个 字节包的重复序列 构成,主机和设备均维持序列计数,从 重复计数,以保留在一次传输中包的信息。为了同 步启动,主机和设备都需要同时将它们的计数器复位到 在同一帧中)。 为 取 得 同 步,主 机 用 )发 出 请求。固件在将来某一时刻 用 字节的帧计数器值装载 来响应主机。例如,当前帧加上 ,把 帧 标记成同步帧,在此之间两边都会将它们的序列计数器值初始化为 。当前的帧数可从 和 两个寄存器中读取到。 用 这种 方法 可使 多个 同步 端点 同步 。固 件为 每个 端点 保留 一个 单独 的内 部序 列计 数器 。 关于 的帧 在 全 速( )模式下, 主 机 每 发出一个 )包。每个 包包含一个 位( 模 为 的帧号。在 时,固件使用 中断请求和向量为所 有的同步传输服务。如果 检测到一个丢失或者混淆的 包,它将使用一个内部计数 器自动产生 中断。 在 高 速( )模式下,每一个帧被分成 个 的微帧。虽然帧计数器仍为每一 帧增 ,但是主机每一微帧只发出一个 。主机和设备总是在指定设备对于 请 求的响应帧的零微帧同步,而对于其他任何微帧的同步上没有设置。 固件装载 端点 的协议提供了一个把特定制造商请求与标准设备请求结合在一起的机制。 域的位 对于标准设备请求设为 ,而对于制造商请求则设为 固件下载如表 所列,固件上传如表 所列。 表 固件下载 响应两个端点 的制造商请求: 下载和 上传。这些请求在所有方式下 有 效( 无 论 ,还 是 因为 包的第 字节的第 位规定了方向,所以在上传和下载请求只需要一个 的 值( 。这些 装载命令对于使用 芯片的任何 设备都是有 效的。 典型情况下,一个主机装载程序会写入 到 寄 存 器,以 使 的 复位状 态 ,装 载 代 码 到 的内部 的部分或全部,最后再次将 写 入 寄 存 器,使 退出复位状态。 表 固件上传 第章 和重枚举 枚举 引言 前面已经介绍了 芯片是一个以“软件”为主的架构,程序代码和数据被储 存在内部的 中,这些程序代码和数据可以通过 接口从主机加载。基于 的 外设可以不用 或者 存储器,这样既可以缩短产品上市的 时间,也可以很方便地更新固件程序,并对产品进行升级。为了提供这种“软”特性, 芯片能够自动以“无固件” 设备来进行设备枚举,从而使得设备能够自主加载程序代 码和描述符表。这个自枚举 设 备( 缺 省 设备)包含接口和端点设置,并且接收来自 主机的下载固件程序。 有两个独立的缺省 设备,一个用于全速设备( )的 枚 举 ,另 一 个则用于高速设备( )的枚 举。 能自动进行速度侦测、确定协议和选 择适合的缺省 设备。 一旦缺省 设备枚举开始,就从主机向片内  下载固件程序和描述符表, 则开始执行下载的程序代码,用电路模拟物理的断开和连接过程。此时 将再次进行设备枚举,称之为“重枚举”。在重枚举过程中,将重新根据第一次枚举时下 载的代码和描述对 设备进行重新定义。 在 内部有 个寄存器控制位,被称为 ,设备通过端点 请 求 ,由 位来控制决定是通过固件程序,还是自动地由缺省 设备来作为主体。当 时,缺 省 设备自动响应请求;而当 时,则必须由固件程序来处理。 启动模式 当 芯片脱离复位状态后,它能够以多种方法自主创立 设备。 上电行为模式依赖于如下多种因素: ①如果没有片外存储器(包括在 兼容总线上的,或者地址/数据总线上的)被连接到 上,它就枚举缺省的 设 备 , 其 中 描 述 符、 由内部硬 件逻辑提供(见表 。此时, 被设置为 ,表 示 缺 省 的 设备将自动处 理设备请求。 ②如果有一个包含了用户 值的 被连接到 上 的 和 引脚, 将和上面一样也枚举缺省的 设 备 ,但 是 ,所 不同的是它将用 中的 值来代替内部的默认值。此时, 必须包含 头字节用于向 指示这种模式,这种模式被称 为“ 加载”。如上所述, 被自动设置为 ,表示 缺 省 的 设备将自动处理 设备请求。对于 加载模式,一个 字节大小的 就已经足够了。 ③如果将一个包含有 固件程序的 连接到 总线(通过 和  引 脚连 接),固件程序 将从 自动下载到 芯片上的 将通过复位 后运行下载的程序代码。此时, 码值包含在固件程序中。 位自动设置为 ,用于表示由该固件程序来处理设备的请求,而不是缺省的 设备。 必须在第 字节写入 ,用于 表 示 处于这种工作模式,这种模式被 称为“ 加载”。虽然 能从最大为 的 中运行 加载程序,但程 序代码仅仅只能被下载到芯片上的 中。 ④如果有 或另外的存储器连接到 的 地址 / 数 据总 线 上 (只 有 引 脚封装有),并且没有含有上述要求格式的 ,同时, 引脚被置高电平(表示 从片外存储器起始代码为 开 始 执 行 ),则 从片外 存储器开始执行固件程序。在这种情况下, / 码的数值包含在固件程 序中。 位自动设置为 ,表示是这个固件程序处理设备请求,而非 内部逻辑。 工作在软操作方式时,上述的第 种 情形是使用最多的模式,因为从 得到的 码值总是绑定到与主机相应驱动程序的设备。显而易见 的固件程 序非常容易被更新。在这种情况下,主机首先使用 缺省 设备下载固件程 序 ,然 后 使 脱离复位,以便能够下载程序代码。 缺省 设备 缺省 设备由单一 配置构成,包含了一个接口(接口 和切换设 和 用于设备报告的端点和最大包长度如表 ( 全 速 )和 表 (高速)所列 注意:根据 协议的推荐规定,切换设置 不消耗中断或同步带宽。 表 缺省全速切换设置 注 :“ ”表示 表示双缓冲。 表 缺省高速切换设 注:“ ”表示 ”表示双缓冲 虽然 端点缓冲区的物理大小是 字节,但对于高速切换设置 ,它可以被声明为 字节。这样可保持同 协议相兼容,因为协议中只允许 字节的批量端点。如 果 使 用 这 一 缺 省 切 换 设 置( 用 于 测 试 ,用 于 例 程 ),则 应 确 保 包的的大小限制在 字节。 当 逻辑建立缺省 设 备(见 表 和表 时,它也同时设置了各端 点配置位,去配合描述符数据 例 如,在 缺 省 设备情况下运行批量端点 和 时, 逻辑被设置相应的 ( 端 点 有 效 )位 。 引导加载数据的形式 本节讨论 种 引导加载的方案,以及支持这 种 方案 的 这 种方 案是: 无 或 引 导 数 据 无 效; (仅加载用户 码); (加载固件至内部的 数据格式。 无 或 无效 在这种最简单情形下,无论当前是否有 连接到 总线,无论 中的 首字节是 还是 ,描 述 符 数 据 依 赖 于 电路内部的描述符表。 枚举为缺省 设备,其 字节如表 所列。 注意:即使没有 连接, 的 和 引脚也都要连接上拉电阻。连接两 个上拉电阻的目的是允许 内部逻辑检测“无 或 无效”的状态。 表 设备特性:无 或 无效 在枚举的过程中, 主机询问 缺省 设备,读设备的描述符,并且用如表 所列的 号确定哪一个驱动软件加载到操作系统中。当 设备插入主机时,与设备动态 匹配的驱动程序被自动装载,这是 的主要特性。 无 或 无 效 的 情 形是 最 简 单 的 配 置 ,也 是 最 受 制 约 的 。在 这 种 配 置 下,利用符合表 所 列的 码值和 软件工具配套,仅仅用于程序代码的开发,而不 适用于真正的基于 芯片设计的 外围设备。 引导加载 假设,上电复位, 检测到有一个 连接到 总线 上,并且 地址 的值为 (首字节为 ,则 将自动从 表 加载”格式 复制制造商 、产 品 )和设备 )到 内 部 存 储 器( 见 表 。然后, 将这些从 得到的字节信息提供给主 机,作为对主机 设备请求的响应。这 字节仅用来替换缺省 设备的 字 节。这样使得符合位于 内部的 码值,而并不是符合位于 内部的 码值的驱动程序,下载到操作系统( 中 。 在初始的枚举之后,主机驱动程序下载 的固 件程序和 描述符数据到 的 中 ,并 启 动 。随后, 将进行重枚举,枚举出对应的用户设备。主机端可加载新的驱动程序,但 要受限于刚刚加载的 这个 字节包含配置相应的位来控制如下内容。 总线频率:缺省为 断开极性:对于 脱离复位,缺省为连接到 通过控制寄存器相应位, 的固件程序能够改变 总 线 的 速 度 ,所 以 ,为 了 不考虑缺省设置, 不是必需的。然而,固件程序不能修改断开极性,如果想要 脱离复位时从 断开,则具有头字节位“ ”或“ ”的 必须连接。 导加载 假设,上电复位, 检测到有一个 连接到 总线上,并且地址 的 值 为 (首字节为 ,则 将 数据装载到内部 。同时 ,设 置 位为 ,这样就导致通过固件程序处理设备请求,代替缺省 设备。 加载” 数据格式如表 所 列 。 在表 中,首字节表示“ 加 载”,它指 示 将 数据复制到 中。 读 后面 的 字 节( ,这些字节在大多数“ 加载”应用中并不使用。 第 字节是在早期版本中的配置字节。 如果某些时候,用户需要以 来运行固件程序时, 加 载 ” 中的第 字节能够用 字节来加载 此时,用户使用 的 码 值,而不是内嵌的 公司的 码值。 表 加载 格式 一个或更多的数据记录被烧录到 的起始地址为 之后的单元中,每一个数据 记录由 位长度区域 组成 ,每 一个数 据记 录包括 随后 数据区 的长 度值 、数据 区的 位起始地址 以及数据区本身。 最后一个数据记录总是一个单字节 ,它用于加载到地址为 的 寄存 器 中 。 用 来标注最有意义的长度的位。通过下载,仅这个字节不太有意义的位是可写的。 这一位设置为 ,使得 脱离复位状态。 串行 数据只能够被装载到如下 个片上的 空 间 中: 地址的程序/数据 地址的数据 地址的 寄 存 器( 仅 当 位 是 可 加 载的 )。 的 总线控制器可完成两个目标:第一,就像在本章之前所描述的,它 用于管理串行 接口自动运行,在上电时决定枚举的模式;第二,一旦 开始工 作, 总线控制器就作为一般用途,固件程序能够对它进行存取操作。这使得对于基于 构成的系统,标准的 外围设备有了广泛的应用范围。 只要其他的 设备与本章描述过的串行 没有地址冲突,就都能通过连接 和 引脚添加。在第 章的相关内容中,将详细叙述 总线接口的一般特性。 配置字节 配置字节对于 加载的 和 两种格式都有效,具体的格式如图 所 示。 断开 侦测到 电压为高电平, 集线器或主机就检测到一个全速设备已连接。在 +与 电源之间连接了一个 的电阻,所以, 设备提供了这个高电平。而通常 +端 为低电平,在集线器和主机端由 的下拉电阻。 电阻下拉, 芯片内部就提供了这样一个 图 配置字节 通过向内部的 电阻加上和撤销 供电, 完成重枚举工作。当这 个提供的 电源 撤销后 ,主 机很快 就能 “看见” ,表明已经从 断开。之 后 ,当 又 被加 上时 ,则 表示 已经被重新连接到 。从主机端的角度 看, 不用物理断开,就能够完成 的断开和再连接操作。 的“ 连 接 状 态 ”是 由 所 谓 的 )寄存器位来控制的。这一 位 默 认 为 ,也 就是“ 被 连接 ”状 态。这 个 默认 状 态 可通 过 在 配置字节中的 位 置 复用。在 脱离复位之前,这一位被复制到 位。固件程序能修改这 一位。 总线工作频率 如果该位为 ,则 总线工作频率约为 ;如果该位为 ,则 总线工作频率约 为 。这一位被复制到 ,默认值为 ,或者说工作频率为 。一 旦 开始运行,固件程序能对这一位进行修改。 位 有一个 的控制位,被称为 ( 重 枚 举 )。通 过 缺 省 设备或者 固件,它决定在端点 上 的 哪 一 个 设备请求被处理。在上电复位中, 位( 为 ,表 示 缺 省 设备将自动处理 设备请求。一旦固件下载 到 并且 运行,它就被设置为 ,以便挂起设备请求通过下载固 件和描述符表来处理。在第 章中,叙述了当 时,固件程序是如何处理设备请求 的。 如果一个 引脚封装的 使 用 了片 外 代 码存 储 器 ,并 且 没 有引 导 用于提供用户的 和 ,那 么 就自动设置 位 为 ,以 便 设备 请 求总 是 由片 外 存储 器 中的 固 件和 描 述符 表 来处 理 。如 果 引脚接低电平,则在 加载”后, 也将 设置为 。在这种情况下,固件首先执行从 中加载到内部 的 程 序 代 码,同 时,固 件 处 理 所 有 的 请求。 现在来看看缺省 设备另外的用途。缺省 设备在系统上电时被建立,设置为可 下载固件到 内部 的一个 设备。缺省 设备还有另外一个有用 的特性: 代码能被写入,支持已经设定的一般的 设备。在引发 脱离 复位状态前, 自动使能某一个端点并向主机报告。通过采用缺省  设 备( 例 如,通过保持 ,固件能够用很少的代码来完成预设端点 传输,这就加速了 学习的进程。 表 列出了缺省 设备如何在 表 缺省 设备如何在 响应设备请求 时响应控制端点 的设备请求。 时响应控制端点 的设备请求 主机枚举是通过发出 实 现 的 ,其 中 和 设备将响应如下从主机来的设备请求: 设置或清除一个端点停滞 读对于这个端点的停滞状态( 设置/读一个 位配置数( 设置/读一个 位接口切换设置( 下载或上传 和 ( 为 )请 求 请求仅用于枚举过程。在枚举之后,缺省 ; 固件加载的 请求 设备重枚举的前期,主机下载数据到 的内部 。主机能够存取两个片 上 的 空间,即地址为 的程序/数据 区 ,以 及 地 址 为 的数据 区。无论 是处在复位还是运行阶段,主机都能对这些 区域进行下载和上传。这两个 空间也可通过连接在 总线上的“ 引导 加载。主机也可向 寄存器写入内容,使得 进入或脱离复位。 片 外 (只 有 在 引脚封装的 有相应的地址和数据线)不能通过主 机经“固件加载” 请求来下载和 上传。 协议提供了在控制端点 上发送的制造商特殊请求( 使用这一性能在主机与 的 之间传输数据。 自动响应两个“固件加载”请求,如表 和 表 所 列。 表 固件下载 表 固件上传 不管 个目的, 公司通过 位的状态如何,这些上传和下载请求总是由 处理。由于这 值 被保留 ,它不应当 被用于另 外一个 请求。 半导体 数值也保留 值 ,设备不应使用这些 值。 主机加载程序特定地将 部或部分 的 位。 寄存器(地址为 寄存器。 写入 寄 存 器 ,使 进入复位,用固件程序加载全 空 间 ,然 后 ,重 新 向 寄存器加载 ,使得 脱离复 是惟一一个能采用固件下载命令来写入的 固件程序重枚举过程 图 所示为 制重枚举的过程。 控制和状态)寄存器的 和 两个控制位控 图 控 制 和 状 态 寄 存器 为了模拟一次 断开,固件将 设 置 为 。 为 重新连接,固件将 清 。 在重新连接之前,固件设置或清除 位表示是固件程序还是缺省 设备在端 点 上进行设备请求处理。 如果 ,则是缺省 设备将处理设备请求;如果 ,则是固件程 序将处理设备请求。 多重 重枚举 能够在任何时刻执行设备的重新枚举( 能经过尝试不同的描述符数据与设备重枚举来对同步端点作最佳调整。 。而这是为了 每次 第章 中断 引言 中断体系结构是标准 单片机的增强和扩展版本。 中 断响应如表 所 列,其 中,非标 准 的中断源用粗体表示。 表 中断 在表 所列的“默认优先级”一栏表示 中断优先级别,其实 能将每一个中断进行优先级分配,不一定采用默认的优先级。 特殊功能寄存器 下面列出的是与中断控制相关的特殊功能寄存器( (见表 ; (见表 ; (见表 ; (见表 ; (见表 ; (见表 和 特殊功能寄存器提供中断使能和优先级控制,作为标准中断单元,这一点与标准 一样 。另 外 ,这些特 殊功 能寄 存器 也提供 用于 串行 端口 中断的控制位。 和 寄存器提供标志位、使能控制以及优先级控制。 表 寄存器 位功能 表 寄存器 )位 功 能 表 寄存 器( )位 功 能 表 寄存器 )位 功 能 表 寄存器 位功能 表 寄存器 )位 功 能 表 总结了 半导体公司的 与 公司的 单片机之间在中断实施中的不同点。从表中可以看出, 公司的 与 半导体公司的 单片机的中断设置很相近。 表 中断兼容性总结 中断过程 当一个使能的中断发生时, 完成当前正在执行的指令后,指向与该中断相 对应的中断服务程序( )的 地 址( 见 表 将执行 直到完成,除非在 此期间有另外一个优先级级别更高的中断产生。每一个 都以 指令来结尾(从中断 返回)。在执行了 后, 继续执行这条指令之后的固件程序,直到下一次中 断产生。 注 意: 是 ,或 者 对 于 一个附加的指令。 总是在中断服务程序运行前完成这条指令。如果在进程中的指令 或 的 写操 作,则 在中断服务前应完成 中断屏蔽 的 位是对于除 唤醒)中断外的所有中断总体使能位 (因为 总 是 被 使 能 的 )。当 时,每一个中断都被使能或者被它们特定的使能 位 所 屏 蔽;当 时 ,除 了 唤醒中断以外的所有中断都被屏蔽。表 列出了对应的 中断标志、使能、优先级控制和向量。 表 中断标志、使能、优先级控制和向量 中 断 优 先 级 可 分 为 两 级:分 配 优 先 级 和 自 然 优 先 级 。分 配 优 先 级 由 固件 程序设定;自然优先级是固定的,如表 所列。 分配中断优先级别(最高、高、低)可获得相应优先权,并涵盖所有自然优先级。 唤醒)中断总是具有最高分配的优先级,也是惟一一个总分配为最高优先级的中断,而 对于所有其他的中断则都是可以被分配成为高优先级或者是低优先级的中断。 除 了 可 以 分 配 优 先 级( 高、低 )外,每 一 个 中 断 都 具 有 自 然 优 先 级( 见 表 。如果具有分 配同样优先级的中断同时产生(例如,两者都是高),那么解决的办法就是根据它们的自然优先 级 来判 定 。例如 ,如 果 和 两 者 都 分 配 了 高 优 先 级,并 且 两 者 同 时 发 生 ,则 获 得优先权,这是由于它的自然优先级较高。 一 旦一 个中断正在响应,只有另一个分配了更高优先级的中断才能中断当前的中断服务 程序。也就是说,对于一个分配了低优先级别中断的中断服务请求,只能被分配了更高优先级 别的中断来中断。对于分配了高优先级中断的中断服务请求,就只能被 中断了。 中断检测 内部定时器和串口通过设置中断标志位来产生中断(见表 。这些中断每隔一个指令 周期检测一次,例如,每隔 个时钟周期检测一次。 和 两 个 都 是 低 电 平 触 发 ,通 过 特殊功能寄存器的 和 位 ,能 够 对它编程去改变其触发方式 是边沿触发,还是电平触发。当 时, 是电平触 发,并 且 当 引脚被检测到低电平时, 设置 标 志;当 时, 是 边 沿 触 发,并 且 当 引脚被检测到电平由高变低时, 设置 标志。 保留的 个中断( 和 总线中断)都只能是边沿触发, 和 为 高电平有效,而 则是低电平有效。 电平触发方式比较好理解,微处理器每个指令周期查询中断引脚,当发现引脚电平为低时 则触发中断。如果信号从 变为 ,一个周期后又变为 ,中断并不会被清除,直到中断执行完 毕 ,并 用 指令返回。但如果输入信号一直为低,那么将一直触发中断。当要求中断服务 的器件在中断服务结束一段时间后才释放信号线时,就会发生这种情况。这时,就会发现中断 被执行了多次,所消耗的时间比预期的要长很多。在这样的情况下,应使用边沿触发方式。 边沿触发方式就是,当外部中断引脚电平由高向低变化时,将触发中断。微处理器每个指 令周期查询中断引脚,当前一个指令周期使得引脚电平为高,紧接着下一个指令周期检测到引 脚电平为低时,将触发中断。像前面所提到的那样,这种方法适用于请求中断服务的器件在中 断服务结束一段时间之后才释放信号线时的情况,因为这时只有下降沿才会触发中断。如果 还想触发下一个中断,就必须把电平先置高。 为了保证边沿触发中断能被检测,中断引脚保持相应状态的时间必须大于一个指令周期 个时钟周期)。 中断响应时间 中断响应的时间取决于 当前的状态。最快的响应时间是 个指令周期, 其中, 个周期用于检测中断,另外 个周期用于执行对于 的 最大的等待时间是 个指令周期。这 个周期等待时间发生在 正在执 行的是 指令而其后的是 或 指令的时候。在这种情况下的 个指令周期中, 个用于检测中断, 个用于完成 个用于执行 或 ,而 另 外 个 用 于 执 行 这 个指令周期的等待时间不包括用于 和 中断的自动向量所需的等 待时间。自动向量还要添加固定的 个指令周期,所以,对于自动向量 或 中 断的最大等待时间,实际上应当是 个指令周期。 特殊中断 提供了 种 特殊中断,一个就是 同的 中断。 中断 中 断 ,另 外 种分属不 进入闲置状态之后,通过重新启动晶体振荡器和回复固件程序的执行,它 将响应在 引脚外部信号或 总线动作的回复。 在第 章的相关内容中详细描述了 的细节,并举出了一个使用唤 醒中断的例子。 中断 表 所列的是 个 辑 ,并 以 底 部 的 辑架构。 中断请求分享了 中断。图 所示的是 中断逻 为例,将其展开来,显示出每一个 中断请求的详细逻 表 特定的 中断源 续表 图 中断 如图 所示,每一个 中断源都有一个中断请求锁存器。 自动设置 了 位,固件程序通过向它写入 来清除 位。每一个锁存器的输出与中断使能位进行 “ 与 ”)运 算 ,而 所 有 其 他 的 中断请求源则进行 “ 或 ”)操 作 。 分配 中断优先级,并且构建出在 寄存器中出现的自动向 量,这个中断向量值 ]如 图 中所示的下边。 具有最高的优先级, 则是最低的 优先级。如果多个 中断源同时产生,则在 寄存器中会显示登记第一个优先级 的中断源。如果自动向量使能,则 字节将会取代 内存中的地址为 中 的内 容 。这 就 导致 了对 于 每一 个 中断源, 都会自动地指向不同 的地址。关于这一点 在 节中还要详细讲解。 由于在图 中 的 门,任何特定 中断源会设置 的“ 主 ” 中断 请求位( ,这 个 主 中断通过将 置 而使能。为了清除主 中断请求, 固件程序必须对 位清 在提供一个 中断服务后, 固件程序通过置 清除特定的 中断源 的 位 如果任何其他的 中断还未被确定,这个清除 的操作将会导致 产生针对更高优先级的、未确定中断的另一个脉冲。如果有更多的中断还未确定,那么 将会以图 中所示的中断优先级来提供中断服务,其中,以 (优先级 为开始作为 最高的优先级,而以 ( 优 先 级 )为结尾作为最低的优先级。 注意:这里的主 中断请求的清除,是通过对 位的清 操作来实现的;而每一 个特定的 中断,则是通过将 位 置 来实现清除的。 尤 其 要 指 出,在 任 何 中断服务程序( )中,非常 重要 的 是在 清 除特 定 中断请 求锁存前必须先清除主 中断。这是因为一旦 中断被清除后,任何未确定的 中 断将会立即尝试产生另 一个主 中断。如果这个主 位还没有预先被清除,那么 这个未确定中断将会被丢失。 下面这个例子说明了清除中断请求的次序很重要: (这里中断处理) ;首先 清除 中断请求 ;注 意 : 寄存器是非位寻址 ;现在 清除 中断请求 ;该 例 子 中 使 用 与特定 中断源相关寄存器的详细描述,可参考附录 以及第 章相关内容。每一个 中断源都有使能( )位 和 请 求( )位。固件程序通过设置 位为 去使能中断, 设置 位为 来请求一个中断,而固件程序清除 位也是向它写入 和 中断 和 通过控制端点 提供给 使用。图 说明 控 制传输的第一部分 设置阶段,其完整的控制传输 可参考第 章的相关内容 当 将 包 译 码 后 ,它 就 会 发 出 )中断请求。在 收到无误的 个字节并将其复制到 中 个内部的 寄存器后,就会发出 中断请求。 为了对 请求加以译码,通过读取 个 图 和 数 据 字 节 ,固 件 程 序 对 应( 参 考 第 章 相关 内 容 ) 当 中断作出响 中的 个寄存器要被复写时, 中断提前提供警告。这一点对于程序调试和编译出错信息来 说是非常有用的。 帧起始 )中 断 每当主机发送一个帧起始( )包 时 , 帧起始中断请求发出一次。在全速( )方 式时,帧起始( 每 发送一次 而在高速( )方 式 时 , 则是每 发送一次。 当 收到一个帧起始( )包 时 ,它 会 将 位 的 帧 值( 图 中的 )复 制 到 帧码低字节) 寄存器上,并且激活帧起始( )中断请求。通过帧起始( )中 断, 可接收到所有同步端点数据,而用户也可利用此 图 帧起始 )包 或 来作为计时与计数的功能。 挂 起( )中 断 如果 从主机侦测到一个“挂起”状态,它就认为是 )中断 请 求。挂起一再恢复信号的详细描述可参见第 章的相关内容。 复 位( )中 断 通过驱使 当 连线 检测到 和 保持至少 后, 总线复位动作时,就会激活 主机就发出一个总线复位信号。 中断请求。 中断 这个中断在主机允许以高速方式( 访问 中断 时被激活。 当 已经确认在端点 上处于控制传输的 段,该中断被激活。 端点中断 当一个端点请求服务时,端点中断就可以被激活。对于一个 端点,其中断请求意味 着 数据已经从主机发送,通过 确认,并且存入了端点缓冲区。 对 于 端点,中断请求表示之前由 加载的 端点缓冲区的数据已经被 读取,并且由主机确认后将会使得 端点缓冲区准备接收新的数据。 各端点中断如表 所列。 表 端点中断 )中 断 当主机向任何一个没有数据发送的 端点发送一个 令牌时, 自动地 对该 令牌进行 操作,同时激活该中断。 中断 这些中断只在高速方式( )操作期间起作用。对于 传 输,通过 实 行 机制, 改进了 的总线带宽。当主机想往端点发送 数据时,首先发送 令牌,看 端点 是否准 备好 了( 例如,它的 缓冲 区是 否为空 )。如果 缓冲区 是无 效的,则 返回一个 握手信号。 传输将持续发出,直到 缓冲区有效。在 此期间, 用 握手信号回答 ,同时主机发送 数据到端点。 当主机对端点进行 操作时, 中断被激活,同时由于没有有效的端点缓冲 区 ,所 以 用 来响应。 中断 这个中断在错误限制计数器超过了预设的错误限制极限时被激活。关于这方面的细节参 见第 章的相关内容。 中断 当一个 ( 同 步 )数 据 丢失或顺序错误时,或者当由于没有有效的缓冲区空间(用于 接收一个 包)而导致 包丢失或没有数据被有效地发送(从一个 缓冲区)时,则这 些中断将被激活。 中断自动向量 主要的 中断可分为 个中断源。为了节省程序代码和分类出 中断发生所处 理的时间, 提 供 了 第 二 层 的 中 断 向 量 ,称 为“ 自 动 向 量 ”。当 采 用 中断时, 将把程序计数器的值压入堆栈中,然后跳到地址 ,在 这 里 可 找 到 指 向 中 断服务程序入口的跳转指令。 跳转指令编码如表 所列。 表 指令 如果自动向量使能(在 寄存器中,设置 ,则 会用 字节(见 表 )来代替 地址上的字节。因此,如果程序员 预先将 地 址 上 跳 转 表 地 址 的 高 字 节(“内 存 页 码 ”) 加 载 ,则 在 地址上由插入的字节将会自动引导跳转 到本内存页内 个地址中的其中一个。在表 中 ,跳 转表包含一系列的跳转指令,每一条指令对应特定的 中断源 表 一个典型的 表 自动向量 译码 为了在 中断中应用自动向量,应当满足下列条件: 对于各种 中 断 服 务 程 序,将 地 址 中的跳转指令插入到跳转指令表中,并 确保跳转表起始限制在 字节页。 对于每一个特定的 中 断 服 务 程 序 ,用 跳 转 指 令 对 跳 转 表 进 行 译 码,以 字节的格式来呈现(以 为基数,具有设置为 的 。这 个 表 有 两 个 重 要 的 必 备 条 件: ①必须起始在内存页的边界上(地址为 ②跳转指令必须是 字节宽。 中断服务程序能够存放在内存的任何位置上。 )编写起始程序代码来使能 中断 和自动向量。 自动向量作用机制如图 所示。 图 自动向量作用机制 图 中所示的是服务端点 的 的作用机制。当端点 请求服务时, 会激活 中断请求,并指向 的位置。跳转指令就在这个位置上,最初的编码为 。由于 自 动 插 入 ,而 的值与 相对应(见 表 ,所 以 原 先 的 编 码 会 变 为 这样, 就会跳转到 ,在这里它执行跳转到 的 指令 。在 如 图 所示的例子中,地址 是任意设定的。一旦 指向 ,则 端 点 特定 的初始化过程只需要 个指令周期。 图 总线中断使能位和寄存器 总线中断 总线中断使能位和寄存器如图 所示。 使用了两个寄存器,即 控 制 和 状 态 )及 (数 据 ),这 两 个 寄 存 器 通 过 总线传送和接收数据。 总线接口控制器将在第 章中描述。 总线中断在如下的任何一种情况下将被激活: 位( 由 到 的跃变,发送对于另外的命令总线控制器准备好的信号; 位( 为了使能 )由 变 为 。 中 断 源 ,设 置 为 。同时,为了使得 中断源也使能,可以设 置 也为 。如果两个中断都使能,那么这两个中断源可由通过检查 总线寄存器 的 位和 位来确定。为了复位中断请求,必须向 写 。任何一个固件程 序 中 ,对 于 或 寄存器的读和写操作,都会自动地清除 总线的中断请求。 当 总线控制器正在产生 条 件 时 ,它 将 不 响 应 对 和 寄存器的存取操 作 。因 此 ,在 向 和 寄存器写入新的数据时,固件程序应检查 位是否为 。 中断 就像 中断由 个特定的 的 中断 源共 享的 。与 表 列出了针对这 个 表 中断源共享一样, 中断一样, 中断源的优先级和 特定的 中断源 中断也是由 个特定 中断能使用自动向量。 值。 当 中断源被激活时, 对它们区分优先顺序并且建立一个自动 向量。这些都显示在 寄 存 器中。 是最高优先级, 是最 低优 先级。 如果 两个 中断同时产生,那么优先级将是哪一个首先出现在 寄存器中呢?如果 自动向量被使能, 字节将替代 程序存储器地址为 单元的内 容。这样就使得 自动指向相对于每一个 中断源的不同地址。这 一机制的详细情况参见 节的相关内容。 应当着重指出,在任何 中断服务程序( )中,非常重要的是在清除特定 中断请求锁存前,必须先清除主 中断。这是因为一旦特定的 中断被清除后,任何未确定的 中断将会立即尝试产生另一个主 中 断。如果这个主 位还没有预先被清除,那么这个未确定中断将会丢失。 与特定 中断源相关寄存器的详细描述可参考附录 以 及第 章等相关内 容。每一个中断源都有它自己的使能( )位和请求( )位。固件程序通过设置 位为 去使能中断, 设置 位为 来请求一个中断,而固件程序清除 位也是向 它写入 注意:这里的主 中断请求的清除,是通过对 位的清 操作实现的; 而每一个特定的 中断,则是通过将 位 置 来实现清除的。 中断自动向量 主 中断由 个中断源共享。为了节省程序代码和分类出 中断发生所 处理的时间, 提供了第二层的中断向量,称为“自动向量”。当采用了 中断时, 将把 程序计 数器的 值压入 堆栈中 ,然后 跳到地 址为 的单 元,在这里可找到指向 中断服务程序入口的跳转指令。 跳转指令编码如表 所列。 如果自动向量使能(在  寄存器中,设表 指令 置 ,则 会用 字 节( 见 表 )来 代 替 地址上的字节。因此, 如果程序员预先将 地址上跳转表地址的高字 节(“ 内 存 页 码 加 载 ,则 在 地址上由插入的字 节将会自动引导跳转到本内存页内的 个地址中的其 中一个。在表 中,跳转表包含一系列的跳转指令,每一条指令对应特定的 中断源 表 一个典型 中断 表 自动向量译码 为了在 中断中应用自动向量,应当满足下列条件: 对于各种 中断服务程序,将地址 的跳转指令插入到跳转指令表 中,并确保跳转表起始限制在 字节页边界+ 上。 对于每一个特定的 中断服务程序,用跳转指令对跳转表进行译码,以 字节的格式来呈现(以 为基数,具有设置为 的 。这个表有以下两个 重 要 的 必 备 条 件: ①它必须起始在内存页的边界+ 上( 地 址 为 ; ②跳转指令必须是 字节宽。 中断服务程序能够存放在内存的任何位置上。 )编写起始程序代码来使能 中断 和自动向量。 自动向量作用机制如图 所示。 图 自动向量 作用机制 图 中所示的是服务于端点 满标志的 的作用机制。当端点 为满时, 会激活 中 断 请 求 ,并 指 向 的位置 。跳转指令就在这个位置 上 ,最 初 的编码为 。由于 自动插入 ,而 的值与 相对应 (见表 ,所以原先的编码会变为 这样, 就会跳转到 ,在 这 里 它 执 行 跳 转 到 的指令。在 如图 所示的例子中,地址 是任 意设定的 。一旦 指向 ,则 端 点特定 的初始化过程只需要 个指令周期。 第章 存储器 引言 中的存储器组成与标准的 单片机相似,但也有不同。其中有 个 独 立的存储区,即内部数据存储、外部数据存储和外部程序存储 个 区 。 对 于 ,外部存储器 不是必需的,本章对此将详细讨论。 内部数据 如图 所 示 , 内部数据 寄存器空间。低 和高 是通用 寄存器。 被分为 个独立的区域:低 、高 和 特 殊 功 能 ,特殊功能寄存器空间包含了 的控制和状态 图 内部数据 组织结构 低 内部数据 低 占据内部数据 的地址为 的 位 置,所 有 的 低 通用的 来存取,可以采用直接寻址或间接寻址。低 内部数据 还有如下的方法: 存储器都可作为 两区段的存取 地址 之间的区域包含了 个存储体,每个存储体有 个编号为 的寄 存器。当前的存储体是由在 特殊功能寄存器中的“寄存器选择”位( )来 选 定的,涉及寄存器 的程序代码只能在当前选定的存储体中存取。 地址 之间的区域是位寻址。无论是通过它们的位寻址( ,还 是通过涉及包含它的字节( ,在这个区段中的每一个 位都可以独 立寻址。 高 内部数据 高 位于内部数据 的地址为 的区域,所有字节都可以像普通 一样存取,但是,只能通过间接寻址。由于 的堆栈采用内部间接寻址,所以把堆栈放在高 内部数据 区是个好的想法。这样就能释放更加高效存取的高 ,使它更加通用。 特 殊 功 能 寄 存 器 ( )空 间 特殊功能寄存器( )空间就像高 内部数据 一样,位于内部数据 的地址 为 的区域。 通过存取两个区不同的寻址模式,来保持 空间与高 内 部数据 区 独 立: 只可用直接寻址存取,而高 内部数据 则只可用间接寻址 存取。 空间包括 控制和状态寄存器。关于 ,可参考附录 在地址分别为 的 个特殊功能寄存器可以位寻址。在这些 寄存器中,每一个 位都可以独立寻址,无论是通过它们的位寻址( ,还 是 通 过 涉及包含它的字节(如 外部程序存储器和外部数据存储器 对于外部存储器,标准 采用哈佛结构,程序存储器和数据存储器在物理层面上分开。 对这种模式进行了改进,片外程序存储器和数据存储器相互分开,但是,片内程序存储器 和数据存储器则是标准的冯 诺伊曼结构。这就允许 的片内 可以由外部源(如 或 )来 加 载 ,然 后 被 当 作 程 序 存 储 器 来 使 用 。 标准 对于程序存储器和数据存储器,标准 有相互分离的地址空间,能寻址只读程序存储 器 ,地 址 为 ~    。另外, 读/写数据存储器的地址也是 。标准 通过采用不同的总线信号对它们进行存取操作的方式,从而将这两个存 储器空间进行了分离。它的程序存储器的读选通信号是 程 序选通使能),而数据存储器的读/写选通信号是 和 内核生成的 选通信 号用于读取指令和 指令(移动程序代码存储器中的数据到累加器中),生成的 和 选通信号用于所有的数据存储器存取。在标准 应用中,外部 芯 片( 通 过 的 信号使能)能用于程序存储器,外部 芯 片( 由 的和 信号使能)能用于数据存储器。在标准 中,所有的程序存储器都是只读的。 有 字节片内 片内 ( 称 为“ 主( (称为 “临时( ,地 址 为 ,地址为 ,并且还有 。虽然这个 在片内是实际存在的,但是,通过外部存储器的 固件,只能当作外部 芯片 操作。 在某些系统中,仅使用片内 ,而不使用片外存储器。在这种系统中, 和 选 通信号自动组合完成存取,寻址空间为小于 的 单元 地址 。因 此 ,主 可以当作数 据存储器和程序存储器来存取操作。 和 选通信号不用于临时 的组合选通, 临时 只能当作数据存储器来用。 虽然在技术上可以准确地说主 数据存储器是可写的,但主 的程序存储器则 是不可写的。这只是为了区分,并没有实际的不同。主 可作为程序存储器和数据存储 器 来 读 / 写 ,所 以 向 主 数据存储器的写操作与向同一地址的主 程序存储器中的写 操作是相同的。而临时 则不能作为程序存储器来进行存取操作。 同时也保留了 的数据地址空间,用于控制和状态寄存器 以及端点缓冲区。 注意:只有数据存储空间被保留,在 区间的程序存储器并没有被保留, 所以 引脚的 能够存取在这一区域的片外程序存储空间。 和 引脚 引脚和 引脚的 芯片没有增 加片外程序存储器 或数据存储器的手段 ,所以 ,主 必须既作为程序存储器,也作为数据存储器。为了达到这一目的, 用 和 选通信号的逻辑“或”来对主 进行读操作,以确保程序存储器和数据存储空间不重叠。 这是系统设计者的责任。利用现有的大多数 编译器,可通过使用目标代码连接器来指示代 码,并将数据模块放在独立的区域中。 引脚 对 于 引脚的 器的管理是依靠 ,可以增加片外的程序存储器和数据存储器。这个增加的片外存储 外部存取)引脚的状态来控制的。 在这种情况下,主 可作为程序存储器,也可以作为数据存储器来存取,这一点与 引脚和 引脚的 相同。 为了消除与主 的 冲 突 ,无 论 是否对地址为 的存储器区域进 行存取操作,片外存储器的控制存取引脚( 和 引 脚 )都 停 止 工作。这就使得在没有要求增加外部逻辑的 存储 器芯片 ,禁止 对片内 的低 进行 存取操作。 注 意: 和 信号是独立有效的。由于它们在 的 内 部 ,所 以 外部程序和 数据空间不由它们共同作用。 当程序代码在片内 的 区域时, 引脚不被激活。当程序代 码从程序存储器 区域读取时, 引脚将被激活。 在这种情况下,所有的程序存储器都是在片外的,而所有的片内 (包括主 )都 只是数据存储器。 仅用 选通信号来读取所有的片外 和 的组合作用将被禁止,所 以,片 内 只 能作 为数 据 存储 器 。所 有的 程序 存 储器 都 是在 片外 的 ,此 时 ,不 禁止 存取 片 外程序存储器的低 ,而 任 何 代 码 的 读 取 都 将 激 活 引脚。 在加电复位后, 立即开始执行在片外程序存储器从地址 开始的代码,这个操 作优先于等待 加载或 代码下载的完成。 存储器分配 图 所示的是带有片外存储器和数据存储器的 引脚 的存储器分配图。 引 脚 和 引脚的 芯片不能存取片外存储器。这两种芯片的整个存储器分配图只包括 图 的左半部分,即 内部对应栏。 片内存储器由 个 区 组 成: (主 ; (临时 (寄存器/缓冲区 上传/下载, 引导访问。 图 外部程序/数据存储器 分 配 图( 的主 占 用 程 序 存 储 器( )和 数 据 存 储 器( ,其地址为 字节的临时 占 用 数 据 存 储 器( ,其 地 址 为 。而 的控制/ 状态寄存器和端点缓冲区则占用数据存储器( ,其 地 址 为 当片外存储器与 连接时,存储器区段的间隙由外部存储器来填充,而不是由片内 来填充。由于低 存储器是由片内程序/数据存储器占用,且高 由片内数据存 储器占用 所以,在这个区域,片外存储器不能被激活。不过,将片外存储器的数据移到这些区 域还 是安 全的 ,其 原因 下面 将详 细分 析 。 图 的中间一栏,也就是表示 数据存储器的部分,由 和 选 通 信 号 来 激 活; 而最右边的一栏,则表示 程序代码存储器部分,由 来激活。 数据 存储 空间的 “中 间” 可用外部存储器填充,这是由于它与 数据存储器的 高 、低 不冲突。为了允许 与 连接, 控制它的 和 选通信 号 ,阻 止 高 、低 用于 片外 存取 。因 此 , 能够与 连 接 ,并 且 其 高、低 自动被禁止。 同 样 ,当 程 序 存 储 器( 由 选通)被连接到 当 时 ,低 就自动 拒绝片外代码的读取,以避免同 内部的片内代码存储器发生冲突。 图 和 图 中带有“ ”号标志的一栏,表示该存储器区域可以用以下 个 的特 资源来存取。 上传/下载, 引导访问。 图 外部程序/数据存储器分配图( 设 置 数 据 指 针; 由 上 传 或 下 载; 从 总线上的 进行程序代码引导。 图 所示的是当 引脚接高电平时的 引脚 的存储器分配图 。与图 所不 同 的 是 ,主 只是数据存储器,而不是程序/数据结合的存储器。这就允许片外程序存储 器包含所有的 的固件程序。在这种配置中,在上电复位后, 就能从片外存储器立即 开始执行程序代码。 程序代码的执行从地址 开始,该地址是由复位向量来定位的。就像图 一 样,片外数据存储器被部分禁止,以确保片外数据存储器与片内数据 不发生冲突。 在这种模式下,要特别注意检测外部 存储器或其他程序存储器的存取时间。 可 以延 长它 的 和 选通信号,用于补偿低速数据存储器,但是它不能延长其 信号 而适应低速程序存储器。在 时钟频率下,一个外部程序存储器芯片必须具有约 或更短的存取时间。 冯 诺伊曼片外程序存储器和数据存储器 引脚封装的 提供 位地 址总 线、 位数据总线和存储器控制信号 和 。这些信号被用来扩展 的外部程序存储器和外部数据存储器,或者其中之一。 就像上面所描述的一样, 控制 和 信号禁止选择片外数据存储器,该数据存 储器的区域由片内存储器占用。 信号也是有效的,该引脚用于连接片外程序存储器。 在一些系统中,就像 片内程序/数据主 组合形式一样,也可采用片外程序存储 器和数据存储器的组合形式。这些系统必须将 和 选 通 信 号 逻 辑“ 或 ”,从 而 用 于 限 定它们是片外存储器芯片使能信号,还是输出使能信号。为了在设计中节省正常情况下是必 需的外部逻辑电路, 提供了两个附加控制信号,即 和 。与这些低电平有效的信号 相同的组合信号有: ; + 因为 和 信号已经通过片外存储器的地址分配被限定了,所以,只有当 存取片外存储器时,增加的选通信号 和 的选通才被激活。 片内数据存储器( 图 所示的是对于地址为 的片内数据 存储器分配图。 字 节临时 有效,地址为 ,它 只 是数 据 ,程序代码不能从这个数据 中运行。地址为 的 字节 保存了 个波形描述符用于 。 图 中的地址为 的阴影区包含了 的控制和状态寄存器。 存储器块 和 是被保留的区域,它们能用作数据存储。 剩余的 包括端点缓冲区,这些缓冲区无论作为可寻址的数据 (经 指 令 ),或是 作为 一个 (经 自动 指 针),都 是 可 存取 的。 图 地址为 的 片 内 数 据 存 储器 第章 和电源管理 复位 复位 芯 片有 以下 种内部的复位方式: 上 电 复 位( ,由 引 脚 控 制 ,使 进入已知状态。 复 位 ,由 内部核心逻辑控制,当 的 引脚被 激 活 时 , 复位总是激活的(例如, 总是被复位所控制)。 协议定义了一个 总线复位。为了使每一个设备的 功能为已知状态, 总线复位是通过 主机在总线上进行初始化的一个条件。 本章将讨论这 种复位的作用和功能。 上电 复位( 上电后,外部电路瞬间产生一个低电平,通过低电平有效输入引脚( 引 脚 )将 使 得 芯片复位。 注意:通过电源加电或者在 引脚上加复位信号,无论两种情况的哪一种,都可以 在上电复位( )期间引起复位初始化。 为了确保初次加电时 保持复位直到操作性能( 电压、晶体频率、 频率等)达到稳定, 引脚一般都连接到一个外部的 网络 。对于 一般推荐构成的 网络方法为:用 电阻连接到 端,一个 电容接地 ,具体的连接方法参见图 。通过下拉 引脚电平,在任何时候外部逻辑都能够 强制上电复位。无论什么时候,只要给 引脚加复位信号, 内核都将使 复位。 只要一加电, 引脚、晶振以及 就立即工作。一旦 脱离复位,对于应用 在不需要 引脚输出信号的情况下,例如, 传感应用等,固件程序可通过清除控 制 位( )来 禁 止 引脚的输出。 当 引脚为低电平时, 信号有输出。但是,当 引脚返回到高电 平时, 引脚的信号是否输出将由 是否工作在低功耗的“挂起”状态来 决定。如果工作在低功耗的“挂起”状态,那么 就停止输出。  总线作用的重枚 举或者 或 引脚的激活(如果它们 被使能),都将使得 重新开始发送 时钟频率信号。而晶体振荡器和 的输出不受 引脚状态的影响。 对于所有的 寄存器位的上电缺省值,可参见附录 的相关内容。在上电 图 复位 复位时,将产生下列情况: 端点数据缓冲区及字节计数值没有被初始化。 时钟频率设置位 保持复位状态, 引脚有输出。 所有的端口引脚都被设置为通用的输出引脚。 中 断 被 禁 止,并 且 请求被清除。 批量 和 端点未配置,它们的停滞位被清除。当 复位时, 将 和 令牌。 端点的 位被清 位 被清 ,这意味着是缺省 设备而不是固件程序对应的设备将响应 设备请求。 功能地址寄存器被清 。 端点被设置为缺省 设备。 中断自动向量被关闭。 配 置 和切换设置 处于有效状态。 释放 复位 寄存器位 用于 的复位。这一位在上电过程中被置 ,最初保持 处在 复位状态。在以下 种情况中, 位能够被清 ,使得 从 复 位 状 态 释 放 出 来: 通 过 主 机 ,当 下 载 执 行 到 最 后 一 步 时; 在 加载结束时(假设 编 程 正 确 无 误 ); 当使用外部 引脚通过 电阻接高电平),并且此时没有“ ”或 呈现时。 注 意: 固件程序不能通过将 位 置 来使得 进入复位状态, 位只能读。 下载 一旦进行了设备枚举,主机就能用“ ”制 造商请求,将程 序代码下载到 的 中(参见第 章的相关内容)。最后一个包被加载后,将会把 写入 寄 存器 中,使得 从复位状态中释放出来。 加载 关于 引导加载的细节可参考第 章的相关章节内容,这里不再重复。上电时, 检测 总线上的 是否存在,如果检测到了,那么它就读 的首字节;如果读到的首字节是 ,则 中。 在“ ”加载的最后操作中,将 写入 从 下载固件程序到内部 寄 存 器,使 得 从复位状态中 释放出来。 在“ ”加载后, 将 位置 ,所以,此时固件程序将可以响应 设备请求。 使用外部 引脚的 能够使用片外程序存储器( 引 脚 和 引 脚 的 由于没有地址和数据线引出,所以不支持这种方式)。在此存储器中,可存储 程序代码以及描述符信息,其中也包括 字节信息。因为这样的系统不需 要 总线 提供 ,所以,当有下列情况同时发生时, 的 将从复位状态自动释放出来: 引脚被拉高(表示使用片外程序存储器); 在 总线上,没有“ 被检测到。 在两种情况下, 也会将 置 ,所以固件程序也将可以响应 设 备请求。 复位的影响 在任何时候, 主机都可以通过下载 到 寄存器来使 复位,而主机可 以做诸如为加载程序代码的堆栈事先做好准备等事情,有效地扩大了 的 容量。在这样的应用背景下,了解 在 复位期间和复位之后的状态是十分 重要的。本章引出了一种特殊的复位方式,被称为“ 复位”。这样就不会把它与电源上电 复 位( )相 混淆了 。在 此 ,只 讨论 芯片上电后,以及当 通过主机将 置 而复位这两种复位情况。 对于基本 设备的配置,在 复位后依然保持不变,使用的端点依然有效, 的 功能地址也保持不变,而且 端口同样保持配置和数值。 端点依然是停滞的,没有 改变, 位不受影响。在 复位后,受到影响的只有如下几个方面: 中断被禁止,但是未定的中断请求仍然处于未定状态。 当 脱离复位时,未定的中断仍然保持未定,但是会被禁止。这样,可以给固件编 程人员在 复位前来处理 事件的一个选择。当然,也可通过清除未定中断来 忽略它们。 端 点条 件( 被清除。 在 在复位期间,如果在总线上检测到一个挂起条件,则 入挂起状态。 总线复位 将自动进 主机会通过驱动产生 状 态(数 据 线 + 和 都 为低 ),而且 至少 达到 的时间 来送出一个 总线复位信号。 感知到这个条件,请求 中 断( ,并 且向 复位提供中断向量。在 总线复位后,将发生如下情况: 位被清 设备地址被复位为 ; 如果缺省 设备是启用的,那么 配置和切换设置被复位为 将与主机重新达成协议,进入高速( )方 式 。 注 意:在 总线复位后, 位是不变的。因此,如果一个设备已经进行了重枚 举 并且 加载 了新 的 特性 ,那 么通 过 总线复位,它就会保持这一新的特性。 的“ 断 开 ” 虽然没有严格意义上的一个“复位”,但是,用于设备重枚举的断开 再连接这一系列动作 对 的影响却与其他复位方式的影响一样。当 用电路模拟了一 次断开 再连接之后,就会有如下的情况发生: 端点 位 被清 除; 数据 被置 功能地址被置 如果缺省 设 备 被 启 用 ,则 表 是对复位的总结。 配置和切换设置被复位为 。 表 各种复位操作的影响 续表 注 :“ ”指未 变化。 电源管理 主机能挂起一个设备,使设备进入低功耗模式。当 发出挂起操作信号时, 执行一系列步骤,由固件程序关断外部电源消耗子系统,然后再关断 的晶振,进入一个低 功耗模式。一旦挂起, 就会通过 总线恢复作用,或者对两个 引脚之一提 供激励来重新唤醒。 理解挂起、恢复、闲置和唤醒之间的区别是非常重要的,下面分别讨论这些概念。 挂起 挂 起( 是一个通过检测 总线上 ”状态出现而得到的从主机或集线器 发往设备的请求。当进入低功耗挂起状态时,就由主机发出这个请求。 设备响应了这个 请求后,就请求进入低功耗模式。 同时, 提供 一个被称之为 的 寄 存器,在 总线上,无论 条件是否存在,只要向它写入一个任意值,都将使得 进入被挂起的状态。 恢复 恢 复( 是从设备向主机发出的一个信号,请求主机脱离低功耗挂起模式。 只能由上报了配置描述符信息的 设 备来 发送 。如 果通 过 该设 备且 主机 已经 使 能了远程唤醒功能,那么它就支持这种远程唤醒功能。 闲 置 所谓闲置 就是 低功耗状态。通过设置 寄存器(电源控制寄存器)的 位, 固件初始化这种模式。为了严格地与 协议中挂起电流规定适应, 的振荡器 必须停止。在 位被设置之后,振荡器将在符合以下条件时停止工作: 在总线上的 条 件 存 在 ,或 寄存器已经被写入了内容; 两个 引脚或者被禁止,或者为假。 当 接收到一个唤醒中断时,就退出闲置状态。 唤醒 唤 醒( )是一种机制,这种机制包括了重新启动 振荡器以及激活一个中断,迫 使 退出闲置状态和重新恢复程序代码的执行。 认可 种唤醒源,一个来自 本 身( 当 总 线 激 活 恢 复 时 ),另 外 两 个 来 自 设 备 引 脚( 和 进入和退出其闲置状态是独立于 作用之外的。换句话说,在任何时候 都 能进入闲置状态,即使当 没被连接时。闲置状态是用中断“被吊挂进入” 的机制。当 有 无活动时 ,就有一个中断自 动产生 , 固件程序可响 应这个中断,进入闲置状态,以降低功耗。如果 是在闲置状态,则当 个唤醒源中的一个 被激活时,就产生一个唤醒中断。 响应这个中断,退出闲置状态并恢复程序代码运行。 一旦 被唤醒,其固件程序就可通过设置 寄存器(地址 中的 位来发送 的 请求。这个设备必须具有以下能力: 在其配置描述符中,被告知远程唤醒能力; 已经授予使用远程唤醒的能力。 为了适应 协议的规定,在唤醒中断之后,固件程序应等待 ,然后设置 位 ,等 待 ,最 后 清 除 它 。 图 列举了实施 挂起 恢复的 逻辑,详细解释见 节 。 图 挂起 恢复控制 挂起 挂起流程图如图 所 示。 在总线闲置( )状态达到 时 , 设备就认为有一个挂起( 当 检测到这个条件成立,它将激活 中 断( 和 挂 起( 向 量( )。 )请求产生。 )中 断 图 挂起流程图 在总线上检测到挂起条件时,如果 处于复位期间,则 将自动关闭它 的 晶 振( 并 保 持 处于复位状态),直至一个被使能的唤醒源激活。 总线闲置状态不等同于从 断开的状态, 状态的意思是 的电压比 的要高。 通过如下的操作, 固 件 响 应 挂 起 中 断: 运行 任一 必需 的事务 管理 ,如关 闭外 部功 耗设备; 设置 寄存器 这些动作使得 进入了低功耗的挂起状态,符合 协议要求。 在任何时刻, 的固件程序都能够迫使芯片进入低功耗模式,甚至不需要在 总线上检测到 的“ 状态也可以。这种“无条件挂起”的功能在应用中是非常有用 的 。这 就 使 得即 使 从 总线上断开,它也能进入低功耗模式。 为了 无条件地进入其低功耗模式,在设置 位之前,固件程序只要 向 寄 存 器( 在 简单地写入任意的值就可以实现。 唤醒/恢复 唤醒/恢复流程图如图 所示。 一旦进入低功耗模式,就可以有如下 种方法来唤醒 由 的 引脚来进行 激 活; 引 脚 激 活; ( 唤 醒 )引 脚激 活。 图 唤醒/恢复流程图 这 个唤醒源可通过设置在唤醒控制和状态寄存器中的 独立使能,如图 所示。 和 位来 图 唤醒和状态寄存器 唤醒引脚的优先级用 和 位来设置, 表示低电平有效;而 表示高电 平有效。 寄存器中的 个位使能 个中断源 保 持“ 使能 是 数据线中的一个,另外一个是 唤醒使能)使能 引脚,而 ,唤醒 使 能 )使 能 引脚。 当 芯片在 为真时检测到 上有 动作,或者 或 为真时 在 或 引脚有一个由假到真的转换时,它将激活唤醒中断。 状态位 和 指明了哪一个唤醒引脚产生了唤醒事件。激活的唤醒引脚(根据它 们规划的优先级)设置相应的位。如果唤醒是由 激 活的 恢复 操作 而产 生的 ,那 么这些位就没有一个会被设置,引出的结果是第 个 源 ,即 总线复位,并将引发唤醒事 件 。 固件程序通过给 和 写 来清除它们的标志。 当唤醒事件发生时, 重新启动它的振荡器,而且在 锁相环)稳定后,它就生成了 一个中断请求。无论 是否连接 ,这些情况都可以发生。唤醒中断是一个专门的中 断,而且就像许多其他的独立 中断一样,也不是通过 来共享的。 唤醒中断向量的地址为 ,具有最高中断优先级。它通过 来使能,其 标志在 为 唤醒中断服务程序清除中断请求标志(用“位清除”指令,例如: ,然后 执行 一 条 ( 中 断 返 回 )指 令 。这 导 致 继续执行设置 进行初始化低功耗操作的一条 指令之后的指令。 当 设置 为 时,它就进入闲置状态。对于标准 而言,任何一个中断发 生都能使它退出闲置状态。然而, 不是这样,它只支持唤醒中断来退出闲置状态。 在不存在挂起条件时,例如, 没有发送挂起信号,而且固件程序没有向 寄 存器写内容。此时,如果 被设置了,则唤醒中断将立即激活。 恢复(远程唤醒) 控制和状态寄存器如图 所示。 图 控制和状态寄存器 固件程序设置 位向主机远程唤醒请求发送。为了符合 协 议 标 准 ,固 件 程序应在唤醒中断之后等待 ;然 后 设 置 位 ,等 待 ;最 后 清 除 它 。 保持任意一个 引脚处于激活状态(由规划的优先级决定),从而制约 芯片 为了进入挂起状态而关闭振荡器。 缺省 设备不支持远程唤醒,只是在内嵌配置描述符的第 字节中枚举时,支持远程 唤醒。 引脚功能与通用 引脚 共用。不像其他复用 引脚采用配置寄存器 和 )去选择切换功能, 和 功能是同时激活 的,除 非 使 能 功能不会受到影响(通过设置 位 为 来 使 能 )。如 果 被用 作唤醒引脚,则应确保 设置为输入( ,是 默 认 状 态 ),以 防 止 也操作该 引脚。 引脚的双重性允许 进入低功耗模式,然后周期性地自我唤醒。这是通过 连接在 引脚的 网络来实现的。如果 引脚设置为默认优先级(高电平有 效 ),则 电 阻( )连 接 到 ,电 容( )接 地 。 固件程序执行如下步骤: ①对于在 引脚上的高电平有效的优先级,设置 为 ②设置 为 ,用 于 使 能 唤 醒 ③通过设置 ,使 能 唤 醒 中 断 。 ④设置 为 ,然 后 设 置 为 。这样就使能 输出并将 置低电 平,使得电容放电。 ⑤设置 为 。这样将使得 引脚悬浮,此时通过电阻可对电容充电。 向 寄存器写入任意值。当固件程序设置了 就将无条件地停 止振荡器工作。 设置 为 。这个动作令 进入闲置状态。 在电容充电完成达到逻辑高电平后,唤醒中断经由 立即发出。 在唤醒中断服务程序中,清除 唤醒中断请求标志),然后执行 指令。这 样将恢复在第 步之后的指令程序执行。 固件程序检查执行的所有任务,如果没有一个被请求,它就能够重新进入闲置状态,再 从第④步开始。 通过选择连接在 引 脚 的 网络时间常量,接通/断开(工作/挂起)占空比可设得 非常小,所以 芯片能够工作在非常低的电源电压情况下。 第章 介绍 引言 的 是一个增强的 ,对于它的全面了解,应当结合其他章节的内容。本章介 绍其处理器、与 逻辑的连接以及与标准 的不同点。图 是 的 内核 的方框图。 图 方框图 的改进 采用标准 结构设置,所以它支持工业标准 编译器和汇编程序。然而, 上指令的执行比标准 更快,其特点如下: 取消了空闲的总线周期,一个指令周期仅用 个时钟周期,而标准 则为 个时 钟 周 期; 的 时钟频率为 或 ,使得其时钟速度比标准 增加了 倍 。 除了速度的提高 的 还进行了如下的改进: 增加 了第 个数 据指 针; 增加了第 个 增加 了第 个 位 定 时 器( 具有非多路复用的 位地址总线的高速外部存储器接口; 增加 个中断( 和 采用适应高速和低速 外设的可变 时 序; 增加了两个自动指针(自动增量数据指针); 带向量的 和 中 断; 为 工作 带宽设置的带速定时器; 具有 个唤醒源的休眠模式; 总线控制器运行频率为 或 专用的特殊功能寄存器 将 控制传输设置和数据部分分离; 时钟频率可在 和 中 选 择; 增加了端点设置; 增加了 口 的读和写选通。 性能综述 设计为 个时钟周期执行一条指令,以增强其性能;而标准 则为 个时钟周期执行一条指令,如图 所示。这样就缩短了总线时序,改进了指令执行的效率。 单字节、单周期指令时序 图 与标准 的时序比较 大部分指令的运行速度是标准 对应指令的 倍。 与标准 相比, 内核的某些指令需 要不同的指令周期数。在标准 中,除了 和 指令外,所有其他的指令均在 或 个指令周期内完成。 在 的 内 核 中 ,指 令 在 个指令周期完成,整 个指令的平均速度是标准 的 倍。表 列 出 了 与标准 的速度比较。 表 在相同时钟频率下, 与标准 的速度比较 软件兼容性 的 内核与工业标准的 单片机的目标代码兼容,即用工业标准 编译器 和汇编生成器产生的目标代码在 上兼容,并且功能相同。然而,由于 采用与标准的 不同的指令时序,所以带有定时循环的现有代码需要修改。 的指令时序与 半 导体公司的单片机 是一样的。 与 的特性比较 表 提供了 与几种普通的 单片机的特性比较。 表 和其他几种普通的 单片机的特性比较 与 的不同 虽然 类似于 的硬件特性及指令周期时序,但是它们之间也存在一些重要 的区别。 串行口 不执行串口帧错误检测,在多机通信时也不执行从地址比较,所以 也不对 和 等特殊功能寄存器进行操作。 定时器 不采用定时器 下行计数方式或者下行计数使能位( :位 ),同 时 , 也 不采用定时器 输出使能( )位( :位 ,因 而 ,在 中, 也没有 采用。 定时器 溢出输出在一个时钟周期内激活。在 中 ,定 时 器 溢出输出为 占空比的方波。 虽然 位在 中不出现,但定时器 的输出仍然可以经 位来使能 或禁止,这是因为 引脚位于复用的端口 上 。如 果 ,则 配 置 该 引 脚作为通用的 引脚并禁止定时器 输出;而如果 ,则配置该引脚为 引脚并使能定时器 输出。 定时存取保护 没有设置定时存取保护,因此,也没有设置 特殊功能寄存器。 看门狗定时器 没有看门狗定时器电路。 电源错误检测 没有设计电源错误检测电路。 端口 的 端口与 相比有着显著的不同,主要表现在大多数的 引脚采用 切换功能共享,详见第 章相关内容。 中断 虽然, 的基本中断结构与 相同,但其 中有 个中断源是不同的,如表 所列。详细情况参考第 章相关内容。 表 与 中断的不同点 寄存器接口 外围设备逻辑 等)是经设置存储器映像寄存器和地址为 的缓冲区来控制的。这些寄存器和缓冲区的构成如下: 波 形 描 述 符 表; 通用配置; 端点配置; 中 断; 输 入 和 输 出; 控制; 端 点 操 作; 端点缓冲区。 这些寄存器及其功能将在后面的章节中陆续描述,对于每个寄存器的详细描述可参见附 录 内部 内部数据 的结构如图 所 示 。 类似标准 包含 字节的内部数据 (地址为 )以及部分占用 空间(地址为 。附加的 字节间接寻址存储器(有时被称为 ,也使用 的地址空间。 所有芯片内部的其余 ,包 括 程 序 / 数 据 存 储 器、批 量 端点缓冲存储器以及 控 制 寄 存 器 ,被 当 作 片外存储 图 内部数据 器来寻址。 固件程序用 )指令来读或写这些字节数据,即使 和 寄存器设置确实是在 芯片的内部。附加在 的地址和数据总线的片外存储 器(只有 引脚封装有)能通过 指令来存取。 的逻辑对它的存储器选通和选择 信 号( 和 )进行译码,不需要外部逻辑来区分片内和片外存储空间。 端口 实现的 端口功能不同于标准的 ,关于这一点的详细内容可参考第 章 相关 内容。 具有 个 位双向 端口,每一个端口都与一对寄存器相对应。 寄存器:设置对应的 个端口引脚的输入/输出方向 为输入, 为输出)。 寄存器:写入到 的呈现在被设置为输出的引脚上的端口值,无论是输入还是 输出设 置,从 读到的值都是与 个端口引脚的状态对应。 大部分 端口引脚都具有切换功能,可采用配置寄存器进行选择。当对应一个 端 口引脚的切换配置被选中时,相应的 位就被忽略。所有 端口的默认状态(上电复位) 为切换配置关闭,所有的 端口引脚配置为输入。 中断 所有标准 中断,包括新增加的中断, 都支持。表 列 出 了 的中断。 表 中断 使用对于 个不同的 中断的 。为了有助于确定中断的激活, 提供 了被称为自动向量的特性,通过在 向量地址的 指令来动态改变地址指针。这个第 级向量传输控制权到相应的 中断服务程序( 。关于 中 断 系 统 ,包 括 自 动 向 量 全部描述可参考第 章的相关内容。 电源控制 实现的低功耗模式允许它使用由 协议中规定 总线提供的电源电流不小于 式机制的细节,可参考第 章的相关内容。 供电的设备以及其他低功耗设备, 。关于 进入和退出这种低功耗模 特殊功能寄存器 的设计应尽可能与标准的 代码相兼容,从而允许使用现有的 软 件开发工具。新增加的 特殊功能寄存器如表 所列,其 中,标准 特殊功能寄存器 由正常印刷体表示,而 新增 加的 特殊功 能寄 存器用 粗体 表示 。关于 特殊 功能寄 存器 的详 细内容参见附录 表 特殊功能寄存器 注:表中所有没有标注的部分为保留项。 外部地址/数据总线 引脚封装的 提供了外部、非多复用的 位地址和 位数据总线。这一点与标准 不同。在标准 中采用的是通过复用 引脚的 个 引 出源: 口 、外部 数据总线 和外部地址总线的低 位字节。 使用外部存储器的标准 系统要求有一个非多复用的地址锁存器,通过 的地址 锁存器使能 )引脚选通。在 芯片中则不需要外部锁存器,所 以也就不需要提供 信号。另外,为了去除外部锁存器,非多复用 总线在每一个存储 器存取操作中保留了一个周期,并且允许外部存储器在没有提供 引脚时连接。 是惟一的总线主控制器,为片外存储器提供读/写信号,地址总线只能工作在输出 状态。 复位 详细内容参见第 章 。 第章 输入和输出 引言 引脚封装的 提供了如下两种输入/输出系统: 一组可编程 引脚; 可编程 总线控制器。 和 引脚封装的 又提供了两个可编程 接 口,这 部 分 内 容 在 第 章将详细描述。 引脚可设置为通用 接口,也可设置为交替功能( ,如 地 址 和数 据、 数 据、 、定时器及中断信号等。本章将描述在通用设置中引脚的用途 以及可以被设置为交替功能引脚的方法。 本章也将提供 总线的编程信息 及 引导加载的操作细节。引导加载器的 作用已在第 章叙述过。 端口 端口的实现方法与标准 有所不同, 有多达 个 引脚双向 端 口,分 别 记 作 和 。独立的 引脚被标记为 ,这 里 表示端口( ,而 则表示引脚序号( 。图 所示的是 引脚的基本结构。 和 引脚封装的 提供全部 个 端 口 ,而 引 脚 封 装 的 只提供端口 和 每一个端口都对应如下一对寄存器。 ( 输 出 使能)寄存器:用于设 置 个引脚中每一个引脚的输入/ 输出方向(这里 为 或 = 输 出 , 输 入 ),如 图 所 图 引脚的基本结构 示。 ( 端 口 数 据 )寄 存 器:写 到 中的值呈现在被设置为输出的引脚上,从 中读 到的值是 个引脚现在的状态,这时不管输入/输出设置,如图 所 示 。 其中大多数 引脚具有交替功能,它由配置寄存器来选择见表 。每一个交 替功能是单向的,这时 “知 道”这 个功能 对应的 功能是 输入的或 是输出 的 ,所 以当一 个补 充配置被选择为一个 引脚时,则相应的 位被忽略,如图 和 图 所 示 。 默认(上电复位)所有 端口的状 态为: 交 替 功 能 配 置 关 闭; 所有 引脚配置为输入。 图 端口 寄存器 图 端口 寄存器 端口交替功能 每一个 引脚都可以设置成一个交替功能(例如,非通用 ,这 些 交 替 功 能 由 各 种 不 同的配置寄存器来选择。对于交替功能输出的 引脚逻辑与其输出稍微有一些不同,如 图 和图 所示。 图 所示的 引脚的交替功能总为输出。在图 )中 , 引脚被配置成通用的 。在这 种配置中 ,其交替 功能没有连 接 ,引脚 功能的为 正常功能 。在图 中, 引 脚配置为输出交替功能。在这种配置中,  输出缓冲没有连接 引脚,所以向 和 的写操作不会影响 引脚。然而,从 的读操作继续工作在正常情况, 引脚 (以及交替功能状态)总是有效的。 通用 配置 图 交替功能为输出时所对应的 )交 替 功 能 配 置 引脚逻辑 通用 配置 交替功能配置 图 交替功能为输入时所对应的 引脚逻辑 图 所示的 引脚的交替功能总为输入。在图 中, 引脚被配置成通用的 。交替功能输入与图 中所示的交替功能输出之间有着重要的不同点,即其交替功能 输入在此从不连接,它们总是听者。 如果交替功能的中断使能了,则在 引脚上的信号可触发该中断。如果引脚仅用于通 用的 ,那么交替功能的中断必须被禁止。例如,假设 引脚被设置为通用 由于 作用为输入,该引脚信号也被发送到 的内部 逻辑电路。如果 中 断 使 能 了,则 引脚上的信号将触发 中断。如果 这些是不 需要的,则 中断应该 被禁止。 当然,这个效果在确定情况中能够起到作用,例如,在 情况中,即使 引脚 被 配 置 为 输 出( 如 也能触发一个 中 断,因 此 的固件程序能够直接 生 成“ 外 部 ”中 断 。 在图 中, 引脚被设置为一个交替功能的输入状态。就像用交替功能的输出一 样, 输出缓冲没有从 引脚连接,所以向 和 的写操作不会影响到 引 脚。然而,从 的读操作继续正常工作, 引脚的状态(即使对于交替功能的输入)都是有 效的。 端口 的交替功能 对于端口 引脚的交替功能是通过 个寄存器中的对应位来选择的,如表 口 的交替功能配置如表 所 列。 表 选择端口 交替功能的寄存器位 所列。端 注 :虽 然 交替功能由 的位 来选择,但是此功能不呈现在引脚 表 端口 的交替功能配置 上,而呈现在引脚 上。 注: 当 )虽然 如果 被 配置 为交替功能 时,它最好继续作为通用输入引脚使用 的交替功能 经由 寄存 器来选 择,但是,除非 输出的状态是不确定的 和 都设置为 ,那么 任务的优先级在 之上。 端 口 和端口 的交替功能 当 时 ,则 所 有 个端口 的引脚被配置为补充配置( 数据 。如果 任意 被设置为 位 模 式( 由 在 寄存器中的 位),则所 有的 个端口 引脚也就配置为补充配置( 数据 ,如表 所列。 如果所有的 位 被清 例如,所有的 个 都工作在 位 模 式 中 ),则 即 使 端口 的 个引脚也可被用来作为通用 引 脚 。 表 选择端口 和端口 交替功能的寄存器位 表 端口 交替功能配置 表 端口 交替功能配 端口 的交替功能 通过设置 能 ,如 表 和 表 寄存器中的对应位,每一个端口 所列。 表 端口 交 替 功 能 配置 的引脚都可独立配置为交替功 表 选择端口 交替功能的寄存器位 注:虽然端口 交 替 功 能 :由 寄存 器来选 择,但是,除非 : ,否 则 输出状态是不确定的。 端口 通过设置 功能。如果在 如何设置, 不考虑 的交替功能 寄存器的对应位,每一个端口 的引脚都可独立配置为一个交替 寄存器中的 位 被设 置为 ,那么不管 引脚就自动配置为 状态引脚 。换 句 话 说 ,就 是 ,如表 和 表 所 列 。 表 选择端口 交替功能的寄存器位 表 端口 交替功能配置 注: 如果 )虽 然 被设置为 ,那么这些设置 就不被考虑,并且 将全部被自动配置为 的交替功能 是由 寄存器来选择的,但是,除非 输出状态是不确定的。 表 所列出的是端口 引脚功能的 选择,其中有些列出的信号不随 表 端口 引脚功能的 选择 状态引脚。 ,否 则 改变。 续表 注:粗体标出的信号不随 改变,为了完整表达特列出 总线控制器 总线控制器使用 )和 ,并且完成如下两个功能: 用于连接 外围设备的通用接口; 从串行 引导加载。 在 和 引线上要求连接上拉电阻。特别注意,即使在 总线上没有连接任何 设备,也必须连接这两个上拉电阻。也就是说,每个引线应当通过 电阻连接到 总线频率默认约为 。它也能被配置成默认频率的 倍,当然,此 时连接 到总 线上的设备应当能够支持这个更高的频率。 连接 外围设备 图 所示的是 传输 的波形。 和 漏极开路 引脚,它们必须由外部电 阻上拉到 只是作为 总线的控制器,这意味着它通过在 产生的时钟脉冲进 行同步数据传输。一旦主控制器驱动 到低电平,外部的从设备就能保持 处于低电 平,从而延展了时钟周期。 为 了同 步 数据,仅当 是低电平时允许串行数据( )改 变 状 态;当 为高电 平时,串行数据必须有效。这条规定的两个例外的情况是产生 和 两个条件。 图 普通 传输 条件是这样定义的: 处于高电平时, 下降到低电平; 的定义则为: 处于高电平时, 上升为高电平。数据首先发送最高位 ,在传输最后一位时(即 图 中的第 个 时 钟 ),主 控 制 器( 释放 引线,允许从属设备下拉 到低电平, 用于响应传输。 仅作为一个总线主控制器,而不是一个从属设备。可以通过检测 来侦测 与第 个主控制器的冲突。 每一个在 总线上的外围设备都有惟一的地址。 总线传输的第 字节包含所需的 外围设备的地址,图 给出了第 字节的格式,有时它也被称作控制字节 图 设备寻址 如图 所 示 , 发送位序列,用一个独特的地址来选择外围设备,并确定传输的方向 (用 ,而且通过 测试确定外围设备是否存在。 高 位( 是外围芯片的从地址。 设备根据设备类型预先分配好地址,例如从 地址 是分配给 的 。 还 有 个 位( 通常用来反映 设备地址引脚的 状态,与设备的 个引脚相关联,允许给同类设备分配 种不同的地址。 第 位( )设置数据的传输方向, 为主控制 器读; 为主控制器写。绝大多数地址传 输 后 ,跟 一 个 或 多 个 传 输 数 据,在 最 后 一 个 数 据 字 节 传 输 完 成 后 ,产 生 条件。 在图 中, 传输紧跟地址字节(在第 个时钟周期,主控制器将 设置为高电 平 ,表 示 读 )之 后 。在 第 个时钟周期,外围设备通过确认 信号响应该地址。在第 个 时 钟周 期 ,主 控 制 器释 放 ,并 发 出 脉冲信号,锁存由从设备提供的 数据。 寄存器 图 所 示的 个寄存器被用于管理 总线上的传输, 通过读/写 与 总线进行数据传输。 寄存器控制 的传输并报告各种状态条件, 配置总线。 控制位 ) 当 数据字节。在 时,下一个写入 操 作将 产生 起始 条件 ,紧 接着 的是 期 间( 图 中的第 个 时 钟 ), 位自动清 寄存器 则用来 连续的 图 寄存器 ) 当 时,产生停止条件。如果当 位被设置时总线处于闲置,那么 条 件立 即产生 。另外 ,在 当前传 输的 阶段之后, 条件成立。在完成 条件后, 位将自动被清除。 当 总线控制器产生 条件时,它将不考虑对 和 寄存 器的访问 。因 此在向 或 写入新的数据之前,固件应当检查 位是否为 一个中断请求为有效,发送 条件完成。 主控制器通过悬浮 线并在 线发送时钟脉冲来读数据;在每读了 位后,它将 拉低一个时钟来检测 。为了发送多字节传输中的最终字节,主控制器在 时刻 悬浮 指示从设备停止发送。 当 时, 将在下一次读传输后悬浮 线。 位在传输结束时 (在 时 刻)被清 除。 设置 不会自动产生一个 条件。在读传输结束时, 位也应被设置。 状态位 在一字节传输后, 更新 和 个状态位。如果没有 条件被 传 送 ,则 它 们 在 时刻被更新;而如果有一个 条件被传送,则它们将在 之后 被更新。 ) 只要完成了一字节传输, 就设置该位。当设置了 位时, 也产生一个中断 请求。当 寄存器被读或写时, 位被自动清除,并且只要 或 寄存器 被读或写,中断请求位就自动被清除。 ) 写传输的每第 个 ,从属设备需要通过激活 来接收字节。在此期间, 悬浮 ,采 样 线,并用侦测值的补码来更新 位。 ,表示有应答;而 表示无应答。 对于在总线上的读传输, 位应被忽略。 ) 该位用于指示总线错误。 表示总线上有冲突,原因是当外部设备对总线进行了 驱动,而此时是不应该有操作的,或者当另外的总线主控制器赢得了优先权,并且得到了总线 的控制权。当一个总线错误被侦测到时,当前的传输就立即被取消, 将 和 悬 浮,并且总线控制器被禁止,直到在总线上侦测到 条件。当固件读或写 寄存器 时, 将自动被清除。 清除 位(通 过 访 问 )不会自动重新使能总线控制器。一旦总线发生错误,总 线控制器在 条件被侦测到之前将保持禁止。 )和 这两位通过引导加载器来自动设置,表示引导 的地址方式。它们通常仅被用 于调试。 发送数据 为了发送多字节数据记录,要经过如下步骤: ①设置 ②向 写外围设备的地址和方向= 对 于 写 )。 ③等待 。如果 ④用数据字节加载 或 ,则转向步骤 。 ⑤等待 。如果 或 ,则转向步骤 。 对于每一个字节,重复步骤④和⑤,直到所有的字节传输完成。 设置 接收数据 为了读取多字节数据记录,要经过如下步骤: ①设置 ②将外设地址和方向= 用于读)写入 中。 ③等待 ,如 果 或 ,则 通 过 设 置 结束。 ④读 并放弃数据。这表示 个 脉冲的第 个瞬时脉冲作为从从属设备来的 第 字节的时钟。 ⑤等待 如果 ,则通 过 设 置 结束。 从 读数据。这表示另外的读传输。 如果 内容。 被使能,则每一次“等待 ”的步骤可通过中断服务程序进行中断驱动和处理。详见第 章有关 对于每一个字节,重复步骤⑤和 ,直到准备读第 到 最 后 一 字 节 。 在读第 到最后一 字 节 之 前,设 置 从 读数据。 ,这就在总线上初始化最终字节读操作。 等待 。如果 ,则通过设置 来结束。 设置 在设置 位 后 ,从 立即读最后的字节。这就重新得到最后一个数据字节, 而不用在 总线上初始化一个额外的读处理 个或更多的 脉 冲 )。 引导加载器 只要 经复位引脚获得复位信号,其引导加载器就检查 总线上的现有 如果有一个 被检测到,加载器就读这个 的首字 节来决定 如何枚举 (确定 是由硬件连线 信息或者是从 读 。几种枚举方式在第 章中有详细描述。 引导加载器支持如下两种 类 型: 使 用 位内部地址,从属地址为 的 (例如, 和 ; 使用 位内部地址,从属地址为 的 (例如, 和 容量为 。 字节的 仅要求单字节地址就够了,而容量更大的 则要求 双字节地址。 必须判定是那一类 连接上了,是单字节还是双字节地址,这样才 能完全读取 使用 设备引脚 和 来决定是发送单字节还是双字节地址。如 表 所 列,单 字 节 地 址 的地址必须搭接为 ,而双字节地址 的地址 则必须搭接为 表 搭接引导 地址线的具体值 该 没有驱动地址引脚。 在确定了连接的是单字节或是双字节地址 后, 在 和 中报告其结 果 ,如 表 所列。 只要附加的 设 备( 从 地 址 为 搭 接 为 或 者 ,它们就可以作为一般 用途连接到 总线上。 为一种特例,这是由于它响应所有 种 设 备地 址 。如果 一 个 被用于引导加载,则不可能有另外类型从地址为 的 被使用。 表 上电复位 测试结果 第章 定时/ 计数器和串行接口 的定时/计数器和串行接口与标准的 单片机非常相似,但也有一些差 别和改进。本章提供了对定时/计数器以及串行接口的配置和使用的详细技术资料。 定时/计数器 包括 个定时/计数器(定时器 、定时 器 和定时器 。每一个定时/计 数器可以工作在基于 内 部 时 钟( )的时钟频率,或者工作在由 引脚(定时器 引 脚( 定 时 器 或 引 脚( 定 时 器 所提供的时钟事件计数器方式。定时器 和定时 器 可以被用于串口的波特时钟生成(详细情况将在下面叙述)。 可配置工作在 或 。在定时器模式中,定时/计 数器和 运行在同样的速度下,并且不受 和 配置位( 和 )的 影 响 。 每一个定时/计数器由一个 位的寄存器组成,可由软件通过两个 访 问: 和 ; 和 ; 和 。 与 的兼容性 定时/计数器的执行类似于 半导体公司的 表 半导体公司的 。在表 中 ,总 结 与 之间在定时/计数器执行中的不同。 定时/计数器 运行比较 定时器 和 定时器 和 有 种操作方式,可通过 (见表 和 这 种方 式是: 位定时/计数器(方式 位定时/计数器(方式 位带自动重装计数器(方式 两个 位计数器(方式 ,仅对定时器 表 寄存器 位功能 (见表 控制。 表 寄存器 位功能 续表 方式 位定时/计数器 定时器 和定时器 方式 的操作如图 所示,定时器 和 定 时 器 相同。在方式 中,定时器被配置为 位 计 数 器 ,使 用 或 的 位和 或 的所有 位。定时器在 中的使能位( 启 动 定 时 器 。 位选择定时/计数器时钟源:来自 或者 引脚。 图 定 时 器 的方式 和 只要 位为 定时器由选择的时钟源开始计数;而当 位为 时,还取决于相 应的中断引脚 或 )是 否 为 当 位计数从 ( 全 )加 时,计数器循环溢出到全 ,在 中的 ( 或 )位 被置位,并且在 (或 )引脚产生一个时钟周期的高电平。 在方式 中, 或 的 高 位是不确定的,应当被忽略。 方式 位定时/计数器 定时器 和定时器 在方式 中,定时器被配置为 位 计 数 器 。如 图 所 示 , 寄 存 器( 或 的所有 位都被使用。当 计数加 时,计数器溢出到全 。除此之外,方式 和方式 的操作相同。 方 式 :具有自动重装的 位计数器 定时器 和 定 时 器 在方式 中,定时器被配置为一个 位计数器,在溢出时,它具有自动重装起始值功能。 (或 用于 计数,并且 或 存储重装值。 如图 所 示 ,方 式 计数器控制与方式 和方式 相同。当 从 累加时, 储存在 中的值被重装到 图 定时器 的方式 方 式 双 位计数器 仅定 时器 在方式 中 ,定 时 器 作为两个 位计数器使用。对于定时器 ,选择方式 就能简单地 停止定时器 如图 所 示 , 配 置 成一 个 位的计数器,由定时器 的控制位控制。由 位决 定 是计算 除以 或 除以 的周期,还是计算 引脚上的由高到低的变化。 能用于使计数器由 引脚使能控制计数。 是个单独的 位计数器,然而 仅仅计算 除以 或除以 的周期 。定 时 器 的控制位和标志位( 和 由 使用。 当定时器 工作在方式 时,通过定时器 的使用受限,定时器 可用于波特率发生器。 定时器 的计数值一直保存在 和 寄存器中。 当定时器 工作在方式 时,通过定时器 的方式位控制定时器 ,设置定时器 工作在 方式 或 ,以打开定时器 。 设 置 到 方 式 将关闭定时器 。定 时 器 的 位和 位 对 定时 器 有效。因此,定时器 可以计算 或 ,或者计算 引脚 上的 由高到低的变化。当定时器 工作在方式 时,定时器 的 功能也是有效的。 图 定时器 的方式 定时器速率控制 定时器默认每 个 周期累加一次,就像标准 一样。使用默认的速 率允许现有的应用程序代码操作正常,并与实时性相关,如波特率。 在应用中,如果要求具有快速性,则可设置定时器为每 个 周期进行累加,就 此可通过设置在地址为 的特殊功能寄存器的时钟控制寄存器( )中的位来实现, 如表 所列。 每一个定时器的速率可独立设置,并且这些设置不会影响计数器方式。 表 )定时器速率控制位 定时器 定时器 只运行在 位方式,提供了几个在定时器 于定 时器 ,有效的方式如下: 位定时/计数器方式; 带俘获的 位定时/计数器方式; 带自动重装的 位定时/计数器方式; 波特率发生器方式。 和定时器 中没有用到的性能。对 与定时器 相关的特殊功能寄存器有以下 种。 :定时/计数器 控制寄存器。其各位的功能如表 :当 定 时 器 被配置为俘获方式时,用于俘获 时器 配置为自动重装方式时,作为 位重装值的低字节( :当 定 时 器 被配置为俘获方式时,用于俘获 时器 配置为自动重装方式时,作为 位重装值的高字节( 位计数的低 位 。 位计数的高 位 。 所列。 值;或者 当 定 值;或者 当 定 表 寄存器 位功能 表 为定时器 方式控制总结。 表 定时器 方式控制总结 注 : 表示任意的。 定时器 带俘获的 位定时/计数器方式 图 显示定时器 工作在带可选俘获功能的定时/计数器方式。 位决定 位 计 数器是用 周 期 ,还 是 引脚上的高到低变化进行计数。 为计数器使能控制。当 计数器值从 累加计数时, 标志置位, 引脚产生一个 周期的高电 平脉冲。 定时器 俘获方式(见图 与 位定时/计数器附加的俘获寄存器和控制信号方式 相同。 在 中的 位使能俘获特性。当 且 时, 引脚上由高到低的电平变换导致定时器 的值装入俘获寄存器 和 图 定时器 带俘获的定时/计数器方式 定时器 带自动重装的 位定时/计数器方式 当 时 ,定 时 器 配置成自动重装方式,如图 所 示 。计 数 器 输 入 的控 制 与 其他 位计数器方式相同。当计数器值从 累加时,定时器 置 标志 ,并 重装 和 的起始值。程序软件必须将起始值预装入 和 寄存器。 当定时器 工作在自动重装方式时,如果 ,那 么 引脚上电平的由高到低 的过渡将强制定时器 预装载。 定时器 波特率发生器方式 设置 或 将配置定时器 ,产生串口方式 或 的波特率。在波特率 发生器方式下,定时器 工作在自动重装方式,如图 所示。然而,计数溢出被用来产生串 口移位时钟 ,以代替置 标志。像正常的自动重装方式一样,溢出还引起将预装在 和 寄存器的起始值重装载 和 寄存器。 当 或 时,定时器 被强制预装载 ,并忽略 位的 状态 。当 时,定 时 器 作为接收波特时钟源;当 时 ,定 时 器 作为传输波特时钟源。 图 定 时 器 带自动重装的定时/计数器方式 当工作在波特率发生器方式时,定时器 不 设置 位。在这种方式下,如果仅通过 来使能,则一个定时器 中 断 只 可以 通 过 引脚上由高到低变化的电平设置 位来产生。 波特率发生器方式中的计数器时间基准是 。为了使用一个外部时钟源,应 设置 为 ,并在 引脚上接上要求的外部时钟源。 注意:在 引脚上的外部时钟源的最大频率为 图 定时器 波特率发生器方式 串行接口 提供两个串口。串口 与标准 串口的操作几乎完全相同,依据被配置的方式, 它的波特时钟源可以是 或 、定 时 器 、定 时 器 ,或者是高速波特率 发生器。除了定时器 不能用作串行口 的波特率发生器外,串行口 与串行口 相同。 每一个串口都可工作在同步或异步方式, 产生串行时钟。对同步方式,串口工作在 半双工方式;对异步方式,串口工作在全双工方式。对所有方式, 双倍缓冲区接收保持寄 存器中的数据,允许 在软件读取前一个值之前继续接收下一个字节。 每一个串行口都有 种工作方式,如表 所列。 表 串口方式 注:高速波特率发生器提供 或 的波特率。 与串口相关的寄存器如下(其中寄存器 和 也包含串口以外的功能)。 :位 ,串口 速率控制 (见表 :串 口 控 制( 见 表 :串 口 传输/接收缓冲。 :位 ,串口 速率控制 (见表 :串 口 控 制( 见 表 :串 口 传输/接收缓冲。 :方 式 和 的波特率时钟源(见表 中的 和 :高速波 特率 发生 器使能(参见 小 节 相 关 内 容 )。 表 位 表 寄存器 表 位 表 寄存器 续表 与 的兼容性 串行接口的执行类似于 半导体公司的 半导体公司的 。表 与 在串行接口实施的不同点。 表 串行接口执行比较 总结 高速波特率发生器 组合了一个高速波特率发生器,它能够提供 和 的波特率。 其两个串口都有此功能,不论 的内部时钟频率是多少( 或 对于串口 ,高速波特率发生器可通过设置 为 来使能 而对于串口 ,则 可通过设置 为 来使能。 寄存器各位的功能如表 所列。 当 被使 能时 ,高 速波 特率 发生 器默 认为 波 特 率 。对 于 串 口 ,为了选择 的波特率,则设置 为 ;而对于串口 ,则设置 为 。 表 寄 存 器( )位 功 能 当高速波特率发生器对于两个串口都使能时,则两个串口就不能使用定时器 作为它们 的波特率时钟源。因此,对于方式 和 ,允许的波特率时钟组合如表 所列。 表 对于方式 和 所允许的波特率时钟组合 方式 串口方式提供同步、半双工串行通信。对于串口 ,在 引脚上输出串行数据, 在 引脚接收串行数据, 引脚提供发送和接收状态下的移位时钟。而对于串口 相应的引脚为 和 串口方式 波特率为 或 ,这 由 位(或对于串口 是 的状态决定。当 时 ,波 特 率 为 ;而 当 时 ,波 特 率 为 。 方式 的操作与标准 相同。当一条指令写到 或 时 ,数 据 开 始 传送。 位 移 数 据 ,最 低 位 在前,按 照所选 的波 特率发 送,直到 位二进制数值被 移出。 当在相应的 中的 或 位被设置并且 或 被清除时, 方式 数据开始接收,移位时钟有效,并且 在每一个移位时钟的上升沿移位数据,直到 位被完全接收。在第 位被移位后的一个机器周期内,设置 或 ,并 停止 接 收,直到软件清除 位。 图 显示 串口方式 在 低 速( )和高速( )操 作 下 的发送和接收时序。图中所示的串口 信号名为 和 。串口 的 和 的时序信号也是相同的。 图 串口方式 接收时序(低速操作) 图 串口 方式 接收时序(高速操作) 在方式 的低速和高速工作中,当 的时钟上升沿到来之前,在两个 周 期, 上的数据被采样。 图 串口方式 发送时序(低速操作) 图 串口方式 发送时序(高速操作) 方式 方式 提供标准异步、全双工通信,共有 位 : 个起始位, 个数据位和 个 停 止 位。 对于接收操作,停止位被存入 或 。接收和发送的数据位最低位 在前。 当定时器 使用 默 认 )时 ,方 式 的操作与标准 是一样的。 方式 波特率 方式 波特率是定时器溢出的函数,串口 可 以 用定 时 器 或定时器 产生波特率,而串 口 只能用定时器 产生波特率。假如它们都使用定时器 ,则两个串口运行在相同的波特 率下。如果串口 用 定 时 器 ,而串口 用 定 时 器 ,则两个串口运行在不同的波特率下。 每次定时器从最大数(对定时器 是 ,而对定时器 是 )加 时,一个时钟发 送到波特率电路,时钟经过 分频后生成波特率。 当使用定时器 时, 或 位选择定时器 的溢出率是否被 整 除 ,因 此 ,选 用 定 时器 时,波特率由以下公式决定: 波特率 定 时 器 溢出 当使用 定时器 时,波特率由以下公式决定: 波特率= 定 时 器 溢出 为了使用定时器 作为波特率发生器,一般最好采用定时器 方式 带自动重装的 位 计数器 虽然每一种计数器方式都可以采用)。在方式 中 ,定 时 器 重装值保存在 寄 存器中,其完整的计算公式如下: 波特率 当 时,为了从已知的波特率导出请求的 值,使用如下公式: 波特率 当 时,为了从已知的波特率导出请求的 值,使 用 如下 公式: 波特率 非常低的串行波特率可用定时器 通过使能其中断、设置定时器方式 以及使用其中断 初始化 表 方式 位软件重装来实现。 列出了对于各种常规串口波特率的重装值样例。设置为使用定时器 ,采用 时钟源 ,工 作在 更多实际的波特率可通过使用定时器 作为波特率发生器来实现。为了使用定时器 作 为波特率发生器,配置定时器 为自动重装方式,并设置在 中的 和(或) 位。 选择定时器 作为波特率发生器用于发送, 选择定时器 作为波特 表 常用串口方式 波特率重装值 设 定时器 方式 注意:在所有的系统中,如果使用的波特率误差大于或等于 时 ,将 不 能 工作 。 率生成器用于接收。定时器 的 位重装值保存在 和 器 波特率可得到如下等式: 中 ,对 于 定 时 波持率= 为了从已知的波特率导出要求的 和 值,可采用如下公式: 波特率 当 也被禁止。 表 或 被设置时,对于定时器 列出几个常用串行波特率的 溢出不设置 标 志 ,而 且 重装值样例。 表 常用串口方式 波特率的定时 重装值 重装触发 注意:在所有的系统中,如果使用的波特率误差大于或等于 时 ,将 不 能 工作 。 方 式 发送 图 显 示 的是 方 式 发送的时序。对于方式 ,在软件写 或 寄存器 后, 在 分频的计数器第一次溢出后开始发送,从 (或 )引 脚 上 顺 序 发 送 起 始 位、 个数据位(低位在前)和停止位数据。在停止位被发送后的 个 周 期 ,置 (或 )位 。 图 串口 方式 发送 时序 方式 接收 图 显示的是方式 接收的时序。当使能 或 位 时 ,在 或 )引脚上起始位的下降沿处开始接收。该应用对于任何一种波特率每位均采样 次。 当检测到一个起始位的下降沿时,复位用来产生接收时钟的 分频计数器,以顺序接收位流。 为了消除噪声,串口的内容由每一位的中间 个连续的采样值来决定 。如果采样值的多数为 低,那么串口将停止接收,并等待另一个 (或 )引脚上 的下降沿。 图 串口 方式 接 收 时 序 在停止位的中间,串口检查下列条件: (或 ) ; 如果 (或 ,停止位的状态为 ( 如 果 (或 ,则 停止位的状态无关紧要) 如果遇到上述条件,串口写接收的字节到 (或 寄存器,装入停止位到 或 ,并置 或 。如果未遇到上述条件,则丢弃接收的数据, 寄存器和 不被装载,而且不设置 位 。 在停止位的中部检测完成之后,串口等待 (或 )引脚的另一个从高到低的 跳变。 方式 方 式 提 供异 步、全 双 工通 信,共 有 位 : 个起 始位, 个 数 据 位 , 个可编 程的第 位 和 个停止位。接收和发送的数据位最低位 在前。对于发送操作,第 位由 或 的值决定。如果第 位用作奇偶位,那么传输 位( 的值到 或 )。 方式 波特率是 或 波 特 率 的 公 式 如 下: ,由 (或 )位 来 决 定 。方 式 波特率= 方式 的操作与标准 相同。 方式 发 送 图 显示的是方式 发送时序。在软件写 或 寄存器后, 在 分频的计数器第一次溢出后开始发送,从 或 )引脚上顺序发送起始位、 个数 据 位( 低 位 在 前 )、第 位和停止位数据。在停止位被发送后,置 或 位。 图 串口 方式 发 送 时 序 方 式 接收 图 显示的是方式 接收时序。当使能 (或 位时,在 (或 )引脚上起始位的下降沿处开始接收。对于任何一种波特率,该应用每位均采样 次 。 当检测到一个起始位的下降沿时,复位用来产生接收时钟的 分频计数器,以顺序接收位流。 为了消除噪声,串口的内容由每一位的中间 个连续的采样值来决定,这对起始位尤其重要。 如果 或 )引脚上的下降沿不能保证 个连续采样值的多数为低,那么串口将停 止 接收 ,并 等待 另一 个 或 )引 脚上的下降 沿。 在停止位的中间,串口检查下列条件: (或 ) ; 如果 (或 ,停止位状态为 ( 如 果 (或 ,停 止 位 的状态无关紧要)。 如果遇到上述条件,则串口写接收的字节到 或 寄存器,加载停止位到 (或 ,并 置 ( 或 。如果未遇到上述条件,则丢弃接收的数据, 寄存器和 不被装载,而且不设置 位。在停止位的中部检测完之后,串口等待 (或 )引脚的另一个由高到低的跳变。 图 串口 方式 接收时序 方式 方式 提供 异步、全双工 通信,共有 位 : 位起始位, 个数据位, 个可编程的第 位 和 个停止位。接收和发送的数据位最低位 在前。方式 传送和操作与方式 相同。 方式 波特率发生器与方式 相同。也就是说,方式 结合了方式 协议和方式 的波特率。 图 显 示 的是 方 式 发送时序,而图 显示的是方式 的接收时序。 图 串口 方 式 发送 时序 当定时器 采用 时( ,默 认 ),方 式 的操作与标准 相同。 图 串口 方式 接收时序 第章 缓冲区存取 端点 引言 数据经端点缓冲区输入 ,也可经端点缓冲区从 输出。为了能满足 的高传输速率,外部逻辑通常直接连接到 进行数据传输,而在传输的过程中不需要 的参与。在后续的第 章和第 章中将具体介绍外部逻辑如何直接与大端点 相 连接。 当一个实际应用要求 处理外部逻辑与 之 间传 输 的数 据 时 ,或 者 当不 存 在外 部 逻辑时,则固件程序能够存取端点缓冲区,就像存取 区或者利用一个自动增量指针存取 一样。 当没有 的任何干预,外部逻辑或内置的通用可编程接口( )通 过 个 大 端 点 处理高带宽数据传输时,固件程序必须完成如下工作: 配置端点; 响应在控制端点 上的主机请求; 控制和监控 的 活 动; 利用 、定时/计数器、中断和 引脚等来处理所有的应用特定任务。 的大端点和小端点 的端 点缓冲区 被分为“ 小”和“大”两 组。 和 属于小端点,它们是 字节端 点,只能被 访问,不能够直接与外部逻辑连接。 和 属于大端点,配置 的端点可满足 的高速传输要求。虽然数据通常通过在 接口控制下的大端点缓 冲区传输,但是, 在需要的情况下也能够访问大端点。 高速和全速的区别 可以在全速( )和高速( )两种模式下工作。这两种传输模式的有效 承载数据量及对传输速率的要求有所不同。 体系结构被最优化设计为高速传输: 仅提供几个大缓冲区,取代众多小端点缓冲区; 在 大 端 点( 和 )上 , 提供了 倍 、 倍或 倍 缓冲 区; 其 不用参与高带宽的传输,取而代之的是专用的 逻辑和标准的端点/接口; 是由于 用 的速率在片内外传输数据。 端点缓冲区呈现不同的大小,其大小取决于 是运行在高速还是全速模式下。这 规范中对两种模式所允许的最大信息包的大小规定不同,如表 所列。 表 和 的最大信息包大小 虽然 和 缓冲区实际上是大端点缓冲区,但是,当 运行在全速模 式下时,它们呈现为较小的缓冲区,占有较小的最大信息包。 当在高速模式运行时,固件程序可以配置大端点的大小、类型和缓冲区大小。当在全速下 运行时 ,端点的类型和缓冲是可配置的 ,但是 ,对于非同步类型 ,最大信息包的大小被固定在 字节。 如何配置端点 端点是由表 所列的 个寄存器来配置的。 表 端点配 置寄存器 对 于 “类 型 ”可能 只 能 是 中 断 或 批量。 端点 不需要配置寄存器,因为它被固定配置为有效、 、控 制、 字节、单缓冲。 对和 传输, 使用同一个 字节缓冲区;而对于 和 传输 ,则使用独 立的 字节缓冲区。 端点 和 用来进行处理高带宽的 传输。端点 和 是 最灵活的端点,这是因为它们的大小( 字节或 字节)和缓冲的深度 倍 、 倍 、 倍 ) 都是可变换的。 这些寄存器中的控制位如下。 有效性:设置为 (默认)使端点可用。 一个无效的端点不能对主机的要求作出回应。 类 型:两 个 比 特 的 大 小( 第 位和第 位)设定端点类型。 = 无 效 的; = 同 步 的( 仅 = 数 据 流( 默 认 ); =中断。 方 向: =输入; = 输 出 。 缓冲:仅对 和 两位, 控制缓冲的深度。 倍; = 无 效 的; 倍( 默 认 ); 倍。 “ 缓 冲 ”指 的 是 对 于 端 点 有 效 的 内 存 区 数 ,例 如 ,对 于 双 倍 缓 冲 ,在 数据进出一个端点 的同时,来自外部逻辑的信息包也可以进出同一端点。这种技术使得系统性能达到最佳,使得 外部逻辑接口与 之间不用再相互等待。当突然有大量的数据需要传输时(比如 和 许多其他接口,如硬盘驱动器等),多重的缓冲是最有效的。分配更多的 区 倍甚至 倍的缓冲)将使这些突然增加的数据传输率变得平滑。有一个简单的方法来确定合适的缓冲 深度,开始时使用最小值,之后逐步增加,直到在 这边不出现无应答信号,同时在接口端 也没有等待的状况为止。 访问 端点数据 地址为表 所列的端点数据对于 来说是可以访问的。只要实际应用要求端点缓 冲区小于实际物理缓冲区的大小,则 将 从缓 冲 区 的最 低 地 址开 始 读 取 。譬 如 ,如 果 具有一个报表 字节的最大包, 将先读取 缓冲区中较低位置的一块数据(例如,地 址为 的 数 据 )。同 样 地 ,如 果 运行在全速模式下(规定最大块数据包的 大小仅有 字节),这时只有位置在最低处的 位( 例 如 ,对 于 ,为 )将 被作为块数据。 是用来存放控制传输数据的。表 从控制包来的数据的 字节呈现在一个单独的 在 空间中的端点缓冲区 缓冲区中,被称作 ,其 地址为 只能访问“激活的”具有多重缓冲的 端点缓冲区。这就是说,固件必须认为一个 倍缓冲 字节的端点只有 字节大小,尽 管这个 倍缓冲端点实际上占用了 中 字节空间。同样,当配置 和 时, 有时会导致 或 无效,或这两个端点都 无效,所以,在固件程序中,不必尝试对这些与无效端点相对应的缓冲区进行操作。 例 如 ,如 果 被配置为 倍 字节缓冲,则固件访问它时,应该访问 的地址空间。这时固件不要访问 或 端口缓冲器,因为它们现在已经不存在 了( 中 和 原有的空间已经被 的 倍缓冲占去)。 对 端点的控制 从 的角度 来看“,小 ”和“大”端点在运行 时只有细微的 区别,这是 因为多重信 息包缓 冲方案是通过大端点来应用的。 使用内部寄存器来控制端点数据的流动。由于小端点 和 与大端点 和 的编程方法是不同的。这些内部寄存器被分为以下 种 : 用 于 小 端 点 的 寄 存 器( 和 用 于 大 端 点 的 寄 存 器( 和 可用于这两种端点的寄存器。 控制小端点的 和 的寄存器 控制 和 的 寄 存 器 的 名 称、地 址、功 能 如 表 所列。 表 控制 和 的寄存器 寄存器 固件使用这个寄存器通过端点 来控制传输。 寄存器有 个 控制 位: 和 ) 只要收到一个控制传输的 令牌, 位就会自动被置 。此时, 中的逻 辑电路对于控制传输的 握 手)阶 段不 作应 答,直 到固 件清 除 位( 通 过 向 该 位写入 。这种机制给固件程序提供了手段,用于延迟发送后续传输,直到完成通过控制传 输要求的动作。 注意:固件程序在每完成一次控制器的传输后必须清空 位。 位是只读的,它只与控制传输的数据段有关。 使用,所以,固件程序不能存取端点数据。 表示端点目前正被 只要控制传输的数据段到达, 位就会被自动清 。在不同的情况下,对于 和 传输, 位都被设为 对 传输,在固件将 设为 传输前, 逻辑将不会应答任何 令 牌 。固 件 通 过对字节计数寄存器 写 入 数 据 ,将 设为 传输。设置 来表示固 件允许存取数据。一旦端点的数据被发送和应答, 就自动清 ,并将 中断请求 位激活。在 位被自动清零后,固件可重新对 缓冲区写入数据。 对于 传输 逻辑将对所有的 令牌不应答,直到固件程序通过向 寄存器写入任意值将 设置为 传输。当固件程序向 写入数据时, 位 将自动置 并且在数据被正确接收且得到应答信号后, 位将自动清 。当 位转 变为 时, 将会产生一个 中断请求。对于端点服务请求, 的自动向量中断 系统将会自动转向相应的中断服务程序。 设置 ,表 示 向控制传输返回 响应。当固件程序还没有认可一个 引入的 请求时,这部分工作通常已经做过了。根据 协议,端点 必须一直用来接受 数 据 传 输 ,所 以 ,只 要 有 令牌抵达, 位将会自动清零。如果想要停滞一个传 输 ,并 同 时 清 通过向它写入 ,则固件程序应当首先设置 ,以 保 证 在 控制传输的“应答”过程完成之前 位已经被设置过了。 和 寄存器 这 两个 寄 存 器是 字 节 计数 寄 存 器 ,用 于控 制 传 输的 任 意 数据 段 的 字节 发 送 。虽 然 缓 冲区只有 字节,但是,字节计数寄存器有 位宽,允许使用设置数据指针来发送由多重信 息包组成的 数据记录。 为了在绝大多数模式中使用设置数据指针,固件程序清除 位 ,同 时 将 数 据块 的地址写 入设置 数据指针 ,接着 又将需 要传输字 节总量 的数值加 载到 寄存器 中。 将自动传输全部的数据块。如果需要的话,数据要分割到最大有效信息包的大小。 对于不用设置数据指针的数据 传输,固件程序将数据装入 ,然 后 将 传 输 字 节 数值写入 和 这两个寄存器。当固件程序向 写入数据时,信息包 等待 传输,所以, 寄存器应当先被装入。这些数据传输一般是 字节或更少,故 必须被装入 必须要在 之 间 )。 将保持零值,直到固件重 新写入其他数据将它覆盖。 对于 传输,字节计数寄存器显示从 接收到的字节数。对于 输出 传输的字节计数值一般为 或 小 于 ,所 以 , 在完成一次 传输后总是为 为了重新装载对于将来的 传输的 缓冲区,固件可将任意一个值写入 由于 寄存器上电复位的状态未定,所以 寄存器在复位前必须要初始化。 和 寄存器 采用 和 种中断来管理端点 上的控制传 输 。对 这 种中断源的分别使能是在 寄存器中设置的,而中断请求标志则在 寄存器中设置。 这 种中断的每一个中断,分别在如下不同的控制传输阶段完成时发出中断信号。 设 置 令 牌 ):在 接收到一个设置令牌时发出中断。 (设置数据有效):当 逻辑已经将 阶段的 字节装入到 上 的 字节缓存器时,发出中断信号。 (端点零应答):在握手阶段完成时,发出中断信号。 中 断并 不是 经 常用 到的 ,一般 被用 来 调试 和诊 断程 序 。固 件程 序 一般 通过 对 中断信号的响应来为控制传输提供服务,这是因为对于在 缓冲区的检 测,该中断触发仅在 个设置字节之后才被激活。 寄存器 和 寄存器中的 位被复制到了这个特殊功能寄存器 中,这样就可以更快地对这些位进行存取(通过 寄存器提供以下 个状态位: 指令而不用 指 令 )。 : ,忙 ; ,忙 ; ,忙 。 寄存器 这个寄存器用来调整 的批量传输或中断的传输。 寄存器包含两 位: 和 这一位是用来指示固件什么时候可以从端点 的输出缓存器读取数据。 时 ,说 明 “拥有”缓冲区,因此固件程序此时不能对它进行读(或写)操作; 时,固件 程序 可以对缓存区进行读/写操作。 位由 变 为 ,声 明 中断 请求 ,说明 新的 数据有效。 在 确认 数据已经正确地传输并得到了 后, 将自动清 。如果传输 过程中有错误发生, 将会重新进行传输,错误的纠正将交给固件完成。 固件程序对计数寄存器 写入任何一个值就可以将端点设置为 传输, 也会自动设为 当 接 通 电 源( 或 每 当 在 引脚产生一个由 到 的 转 化 ) 位将会被置 。这 样 , 将不会应答任何 传输,直到固件程序通过将任意值写入 而控 制 。而对于 和 来 说 ,它 们 的 端点 位则默认为 ,因 此 ,所 有 的固件程序在使用输出端点前必须对它们进行设置。 ) 固件程序设置 来通知 返回 (替代 传输。直到固件程序清除该位之前, 将继续通过 或 来响应 )响 应 传输。 寄存器 固件程序可通过读取这个 位寄存器来确定在 中的字节数 。固件 程序对 任意写入一个值来控制一个 传输。 寄存器 这个寄存器被用来调整 上的 或 传输。 寄存器包 括 两位: 和 ) 这一位是用来指示固件程序什么时候可以向端点 的输入缓冲区加载数据。 时,表明此时 拥有”缓冲区,固件程序不能对该缓冲区进行存取操作; 时 ,固 件 程序可以对缓存器进行存取操作。 位 由 变 为 ,声 明 了 中断请求,意味着 缓冲区为空且已经做好了装入新数据的准备。 固件程序通过向 上传 字节的数据安排 传输,然后将装入数据的字节数 )写入计数寄存器。在写入计数寄存器的同时, 位将会自动设置为 ,表 明 通 过 的传输还未完成。随后,在 接 收 令牌、发送数据并且成功地接收到主机的应答 信号之后, 将会自动清 ,表明缓冲区已经做好了接收更多数据的准备。这时就产生了 中断请求,发出缓冲区再次有效的信号。 每当接通电源或在复位端有一个 到 的变化时, 位将会自动清 不会应答任何 传输,直到固件程序通过将需要传输的字节数写入 ,这表明 将 寄 存 器 ,从 而控制该端点。 ) 固件程序设置 个 传输。通过 ,用来通知 返回 将继续响应 (替代 或 )响 应 一 传输,直到固件程序将该位清除。 寄存器 固件程序通过将先前装入端点 缓存器的数据总位数写入这个 位寄存器来使输入传输 准备好。 控制 和 的寄存器 为了能够实现 的高速传输中的高带宽要求, 的 将 不 参 与“ 大 ”端 点 的 数据传输,这些端点通常都是直接与外部逻辑相连。 然而,在一些应用中,可能会要求固件程序至少能够对大端点进行少量的控制。对于这些 应 用 , 提供了如表 所列的一些寄存器。 表 控制端点 的寄存器 续表 寄存器 为了通过固件更快地进行存取,端点空和端点满的状态位(下面将详细描述)被复制在这 个寄存器中。 和 寄存器 仅 对 于 高 速( 端点,这些寄存器中的 和 位确定了每个微帧中的信息包数量,如表 所列。 这 些 寄 存 器 在 全 速( )模式时没有作用,全速同步传输总是固定在每帧一个信 息包。 和 寄存器 由于 的 个大端点提供 倍 、 倍 、 倍的 表 缓冲区,所以仅一个 位将不能充分说明这些 端口的缓冲区状态。因此这些端口有更多的状态位 每微帧同步输入信息包数(仅高速) 和 ,可通过检查这几个状 态位来确定端点缓冲区的状态。多重缓冲的端点数 据只能按照表 所列的地址来存取。 自动 切换多重缓冲区从一个单独的可设定地址的缓冲空 间中输入和输出。 ) )和 ) 的值对于 和 端点将有如下不同的含义。 端 点: 显示了通过 接收到的以及已经被固件读取的信息包总数。 端 点: 显示的是待发给 的信息包总数(比如装入的准备用作 传输 的数据),但是固件是不能获得这些信息包的。 通过占用不同的大小来说明端点可用缓冲的深度。对于 和  只能有 倍 缓 冲( 个 位 ),而 和 能够有 倍的缓冲( 个 位 )。 ) 虽然 和 都可应用于输入、输出两个方向的传输,然而, 在 传输 中更加有用。它与 有相同的用处,但是可用于多重缓冲的 端点。当 时, 表明所有的缓冲区都被 占用,没有能够被固件访问的缓冲区。 对 传 输 , 为 意味着所有的缓冲区都被 占用,所以固件不应该再试图向端 点缓 冲区 装入 任何 数据 。当 时, 将占用 或 位,这取决于缓冲的深度, 也表明所有的缓冲区都被用作 传输。一旦一个缓冲区变为可用, 将会清 ,同 时 将会缩减 位,表明只有一个缓冲区没有被 占用(有一个缓冲区可以被固件访 问 )。 ) 虽然 和 都可以被应用于 和 传 输,但 在 传输中更 有用。 为 表明缓冲区为空,所有接收到的信息包( 或 ,依赖于缓冲深度)都已 被处理。 固件程序设置 ,通 知 返回 (代替 或 ,对 或 传输作出应答。 将继续返回 来对 传输 作出 响应 ,直 到固 件将 位清 : 和 寄存器 大端点 和 有 位的字节计数寄存器,被用来对这些端点最大缓冲 字节 的计数。端点 和 有 位的字节计数寄存器,用来对它们的最大缓冲 字节进行 计数。 这些字节计数寄存器与端点 、端 点 的计数寄存器功能大致相同: 对 于 传输,固件将一定的值装入字节计数寄存器,使得端点准备好进行输入传输 (如果 中需要装入值,那么它应当首先被装入,因为当 中装入值 后,说明端点已经准备好了传输)。 对于 传输,固件通过读取字节计数寄存器中的值来确定缓冲区中字节数,然后, 将一个任意值写入字节计数寄存器的低位,使端点重新准备好传输。 可通过阅读下面 的内容来了解详细情况。 通常来说, 的接口与外部逻辑与端点 是互相独立的,对于每一个接口分别设 置控制位。 模式和 位将使这两个区域实现重叠。下面将对 模式进行简单的介绍,详细的信息可参见第 章 。 当外部逻辑与 接口连接且有效时, 的正常数据流将自动向外部 接口提 交 数据包。这种方式保证了从主机向外界传输的 数据不间断传输,并且保持高速 模式下的高带宽。 在同样 的情况下,如果可 以在这种数 据流动种 加入一个“挂钩”来控制,那就 更好了。这样 不仅 可以自动将从 接收到的 信息交给外部接口 ,固件也可以每接 收到一个 包 就收到一个中断信息,从而来确定是将此信息包交给外部接口,还是直接丢弃它。例如,固件 可以检测一个信息包的头来作出跳过或是提交数据的决定。 要实现这个“挂钩” 位需要被清 。如果 ,并 且 端点通 过向计数寄存器的低位写入值而重新做好了传输的准备,那么写入寄存器的实际值就变得非 常重要。 如果 位( 每 个 寄存器的第 位 )被 清 ,那么信息包将被交给 输 出,并且因而使得对于 的主控制器(外部逻辑或内部的 如果 位被置 ,那么刚刚接收到的 包将不会提供给 有效。 输 出 ,而 传 输 给 外部逻辑,转而将不做任何处理。它的缓冲区将立即使下一个 包有效,并且 输 出( 以 及 外 部 逻 辑 )甚 至 从 来 就 不“ 知 道 ”前 一 个 包的到达。 注 意: 位呈现在每个端点 配置寄存器( 和 )的 第 位 。 控制所有端点的寄存器 控制所有端点的寄存器如表 表 所列。 控制所有端点的寄存器 和 寄存器 对于两端点条件,这几个寄存器包含中断允许和中断请求位,即 和 ) 当主机请求一个从 端 点的 包时,这个端点不应答(返回 ,直 到 端点缓冲区填满数据并且做好了传输的准备,这时 用数据对 请求做出应答。 在端点没有准备好之前,大量的 信号涌向总线,占用总线的带宽 因此,如果 端点不能总是保持装满且准备好传输的状态,那么知道什么时候主机将会“敲门”来请求 数据可能就变得很有用。 )中断就提供了这种通知的机制。每当一个 端点对 请 求无应答时, 中断将被触发。 寄存器中每个端点都有专用的允许和请求 位,每 个 寄存器中包含一个专用的 位 ,那 就 是 分 别 对 寄存器中专用位的结合。 固件通过使能位置高来使能一个中断,清除一个中断请求位则是通过向中断请求位写入 来实现的。 在 寄 存 器 中 每 个 端 点( 和 )都有一个专用的中断使 能位。这些位仅在端点如果被配置为 端点或 端点时有效。对于这 个 端点, 寄存器中同样都有相应的专用中断请求位。 的中断服务程序应注意下面几个方面: ①除 的中断请求(通过向它写入 ②检查 中的每个端点位,来确定是哪个 端点无应答; ③采取必需的操作(设置标志,准备好端点等),然后,对于接收服务的端点,清除 中的专用 位( 通 过 向 它 写 入 ④如果还有其他端点请求 服务,重复第②步和第③步,直到所有的 位都被清 除; ⑤清除 寄存器中的 位( 通 过 向 它 写 入 注意:由于这个 位表示专用 中断请求的结合,所以它将不再“触发”,直到所有 的 中断请求都已经服务完成而且已经被清除。 ) 是 的 ,用 于 高 速( 传输。 当 在 全 速 模 式 下( 规范)运行时,每个主机的 传输由 和端点数据 组成,甚至在端点无应答(没有准备好)时也是如此。当端点还没有准备好时,主机将重复发送 所有的 数据。如果它反复无应答,则总线带宽就被白白浪费了。 对此, 标准引入了一个新的机制,叫做 。这种机制对于“未准备好”的 端点能够较好地利用总线带宽。 在 高 速( 规范)下,主机能够通过 一个 端点来确定它是否已 做好了接收数据的准备,主机将延迟 数据的传输,直到它们已经能够被正确接收。主机 发送一个 令牌, 将 做以 下回 应: 一 个 应 答( )信 号 ,表 明 端点缓冲区中还有空间; 一 个 无 应 答( )信号,说明还 未准备好,等会儿 再试。 中断是指 端点对 指令返回一个 仅适用于高 速 传 输( 不像 位结合了所有端点的单个的 中断,每一个 端点都具有不同的 中 断( 和 。对于专用 中断的中断使能都在 寄存器中,而中断请求则都在 寄存器中。 中断的服务程序必须按顺序完成以下几步: ①清除 中 断请 求; ②为请求的端点提供相应的操作; ③清除端点相应的 位。 和 寄存器 这些寄存器用来管理来自 端点的中断。通常,发生以下情况时将发出中断请求: 一个 端点缓冲区已经可用, 可 以 装 入 数 据; 一个 端点具有 需要读取的新数据。 对于小端点( 和 忙)具有同等意义。对于所有的 ,这些情况与将端点的 位从 变为 从忙到不 中断,允许通过向使能位写入 来实现,也可以向中断标 志位写入 来实现。 注意:不要试图通过读取 寄存器来清除 位,而是要通过将寄存器中的数据与一 个位屏蔽数(例如 )进 行“ 或 ”运 算 ,然 后 再 存 入 寄 存 器 中 。因 为 将会清空 位, 而且将清空所有的 位而不仅仅是需要清空的那个位。因此,应当简单地写入一个单独的 (例如, )进入寄存器中。 和 寄存器 这些寄存器是用来监控 和主机间的 连接状况。 ) 这 个 寄 存 器 包 含 了“ 同 步 端 点 错 误 ”中 断 和“ 错误限度”中断的中断使能。当 检 测到一个高带宽、高速同步( )端 点 的 序列错误时,将会产生“同步端点错误”。 这个寄存器包含了“同步端点错误”中断和“ 错误限度”中断的中断标志。 固件程序将 错误限度设定为 其中的任意值,并将这个值写入这个寄存器 的低半字节。当 发 生 错 误 时(有 很 多 错 误,例 如 错误、无效的 、错 用的 信 息包等) 错误限度中断标志将被设定。上电复位时,错误限度将默认为 这个寄存器的高半字节将存放目前发生的 错误数。 将任意值写入这个寄存器,就能清除在 寄存器的高半字节存放的 错 误计数值,而它的低半字节将不会被改变。 寄存器 正如在第 章所提到的,主机和设备都有一个 位,它在数据包传输之间被触 发。当固件程序必须将端点的 位设置为 时,应具有如下的确定时间: ①在配置改变之后(例如,主机发出 请 求 ); ②在接口的交替设置改变之后(例如,在主机发出 请 求 之 后 ); ③在主机向一个端点发出 请求之后。 对于前两种情况,固件程序必须清除包括所涉及接口的所有端点的 位 。对 于第③种情况,只有一个端点的 位被清除。 在 寄存器中,包含一些位可设置或清除端点的 位 ,同 样 也 可 读 取 当前 位的状态。 就像前面所写到的,固件不知道为什么将一个端点 位设为 。同 样 ,由 于 要 对所有的 位进行管理,通常它不需要知道某个 位的状态。这些功能 包含在 寄存器中,用以完善和调试。 寄存器的位定义如图 所示。 将一个端点 图 寄存器 位清 需要两步。首先,将端点地址( )加 上 一 个 方 向 位 )写 入 寄存器;然后,保持端点和方向位不变,向 )位 写 入 ,比 如 ,对 于 被配置为 端 点 ,要 清 除 位,这就需要将以下数据按顺序写入 寄 存 器: 设置数据指针 主机通过端点 利用控制传输发出设备请求,一些请求还需要 通过端点 返回 数据。例如,主机发出 请求询问设备的性能和要求。返回的数据可能包含有 许多数据包,所以,它一定要被分割为有效信息包大小的块,之后,在适当的时候将这些块传输 给 主 机( 例 如 ,当 端 点 缓冲区准备好之后)。 设置数据指针自动进行通过端点 返回 数据地过程,使得固件程序变得简单。要让 设置数据指针正确地工作,端点 的最大有效信息包大小一定要设置为 字 节 。 表 列 出了配置设置数据指针的寄存器。 表 配置设置 数 据 指 针 的 寄 存 器 为了发送一个块数据,块的首地址被装入 ,块的长度必须在此之前被设定 好。其完成的方法依赖于 位 的状 态: 手动模式):用作通常的批量传输。固件将块长度写入 自动模式):只能用来发送设备、配置、字符串、限定和其他速度配置 描述符。块的长度可从描述符的“长度”区域读出,不再需要装入 中。 传输从 的写入开始, 在需要时自动发送所有块,分包是必需的。例如,为 了应答一个 的 请 求 ,固 件 将 设 为 ,之 后,将 设 备描 述 符 的 地址装入 ,然 后 , 自动将所需数量的数据包装入端点 数据缓冲区,并将 它们传送给主机。 为了能使 对状态(握手)包做出应答,在开始设置数据指针前,固件清除 位 (通过向它写入 如果固件需要知道什么时候传输已经结束(例如,发送并应答),它能在开始设置数据指针 传输前使能 中断。 在 时 ,写 入 仅设置块长度,它不能使传输准备好(传输在对 写入后准备好)。因此,在执行没有用到设置数据指针的 传输之前, 必须被置为 传输长度 当主机发出任何 请 求 时 , 需要考虑以下两个长度域值: 请求的数据的字节数(从主机那里接收到的 包的最后两字节开始); 有效的字节数(由实际描述符中( 或在 中( )的 长 度域 值 提 供 )。 为了与 规范保持一致, 将发送这两个长度域值中较小的一个。 可访问的内存空间 设置数据指针能够在以下两个 空 间 中 存 取 数 据: 片上主 ,地址为 片上临时 字 节 ,地 址 为 注意:这里设置数据指针不能用来访问片外存储器的任何地址。 自动指针 自动指针对于在 缓冲区中的端点数据是有效的(见表 。在 某 些 情 况 下 ,固 件 程序存取端点数据是很快的,就好像它们在 寄存器中一样。 提供了两个特殊数据 指针,被称为“自动指针”,它们可以在每个比特数据传输后自动加 。使用自动指针,固件程 序能够访问片上或片外作为 的数据存储器中的相邻数据块。 每个自动指针都由一个 位的地址寄存器( 、一个数据寄存器 以 及 一 个 控 制 位( )控制。一个附加的控制位 将两个 自动指针使能。 对一个自动指针数据寄存器进行读取或写入操作,实际上访问的是由相应的自动指针地 址寄存器所指向的地址内容,在每一次数据存储器存取后,相应的自动指针地址寄存器就加 。为了 用自动 指针 对存 储器(例 如,端点 缓冲区 )的相邻 块进 行读 /写,应 当先将 块的 起始 地址 装入自动指针的地址寄存器中,然后反复读写自动指针的数据寄存器。 寄存器可随时被读/写,以确定当前自动指针的地址。为了快速访问, 大部分的自动指针寄存器设在特殊功能寄存器( )的空间中,数据寄存器仅在外部数据空 间有效。 在 寄存器中有 位被用作配置自动指针:一位( 位)用于 两个自动指针使能;还有两位(每一个自动指针对应一位,分别被称为 和 位)控制每一个自动指针存取后地址是否累加,如表 所列。 表 控制自动指针的寄存器 使能自动指针也会有一方面的影响:从 地址空间的任何程序代码的存 取( 例 如 ,获 取 指 令 )将 返 回 的值,而不是这两个地址空间中的程序存储器的值, 这将在程序存储器中引起两字节的“空洞”。而在数据存储器中,同样的地址单元中将不会有 这两字节的空洞,这个空洞只出现在程序存储器中。 第章 从属 引言 虽然一些基于 的设备可使用 的 直接处理 的数据,但是更多的用户使 用 的更加简单的管道连接方法,连接 和外部数据处理设备(例如: 和用 于硬盘设备的 控制器等)。 在具有外部数据处理逻辑的设备中, 数据在主机和外部逻辑设备中传输,通常不需 要 的 的 参 与,而 是 经 过 内部端点 来传输。对于外部逻辑器件,这些端点 特别提供普通的时序信号、握手信号( ,读 / 写 信 号 和 输 出允许信号等。 当然,这些信号必须被 控 制。 的可编程界面( 在连接到外部 逻辑设备时,可充当“内部”控制。这些设备不包括标准的 接 口,或 不由外部控制 器控制。如果 被外部控制器控制,则 工作在 模式。 第 章将讨论内部控制 。本章将提供硬件和软件方面 和外部控制器 接口细节。 硬件 图 所示为 个 为 位模式。表 列出了与 录 表 。图中所示的 工 作 在 位模式,当然也可以定义 硬件相关的寄存器,关于寄存器的详细介绍见附 与 硬件相关的寄存器 图 在 系统中的位置 从属 引脚 在复位后,它的 引脚配置在“端口 ”模式,而不是 置为 模式, 寄存器的 必 须 设 置 为 ( 详 见 第 章 )。 当 接口引脚被 认为是外部主控制器,如图 所示。 外部逻辑经过 位或 位数据总线 连接 ,这个数据总线是双向的,可通过 引脚控制输出。 引脚 选择 个 中的一个与 总线连接。 在 异步 方式( )下 , 和 是读/写选通信号。在同步方式 )下 , 和 作为 时钟引脚的使能信号。异步和同步方 式下的时序如图 所示。 图 模式。为将引脚配 模式接口引脚 图 异步和同步方式下的时序 数 据 总 线( 数据总线 可以是 位 ,也 可 以 是 位宽,其宽度由 的 位 来选择。 位模式, 取代端口 位模式, ]取 代端 口 取代端口 在加电复位情况下,对于所有 的数据总线默认为 位 模 式( 在两种模式中, ]引脚用于选择 个内部 中的一个与 脚连接。这两 种模式的作用机理和连接方式如图 和图 所示。 如果所有的 被设置为 位模式,则端口 被空出,可作为一般的 接口使用。如 果任何一个 被设置为 位模式,则端口 就不能被用于一般的 接口了。 图 位模式 图 位模式 接 时 钟( 接口 既可 由内 部提供 时钟 信号 ,也可 由外 部提供 。内 部时钟 源可 被设 置为 或 ,这时内部时钟可通过 引脚提供输出。如果 设置为使用外部时 钟源, 引脚可被用来提供 之间的任何频率的时钟信号。在加电复位时, 默认内部 时钟源,正常极性,此时 引脚输出被禁止,如图 所示。 选择内部或外部时钟源: 选择 内部时钟: ,该 位 无 效 )。 内 部 时 钟 源 输 出 使 能: ,该 位无效)。 接口时钟极性转换(包括内部和外部时钟) ( 正 常 ); ( 转 换 )。 转换可以使 能够根据需要方便地与外部电路连接。例 如 ,图 中,为了保证足够长的设置时序读取 标 志 ,而 对 进行了 设置。 当 被设置为输入时,最小频率为 图 设置 常 的“ 图 通过转换 输出确保设置时序 标志引 脚( 和 满 ”和“ 和 引脚用于报告 的 状态 ,除 了 可以 表示 通 空”信号外,还可以表示一个已经填写了用户编程级的信息。外部主 控制器监控 端点的“空”标志以及 端点的“满”标志。编程级标志可同时在两种形式 的 端 点 都 有 效 ,例 如 ,它 能 在 端 点 总 是 处 于“空 ”,或 是 端点总是处于“满”时提供提前 警告信息。 和 引脚能工作在变址寻址和固定寻址两种方式,两种方式分 别经过 和 寄存器。 引脚仅工作在固定寻址方式下。 每一个引脚都被独立设置,在其他引脚被设置为变址寻址方式时,某些引脚可设置为固定寻址 方式。详见附录 相关内容。 配置变址寻址方式的标志引脚报告 当前由 ]引脚选择的状态。当 配置为变址 方 式 时 , 报告“可编 程级”状 态, 报告“空”状态, 报告 “ 满 ”状 态 。 对于一个特定配置为变址寻址方式的标志引脚只报告 种情况之一,无论 引脚的状态如何,其形式及 用户都可以选择。例如, 可以被设置去报告 的“ 空 ”状 态 , 报告 的“ 空 ”状 态 , 报告 的“ 编 程 级 别 ”状 态 ,以 及 报告 的“ 满 ”状 态 ,如 图 所示。 “ 空 ”和“ 满 ”标 志 引 脚 的 极 性 默 认 为 低 电 平 ,但 是 能 通 过 寄存器改变。 在加电 复位时, 标志被设置为变址寻址工作方式。 图 控制引脚( 和 从属 控制引脚为 ( 输 出 使 能 )、 (读) (写) )和 选取)。“读”和“写”来自外部主控制器的外引线;外部主控制器从 端 点 读 ,向 端 点 写 。 “读” 和 在 同 步 方 式 下( ,当 指针在 有效时, 的每一个上升 沿累加。在异步方式下( 指针在每次 激活到撤销激活变化时 累加。 引脚提供 输出使能信号。 默认情况下, 和 低电平有效,它们的极性可由 寄存器 改变。 “写” 在同步方式下( ,当 被激活时, 总线上的数据在每个时钟信号 上升沿来到时被写入 (并 且 指针被加 。在异步方式下( 总线上的数据在每次 激活到撤销激活变化时被写入 ( 并 且 指针被加 。默认情况下, 低电平有效,它的极性可以由 寄存器改变。 且 ,如 果 如表 ]引 脚 选 择 和 中的哪一个 与 标志工作在变址寻址方式,它们选择哪一个 标志引出到 所列。 表 通过 选择 总 线连 接( 并 引 脚 ), 外部主控器激活 引 脚 ,向 提 交 一 个 包,此时,不考虑包的长度如何。 通常,当外部主控器想发送一个所谓的“短”包时, 被启用(例如,当一个包的长度小 于在寄存器 指定 的长 度时 )。 例如:假设 设置为默认的 字节,如果 ,则 外部 主控器能连续向 传送数据,并且,无论是否装满 字 节 , 都将自动向 提交 一个包(如果不考虑任何数据传输路径中的瓶颈效应)。如果主控器想要发送的一个数据流长 度不是 的倍数,则最后发送的包将不能被自动提交给 ,这是由于它的长度小于 对于最后提交的数据,主控器将有两种选择:一是它为了使得包正好达到 字节 长度,可用 任何数据来补充包;二是也可向 写一个短包来激活 引脚。 如果 被设置为允许的零长度的包( ,则 可 激 活 引 脚 ,当 为空时,提交零长度包。 默认为低电平有效,其极性能经过 寄存器修改,如图 所示。 注意:直到缓冲区允许, 引脚才能被激活,即使只有一个零长度包正被提交也 不行。但是“满”标志无论是缓冲区是否被允许,都能被定义。 图 从属 控制引脚 从属 片 选( 从属 片 选 引 脚( 与引脚 复 用,它 经 位使能(见第 章 的 相 关 内 容 )。 引脚允许外部逻辑有效地将 数据总线上的数据移动到 。此项功能可以 共享多个从属设备的数据总线。 当 引脚由外部逻辑置高时, 开放它的 ]引脚,并且此时可以不考虑 和 引脚的状态。 实现同步从属 的写 实现同步从属 写的实例如图 外部主控器典型的进程如下。 :当写事件发生时,转到状态 状态 :指 向 ,激活 ,转向状态 状态 如 果 满标志为 假 不 满 ),则 转 向 状 态 ;否 则 停 留 在 状 态 。 状态 :传送 总线 驱动 数据 ,为 一个 激活 ,转向 状 态 。 状 态 :如果 有 更多 的数 据 要写,则转 向 状 态 ;否 则 转 向 所示。 图 接口引脚实例:同步 写 图 状态设计实例:同步 写 图 时序实例:同步 写( 波 形 图 时序实例:同步 写( 波 形 图 时序实例:同步 写( 波 形 插入 引脚信号 实现同步从属 的读 实现同步从属 读的实例如图 所示。 图 接口引脚实例:同步 读 外部主控器典型的进程如下。 :当写 事件发生时,转到状态 状态 :指向 状态 :激活 状态 ,激活 ,转向状态 。如果 空 标 志 为“ 假 不 空 ),则 转 向 状 态 ;否 则 停 留 在 状态 :传送总线采样数据。对于 状态 激活 ,指针 加 ;撤 销 激 活 ,转 向 状 态 :如果有更多的数据要读,则转向状态 ;否则转向 图 状态设计实例:同步 读 图 时 序实 例 :同 步 读( 波 形 图 时序实例:同步 读( 波 形 插入 标志 实现异步从属 的写 实现异步从属 写的实例如图 所示。 图 接口引脚实例:异步 写 外部主控器典型的进程如下。 :当 写 事 件 发 生 时,转 到 状 态 状态 :指 向 ,激活 ,转向状态 状态 :如 果 满 标 志 为“ 假 不 满 ),则 转 向 状 态 ;否则停留在状态 状态 :传送总线驱动数据。为一个 激活 ,转向状态 状态 :如果有更多的数据要写,则转向状态 ;否则转向 图 状态设计实例:异步 写 图 时 序实 例 :异 步 写 实现异步从属 的读 实现异步从属 读的实例如图 所示。 图 接口引脚实例:异步 读 外部主控器典型的进程如下。 :当写 事件 发生 时,转到 状态 状态 :指 向 ,激 活 ,转向状态 状态 :激 活 在状态 ,如 果 空标志为“假 不 空 ),则 转 向 状 态 ;否 则 停 留 状态 :激 活 转向状态 ,传 送 总 线 采 样 数 据;撤 销 激 活 ( 指 针 加 )和 状态 :如果有更多的数据要读,则转向状态 ;否则转向 图 状态设计实例:异步 读 图 时 序实 例 :异 步 读 固件程序 本节叙述 固件程序与 表 中列出了与 表 之间的接口,更多的细节可参考本章的有关内容。 固件程序相关的寄存器。 与 固件程序相关寄存器 固件程序 存取 通过使用 存 储 器 中 的 个寄存器: 和 固件程序可访问从属 存器可被直接读/写(使用 指 令),或 者由 它 们 给建 在 针机构提供源程序和目标码。 ,如 图 所示。这些寄 中的双重自动指 另 外 ,还 有 许 多 控制寄存器和状态寄存器:字节计数寄存器指示每一个 的字 节数,标志位寄存器指示 满,方式位寄存器控制各种 方式等。 本章集中讨论寄存器及对于从属 操 作有 特殊 作用 的位 。所 有寄 存器 的详 细描 述参 看第 章和附录 对于本章描述的正常操作, 固件程序必须设置 和 位 和 )为 。 图 寄存器 存储器 从属 连接外部逻辑到 的 个端 点( 和 )存 储 器 ,如 图 所示。这些端点存储器具有如下的可编程特性: 可以是批量传输 、中 断传 输 、同 步 传 输 中的任 何 一 种 形 式; 传输方向可以是 或是 和 存储器的大小可以是 字节或 字节中的一种, 和 存储器 的大小固定在 字 节; 自动向从属 接 口 提 交 端 点 数 据( 上电复位后,这些端点存储器设置如下: 存储器 批量输出 ,每包 字 节 , 倍 缓 冲; 存储器 批量输出 ,每包 字 节 , 倍 缓 冲; 存储器 批量输入 ,每包 字 节 , 倍 缓 冲; 存储器 批量输入 ,每包 字 节 , 倍缓冲。 图 存储 从属 可 编 程 级 标 志( 当一个 达到用户定义满临界点时, 的可编程级标志( )就被激活。这个临 界点设置如下。 对于 包:其阈值存放在 中。当所有 中的字节数小于或等于 的阈值或者大于或等于 的阈值时,可编程级标志 被激活。 对于 包( :其 阈 值 保 存 在 中 。当 在 中写入当前包的 字节数小于或等于 的阈值或者大于或等于 的阈 值时,可编 程级 标志 被激活。 对于 包( :其 阈 值 保 存 在 和 中。 保 持 待 发 包 数 ,而 保持当前包中的字节数。当 小于或等于 的 满阈值或者大于或等于 的满阈值时,可编程级标志 被激活。 在默认情况下, 为可编程级( ,通 过 ]引脚为当前端点指向。 对于 和 默认端点配置为 ,而 当所有 大于或等于 字 节时,可编程级标志 引脚激活。对于 和 ,默 认 端 点 配 置 为 ,并 且当所有 小于或等于 字节时, 引脚激活。 换 句 话 说,当 为 半 满 时,对 于 和 的默认配置可编程级标志激活;而当这些 为 半 空 时,对 于 和 的默认配置可编程级标志激活。 自动输入/输出方式 的 能够被自动配置为从 或向 提交包。对于 端点,自动输入模式 允许外部逻辑将数据连续传递到 中 ,不 需 要 由 它 或 固件程序来打包数据或发送信 号到主机来确认。对于 端 点 ,自 动 输 出模 式 允 许主 机 连 续填 充 ,而不 需要 外部 逻 辑或 固件与每一个引入的包进行握手及提供端点缓冲区,如图 所示。 对于自动模式,为了配置一个 端点 ,应将在对应 寄存器中的 图 当 时, 包自动待发 位设置为 。 而 在 自 动 模 式 中 , 为 了 配 置 一 个 端点 寄存器中的 位设置为 。在上电复位中,所有 式( 即 下面是 和 配置的 。 实 例: ,应将在对应 默认为手动模 存取 包( ) 当 时, 的 不在主机到主控制器数据通道上。为了获得最大的 带宽,主机和主控制器是通过旁路 而直接连接的。在自动输出模式中,从主机 来的数据自动被提交到 ,而不用固件程序的干预。 在下面的 实例中,表示当 时,对于 包,程序代码不是必 需的。 //对于从主机到主控制器的 数据,程序代码不是必需的 和 自动提交包 采用 字 节的 大批量 传输 存取 包( 在某些系统中,可能需要允许 的 了配置 为“ 手 动 模 式 ”,在 对 应 的 下面是一个配置 的 参与主机与 寄存器中的 实 例: 之间的数据传输。为 位应当被清 。 提供 倍的 缓冲区使得“ 如图 所 示 ,当 在手动输出模式并且从主机获得一个信息包时,那么 的固 件程序能够完成以下 件事情中的一件事情: ①通过向 写入 ,能够经 提交信息包。 通过向 写入 ,能 够 跳 过( 放 弃 )信 息 包 。 ③通过直接写 缓冲区,能够编辑信息包(或发送一个完整的 信 息 包 ),然 后 将 信息包长度值写入 ,并向 写入提交的编辑了的信息包,所以,在 写了 之后, 应当也被写入。 在所有的情况下, 缓冲区将自动重装,所以它能够得到下一个信息包。 下面是 下面是 下面是 图 跳转、提交或发送( 待 发 包 )时 的 实 例: 当 非空 时,则 ,主 机 发 送 信 息 包 ,通过缓冲区到达主控制器 跳 转 包 )时 的 实 例: //当 非 空 时 ,则 ,主 机 发 送 信 息 包 ,不通过缓冲区到达主控制器 发送源)时的 实 例: //对来自主机的所有的 包不应答( //预设所有的 缓冲区和计算范围 //重新建立被发送包的数据 //向 接口重新提交被发送包 //小心“左溢出”未被提交的缓冲区 //跳过未被提交的包(第 个 包 ) //注意:内核将不允许包打破顺序 释放“所有 ” 当 复位后,如果在一个 端点缓冲区中有一个未被提交的信息包,那么这个信息 包不会被自动提交给主控制器。 为了保证在复位之后端点缓冲区不存在未被提交的信息包, 可通过向 写入 固件程序的端点初始化程序将跳过(放弃) 或 个信息包(根据被选择的 缓冲区的大小来定)。具体实现可参见下面的 端点 初 始 化 程 序: 自 动 输 入( 存取 包( 模 式 与 自 动 输 出( )模 式 相 似:当 一 个 被配置为自 动输入时(通过设置其 位为 ,从主控制器来的数据被自动打包并提交给 ,这 时 不进行任何的干预。下面是当 时的 实 例: //对于从主控制器到主机的 和 字节大批 操作 数据,程序代码不是必需的 自动提交包 自动输入模式与自动输出模式相比,有一个重要的不同点:在自动输出模式中,数据(包 括在短包中的数据)总是自动提交 字节或 字节的包,而在自动输入模式中,自动提 交的包的大小可以被设置为任意非零值。当然,其中要受到一个限制条件,就是包的大小应当 小于或等于端点缓冲区大小。每一个 的自动输入包的大小值被保存在 这对寄存器中。 为了发送一个 包 , 固件程序能够暂时中止从外部主控制器来的数据流(一般是经 过一个通用 引脚上的信号),等待一个端点缓冲区有效,通过直接写该缓冲区来创建一个 新的包,然后给 提交这个包,并且释放外部主控制器。在这种方式中,固件程序能将它自 己的包插入数据流,如图 所示。图 显示数据直接在主控制器和主机之间传输。 图 显示固件程序发送一个 包 。 图 主控制器直接向主机写 图 固件干预, 或 下面是发送一个 包 的 实 例: ): 存取 包( 在某些系统中,可能要求允许 的 参与外部主控制器与主机之间的每一个数据 传输。为了配置 为“手动输入”模式,则在相应的 寄存器中的 位必须被清 在手动输入模式中, 固件程序能够提交、跳过或者编辑由外部主控制器发送的信息 包,并且能够直接发送信息包。为了提交一个信息包,固件程序将 的端点数写入 寄存器。为了跳过一个信息包,固件程序将一个 的端点数写入 寄存器中。而为了编辑或发送一个信息包,固件程序向 缓冲区写入数据, 然后将信息包的长度值按次序写入 和 中。 下面是在 时经 提交一个信息包的 实例: 主控制器当前指向 ,引 脚 //当缓冲区有效时, //固件提交 包 通过向 写入 下面是在 时经 跳过一个信息包的 实 例: 主控制器当前指向 ,引 脚 //当缓冲区有效时, //固件跳过 包 通过向 写入 下面是在 时经 编辑一个信息包的 实 例: 更改数据 ,文 字 消 息 包 起 始 ,文 字 消 息 包 结 束 //向主机传递缓冲区数据 自动输入/输出初始化 使能 一般地, 配置 设置位 复位 与端点之间的自动输入传输 被配置为如下所示的自动输入模式: ]的各个位,定义接口时钟的行为; ; 设置位 ; 经 寄存器设置大小。 使能端点和 之间的自动输出传输 一 般 地 , 被配置为如下所示的自动输出模式: 配置 ]的 各 个 位 ,定 义 接 口 时 钟 的 行 为; 设置位 复位 设置位 自动方式举例:同步 数据传输 下面是一个同步从属 数 据 传 输 实 例 的 程 序 代 码: 必须设置 和 为 //复位所有的 定义的外部接口如下 //通过外部逻辑 用 引脚驱动 //通过外部主控制器用从属 接口引脚驱动 让 自动提交 包,致使能够发送 长度包 并且设 从属 数据接口为 位 设 置 对于输入有效,定义端点为 字节, 倍缓冲 //定义 为可编程级标志,由 ]指 向 作为满标志,由 ]指 向 作为空标志,由 ]指 向 //一般不需要 //用 作为端口引脚,不作为 标志 设置所有从属 接口引脚为低电平有效 //可以按照需要定义 //具有 自动限定输入 //可以定义可编程标志( 激活所想要的等级 //输出端点不受 (上电复位)控制 //由于默认为 倍 缓 冲 , 所以 必 须 写 亚 元 字 节计 数 两 次 //通过向字节计数写 提供 和 //无代码! 的所有传输包的工作是从外部主控制器的同步接口到 //端点缓冲区中进行的 自动方式举例:异步 数据传输 异步 一样的,但是, 是异步从属 数据传输的初始化程序代码与 被配置为内部方式,使用 数据传输 程序代码: 小节列举的同步传输实例是完全 频 率 ,并 且 位被置 。下面就 //从 小节的同步固件例子中稍加修改得到 //这里定义的外部接口如下 //采用内部 //采用异步从属 接口引脚到外部主控制器 与前面提到的一样,执行传输的代码不是必需的,如下所示: ): 无代码。 的所有传输包的工作是从外部主控制器的同步接口到端点缓冲区中进行的 手动输出与自动输出之间的切换 因为当 进入自动输出模式时, 端点不是自动被装载的,所以对 何的刷新或复位,固件程序就能安全地在手动输出与自动输出之间进行切换。 不需要任 第章 通用 可编程接口 引言 通用可编程接口( )是 一 个 对 于 端点 的内部主控制器。它代替了外部的 “胶合”逻辑电路。如果没有 ,则在 与外界之间就必须建立接口电路。 的核心就是一个可编程状态机,可产生 个“ 控 制 ”和 个“ 地 址 ”输 出 信 号 ,并 且 接 收 个外部和 个内部“准备好”输入信号。 个用户定义波形描述符( )控 制 状 态 机 ,一 般 情 况( 但 不 是 必 要 的 )下 ,一 个 用 于 的读、一个用于 的 写 、一 个用于单字节/字的读以及一个用于单字节/字的写。 “ 读 ”和“ 写 ”都 是 从 角度来看的。“读”从外界到 的 波 形 传 输 数 据“,写 ”从 到外界的波形传输数据。 固件程序能够分配 读和写波形到 个 中 的 任 何 一 个,并 且 将向外 界接口产生正确的选通信号和握手信号,外界接口用于对 数据的传进和传出。 用于外部主控制(见第 章 ),在 与外界之间的数据总线可以是 位,也可以是 位宽度。 限于在 与外部 或微处理器之间的简单握手接口,具有足够强的能力来 直接实现诸如 )和 并行接口)和 等接口协 议。例如, 能够单片实现 与 硬盘驱动器或便携式 存储卡之间的接口。本 章将提供 的 概览 ,讨 论与 外 部的 连 接 ,解 释 引擎的操作方法。图 显示的是 在 系统中的位置方框图。 一般来说, 波形可以由 公司提供的 工具来产生。这个工具是一个基 于 的应用,并与 开发套件一起发布。虽然在本章中将描述 波形描述符的一些细节,但是,这些结构方面的知识往往不是必须了解的。 工具隐藏了 波形描述符的复杂性,但这不会给编程人员对 的操控带来任何隐患。 图 显示了一个简单的 传输例子, 产生一个地址( ,驱动 数 据 总 线 ,然 后 ,在 输出拉低后,等待一个外部提供的握手信号( 变低。当 信号返回高电平时, 也 将 带回高电平,然后经数据总线传输。 下面介绍典型的 接口。 允许 直接与外围设备连接,如 或别的使用了 位 和 位并行接口的数据逻辑设备。 提供的外部引脚有输出( 、输 入( 、数 据 总 线( )以 及地址线( 图 在 系统中的位置 图 波形实例 在内部 的波形描述符描述每一个 信号的行为。波形描述符通过 固件程 序在初始化阶段加载到 寄存器中,并在代码执行中始终在 接口上完成处理工作。 图 所示的是一个 与外设之间典型接口的方块图。 图 对外设的接口 接下来,将详细介绍有用的特性和实现高效 设计的步骤,包括外部 义和内部寄存器设置以及在该接口上 固件必须执行的数据处理工作。 硬件 连接的定 表 列出了与 的相关内容。 硬件相关的寄存器,对于每一个寄存器的详细描述,可参见附录 表 与 硬件相关的寄存器 注:在这里,寄存器名字中的 为 或 分别对应端点 或 端点 和 与 不相关。 外部 接口 提供 了许 多通 用的 输入 和输出 信号 ,外 部设 备可 以与 接口信号如表 所列。 实现“无胶合”连接。 表 引脚描述 控 制 输 出 引 脚( )通 常 被 用 作 选 通( 使 能 线 )、读 写 线 等。准 备 好 输 入 引 脚( : ),通 过 采样,并且能强制进行诸如等待(插入等待状态)、继续或重复等处理操作, 直到进入特定的状态。 数据总线是 引 脚 的 集 合: 一个 位宽数据的 接口使用引脚 一个 位宽数据的 地址线( 接口使用引脚 。 )能够随着数据传输产生地址累加。如果需要更多的地址 线,那么可以使用其他非 信号(例 如,通用 引 脚 )。 接口时钟 ,对于外部逻辑的同步接口,能被配置成输入(默认状态)或输出接 口时钟。 ]引脚是输出信号,它们表示当前 状 态值 ,仅用 于 波形的调试。 默认 引脚配置 通过它的 引脚配置为“端口”模式而脱离复位,而不是配置为“ 主控制器” 模式。为了配置 模式的引脚,在 寄存器中的 ]位 必须被设置为 。 个控制 信号 和 引脚封装的 带有全部的 个控制输出引脚 ,而 引脚封装的 只有其中 个控制输出引脚 波形边沿可以被编程,使得可以达到每 一个 时钟周期都可以传输(如果 工作在 时 ,则 每 一次)。默 认状态时,这些信号被配置为高电平有效。 下面介绍控制输出模式。 如表 所 列 , 控制引脚( )有下列几种工作模式: 可以是 输出(三态)或漏极开路输出; ]可 以 是 输出(三态)或漏极开路输出。 如果 被配置为三态状态,则 就不能被配置为三态状态。 表 输出模式 个准 备好 信号 和 引脚封装的 带有全部的 个准备好输入引脚 ,而 引脚封装 的 只有其中两个准备好输入引脚 输入可以同步或异步采样,当 。 工 作 在 异 步 方 式( 时, 输入信号不 得不延时一小段时间(在 时,近似等于 。换句话说,在 的 输入“观察 ”到的,其实 是在 之前发生的状态。 个 地址输出信号 个 地址线 是有效的。如果 地址线被配置为输出,则向 寄存器写操作将立即驱动这些引脚。 引擎能够随之在波形描述符的控 制之下对它们进行累加。 地址线可以通过对关联的 位和 位清 而 被 设成为三态。 个 输出信号 个 状态线 作为 的交替配置是很有用的。它们默认 为通用输入信号,将 置 ,选择交替配置,并且调整 ]位设置。 ]引 脚 输 出 当 前 状态值,这个特性仅被用于调试 波形。 位数据通路 ( 默 认 )以 及 当 被配置为 主控制器模式时, 总是被配置为 。如果任何一 个 位( )置 ,那 么 将自动被配置为 ;如 果 所 有的 位被清 ,那 么 对于通用 是有效的。 位 传输的字长 数据以 位字节包通过 发送,而不是 位 字 长 。 当 数据总线是 位宽时, 在 上发送的字节可分为两部分:首字节在 上传输;而第 字节 则在 上传输。 接口时钟( 接口可通过内部,也可通过外部提供时钟源信号。 的内部时钟源能被配置为 或 ,而 且 可 通 过 引脚输出。如果 被设置为使用外部时钟源,则 引脚能由 的任何频率的时钟驱动。在上电复位时, 默认为内部 时钟源,正常极性, 输 出 禁 止 ,如 图 所示。 图 配置 选择内部或外部源: =外部; =内部。 选择 或 内 部 时钟: 。当 时,该位无效。 用于内部时钟源输出使能: =禁止; = 使 能 。 当 时,该位无效。 用于控制接口时钟的极性 转换(包括外部和内部时钟源): = 正 常; = 转 换 。 的反相能够使 与某些外部电路方便地连接。例 如,在读外部设备信号时,为了保证足够 长的设置时间,应用了 转 换 ,如 图 所示。 当 被配置为一个输入引脚状态时, 可以被应用的最小外部时钟频率是 图 通过转化 输出满足设置 时间 连接 信号引脚到硬件 在创建 的 与外围设备连接时, 首先要做的是定义硬件互连。 ①选择 设置:判定是使用异步还是同步接口。如果是同步的,则再选择内部或 是外部接口时钟。如果是内部时钟,则选择 或 ;如 果 是 外 部 时 钟,则 应当保证外部时钟频率为 ②确定合适的 数据总线数:如果对于接口的数据总线是 位宽,则 使用 引脚,并 设置 。如果对于接口的数据总线是 位宽,则使用 , ,并设置 。 ③分配 信号到接口:使得所有接口所列的信号成为从 到外围设备的驱动, 并且将它们分配为 , 输出。如果存在比可用的 输出更多的输出信号, 那么可通过 固件利用非 信号引脚来实现。在这种情况下, 输出 应当被分配为仅用于发送作为数据处理部分的信号。 ④分配 信号到接口:使得所有接口所列的信号成为从 到外围设备的驱动, 并且将它们分配为 输入 。如果 存在比可 用的 输入更多的输入信号, 那么可通过 固件利用非 信号引脚来实现。在这种情况下, 输出 应当被分配为仅仅用于接收作为数据处理部分的信号。 ⑤确定合适的 地址连线:如果接口使用一个地址总线,则对于最少有效位使用 ]信号线,而对于更多的有效位则用其他非 信号 。如果 不需 要 地 址 引 脚( 例 如 ,当 外 围 设 备 是 时),则 可以省略,而且 不连接。 硬件连接举例 表 中 ,举 例 说 明 了 与 一 个 标准接口的硬件连接。 表 所列过程与大的、更复杂的接口设计是一样的。 表 硬件连接举例 波形 如图 所 示 ,每 一 个 波形 描述符 能够定 义为 种状态,在每一种状态中, 又 能 被 设 计 为: 驱动(高 或低 )或 实施 输 出; 采样或驱动 数据总线; 累加 地址总线 的值; 累加指向当前 的 指 针; 触发一个 波形)中断。 另外,每一个状态可以采样下列中的任意两种: 输 入引 脚; 标 志; (内部 )标 志; 传输计数中止标志。 然 后,将 以上 两 者 进行“ 与”“、或 ”“、异 或 ”,并 且将 其 结果 转 移到 任 何 状态,或延 时 时钟周期的 中的一个特定值。 一些采样和转移的状态被称之为“决策点” ,而那些不进行采样和转移的状态则被称 为“非决策点” 图 状态机制图 固件挂钩 寄存器 寄存器的两个区段控制 状态 机制: 配 置寄 存器 一这些寄存器配置一般设置,并且报告接口的状态; 波形寄存器 这些寄存器由配置 状态机制的波形描述符来加载,全部为 字节,地址为 。推荐采用 来生成波形描述符。 直到通过 固件加载了程序配置寄存器和波形寄存器, 传输才能被初始化。 仅在 处于 模式(例如, 时,才允许存取波形寄存器。波形寄存 器在 引擎暂停时,才可以被写入。 如果要求动态地重新配置波形描述符,则只要通过写需要改变的字节即可完成,而不需要 加载完整的波形描述符设置(仅需要改变几个字节即可)。 设计 波形 波 形 的“ 程 序 ”就 是 所 谓 的 波 形 描 述 符,它 通 过 固件程序存储在波形寄存器中。 能支持 个波形描述符,其中的每一个都能被用于 种类型的传输,即单个写、单个 读 、 写或 )读。由默认状态,一个波形描述符被分配每一种传输类型,但是不需要保 留配置,例如,所有的 个 波 形 描 述 符 都 可 以 被 配 置 为 写的用途(参见附录 的 寄存 器)。 每一个波形描述符由 个 位状态指令构成,这些状态指令是对于 接口信号编程 的关键过渡点。在状态指令与 状态机制状态之间是一一对应的。在另外的一些情况 中,每一个状态指令定义 输出状态、 ] 的 状 态、 输入的使用以及 ]的行为状态等。 从一个状态转变到另外一个状态一般总是产生在 时钟脉冲的上升沿,但是,对于 大多数 时钟周期, 可以保留在一个状态不变。 状态 一个波形由多达 个可编程状态构成,它们是 以及一个特定的空闲状态 。当 程序转移到空闲状态时,则波形中止。 为了完成 处 理 , 程序必须转移到 ( 空闲 )状 态,不论 这个 状态 下 程 序当前是否正在执行。例如,一个 波形可能通过一个仅包含两个可编程状态( 和 的程序来定义。当希望中止时, 程序可以从 ( 或 转移到 在闲置状态中, 的状态是由 和 寄存器的内容决定的。 一旦一个波形被触发,另外的波形就不可以被启动,直到第 个波形停止。一个波形的中 止是通过 位( 或 ,或者通过 中断而有效。 如果 ,那 么 正忙着生成一个波形; 如果 ,那 么 由固件正在操作 处于闲置状态)和准备启动下一个 处理。 重 要 的 是 ,有 一 个 例 外( 为 了 迫 使 当 前 波 形 中 止,向 寄 存 器 写 入 ):当 处于忙状态时,向任何与 相关的寄存器写入操作都是非法的。如果那样做了,将导致不 确定的动作,例如像导致数据混乱等。 闲置期间 数据总线 在闲置状态期间, 数据总线( )能被驱动或处于三态状态,这依据 位( )的 设 置: 如果 ,那么 数据总线在闲置状态处于三态; 如果 ,那么 数据总线在闲置状态期间是主动驱动状态,这将取决 于由 波形在总线上最后所处位置的值。 ) 闲置 期 间 输出 在闲置状态期间, : 取决于下面的寄存器位: ; ; 。 在闲置状态期间,这些位联合起来决定了 ,具体情况如下: 如果 为 ,那么在闲置状态期间, ]直 接 表 示 的输出状态。 ]位决定 输出是 或是漏级开路:如 果 ,则 是 输出;如果 ,则 是漏级开路输出。 如果 为 ,则 ]就是对于 ]信号的输出使能, 并且 ]是对于 ]的输出值。在这个模式中, 和 是无效的。 闲置状态期间控制输出一览表如表 所列。 表 闲置状态期间控制输出 状态定义 每一个波形都是由许多状态构成的,每一个状态又由 可以是两个基本类型之一:非判决点( )或判决点( 位状态指令来定义。每一个状态 对于“写”波形,数据总线在每一个状态期间处于被驱动或三态状态;而对于“读”波形,数 据总线在每一个状态期间则处于被采集/存储或采集状态。 ) 非 判 决 点( )状 态 对于非判决点状态,控制输出( 在全部状态中,由 或三 态的 指令来定义。 非判决点状态在一个单位 周期中,具有一个可编程固定的持续时间。 图 所示 的是 非判 定状 态的 基本 概念 。图 中显 示了 一个 写波 形 ,对于 所有 的状 态简 单地 用等间距显示。虽然,实际存在 个可编程 输出,但在图 中仅显示一个 图 非 判 决 点( 状态 图 涉及到以下内容。 在状态 中: : 被 设 计 为三 态; 被设计为逻辑 驱 动 。 在状态 中: ]被设计为被驱动; 依然被设计为由逻辑 来驱动。 在状态 中: : 被设计为被驱动; 被设计为由逻辑 来 驱 动。 在状态 中: ]被设计为被驱动; 依然被设计为由逻辑 来驱动。 在状态 中: 被设计为被驱动; 被设计为由逻辑 来驱动。 在 状 态 中: 被 设 计 为 三 态; 依然被设计为由逻辑 来驱动。 在状态 中: 被 设 计 为 三 态; 依然被设计为由逻辑 来 驱 动。 由于在本例子中的所有状态被编制为非判决点,所以 自动将最后的状态( 转 移 为闲置状态。这是一个在其中 直到下一个 波形通过固件被触发的状态。 在这个例子中,状态 和 是相同的,状态 和 也是相同的。在实际的应用中,这些状 态有可能组合起来(由于每个非判决点状态在 周期期间可以被分配一个持续时间,所 以,为了“延伸”一个状态,没有必要去复制它)。如果对于一个波形定义的状态小于 个 ,那 么,在最后的被设计状态之后,闲置状态不能自动被加进来。这个最后的被设计状态的状态指 令将必须包括明显可以转移到闲置状态的分支。 判 决 点( )状 态 任何状态都可以被设计成一个判决点。一个判决点允许 引擎采集两个信号,这两 个信号可以是同样的信号。如果有要求,可以在采集值上执行布尔操作,然后,基于结果转移 到其他状态(或返回自身,保持在当前状态不变)。 如果一个状态指令包含了一个控制任务(预置 指 针、 地 址 累 加 等 ),那 么,不管状态是判决点,还是非判决点,这个任务总是在进入该状态时执行一次。如果该状态 是一个返回本身的判决点,那么,无论怎样它在每个循环中都可以被设计为可再执行。 利用判决点, 能执行采集任务(例如,在继续下一个状态之前,一直等到 线为 低电平)。如果在采集信号上的操作产生的结果为逻辑 ,则通过转移到一个状态;或者如果 结果为逻辑 ,转移到不同的状态。判决点状态也可以执行更复杂的任务。 在每一个状态指令中,对于采样的两个信号可从下列中选择: 个外部 信 号( ; 当前 标 志 的 一 个( 寄存器中的 位; 个“ 事 务 处 理 计 数 终 止 ”信 号( 取 代 状态指令也指定了逻辑功能( 或  )应用阈两个被选信号。如果要求作用的 状态只有一个信号,那么通常的程序就选择同样双倍的信号和指定的逻辑功能为逻辑“与”。 状态指令也指定状态是否转移到逻辑表达式的结果为 ,以及状态是否转移到逻辑表达 式的结果为 图 和图 所示的是用一个判决点状态(状态 创建波形的例子。非判决点状态 被用于其余的波形。 在图 和图 中,一个信号判决点定义为状态 。在本例中,输入准备好信号假设 连接到 ,若假设 为逻辑 ,则 用 于 的状态指令被配置为转移到状态 ;若 假 设 为逻辑 ,则配置为转移到状态 在图 中 ,直 到 信号变为低电平时 都保持在 ,随后就转移到 。图 所 示的 是,当 信号已经在 加入后变为低电平时, 的操作为 转移到 虽然在图 中显示 从状态 转移到状态 是即时的,但实际上不是这样。即使在 加入状态 前, 已经变为低电平,而在状态 中, 也要花费一个 周期。 图 一个判决点:等待状态插入 直到 变为低电平 图 一个 判决点 :不等 待状态 插入 ,此时 已经为低电平 在判决点状态内再执行一个任务 在前面叙述的这个简单的判决点例子中,一个控制任务(例如,在 ]上输出一个 字以及累加 )仅在判决点状态开始时执行一次,然后 就 处 于 等 待,反 复 采集 输入,直到这个输入“告知” 转换到下一个状态为止。 如图 所 示 , 也能在每次采样 时再执行控制任务,这个特性可用于在经 闲置状态时大量数据无法通过的突发情况,图 显示如何在 中进行设置。如 图 所 示 , 也可在每次采样 时,不再执行控制任务,此时控制任务仅在上升沿 过渡到 ,图 显示如何在 中进行设置。 图 在判决点状态中再执行一个任务 图 用 工具设置 图 中的波形 图 一个不再执行任务的判决点状态 图 用 状态指令 工具设置图 中的波形 每个状态的特征是由 字节状 态指令来定义 的 。这 和 注意:状态指令对于判决点( 和非判决点( 非判决点状态指令( 非判决点状态指令( )如 图 所示。 字节被命名为: 有不同的含义。 图 非判决点状态指令( 判决点状态指令( 判 决 点 状 态 指 令( )如 图 所示。 图 判 决 点 状 态 指 令( 下面具体介绍状态指令相关寄存器。 寄存器 这个寄存器的含义依赖于判决点位。 对于 ( 非 判 决 点 ),这 是 一 个 字 段 ,在 态的固定持续时间。 值被认为是 个 周期。 周期中,它保持这个状 对于 判 决 点 ),这 是 一 个 字 段 ,它 指 定 将要转移到的状态。 :如果逻辑表达式估计为 ,则指定 将要转移到的状态。 :如果逻辑表达式估计为 ,则指定 将要转移到的状态。 寄存器 这个寄存器设置许多状态特征。 位:该位在单向读或单向写波形是无效的。它指定是否单向数据事务处理应当 产 生( 从 / 到 或 处理。 寄 存 器 ),甚 至 在 写或 读事务 :使 用 或 :使 用 位:在这个状态期间,指定是否生成一个 中断。 :当 这 个 状 态 到 达 时,生 成 中 断( 在 :不产生中断。 位:指定是否累加 地址线 :在状态开始时,累加 ]总 线; :不累加 ]信 号 。 位 如果 ,指 定是 否 应当提前到这个状态开始之前。 :移动在 中的下一个数据到顶端; :不预置 当波形应用于 时,下一位无效。 如果 ,指定数据应传输到 或 ,或是从这两个 寄存器传输出来。 :使用 :使用 位:指 定 数据总线是处于驱动、三态还是采样。 在 写 期 间: :用输出数据驱动 数据 总线; :三态(不驱动总线)。 在 读 期 间: :采样 数 据 总 线 并 储 存 数 据; :不采样数据总线。 位:显示状态是判决点,还是非判决点状态。 : 判 决点; :非判决点。 寄存器 这个寄存器仅被用于判决点状态指令。它指示输入( 和 以及逻辑操作 过 程( )应用于这些输入。逻辑操作过程的结果将决定 将转移的状态(也可以参 见 上 述“ 寄存 器”的相关 内容 )。 () 和  位 : ; : ; : ; : : : ( ; ; ( 或 事 务 计 数 中 止 ,如 果 标 志( 或 ,经 寄存器第 位 位 )。 预 选; : : : : 和 输入在每一个 的上升沿被采样。逻辑操作过程应用,随后 转移发生在下一个上升沿。 这个寄存器仅对判决点指令有意义,当 寄存器的 位被清 时,这 个寄 存器 的内容被忽略。 寄存器 这个寄存器控制 个控制输出( : )的状态,此期间的全部状态由这个状态指令 来定义。 位:如果 ,则指示相应的 输出信号是否为三态。 :驱动 :三态 位:在某完整状态期间,指示该状态设置每一个 信号。 : 高 电 平; :低电平。 如果在 寄存器中的 位被置 ,那么输出驱动将为漏级开路。 如果在 寄存器中的 位被置 ,那么输出驱动将是 电平。 下面介绍波形描述符的结构。 多达 个不同的波形可以被定义。每一个波形描述符由多达 个状态指令构成,它们由 本节定义方式来加载到波形寄存器中。波形描述符地址如表 所列。 表 波形描述符地址 在每一个波形描述符中,状态指令被打包成表 中所描述的形式,即“波形描述符 结 构 ”。波 形 描 述 符 作为一个例子显示。其他确切的波形描述符结构与波形描述符 相 同 ,只 是具有更高段的 地址。 表 波形描述符 结构 续表 固件 与 固件相关的寄存器如表 所列。 表 与 固件相关的寄存器 这些寄存器名字中的“ ”为 使用 与其他应用源代码连接。 或 ,端点 和端点 开发套件中提供的 输出包括如下的基本 与 不相关。 可 以生 成 代码,利用它可以 框 架 和 功 能: 从 生成波形数据来配置 :这里配置其他的端点 :这 里 控 制 缓 冲区 //设置 作为对于 中断的内部中断源 //使用 ,自动使能 // //使能 自动向 //使能 和 // :这里配置所需要的 中断 //使能 中断 //触发 写事务处理,采用 //向 //如果 //如果 写字节/字,采用 ,则写 字 节 ,则 写字 和 ) ,对 于 写 !( { )) ; } 触发 写事务处理,采用 //轮询 完成位 ,对于 读 单向读事务处理 固 件 产 生 单 向 读 波 形 框 图( 图 所示。用 工具设置图 如图 所示 。单向 读事务 处理波 形如 中的波形如图 所示。 图 固件产生单向读波形框图 图 单向读事 务处理波形 图 用 工具设置 图 中的波形 编制单向读事务处理程序的步骤如下: ①初始化 配置寄存器和波形描述符。 ②对于启动一个单向事务,编制 寄存器的虚拟读程序。 ③等待 显示事务已经完成。当事务完成时, 位( 或 将被设置为 ,并将产生 中断。 ④根据总线的宽度和启动另外事务的要求,读数据可以从 和/或 寄存器中重新得到(或者从这些寄 存器的特殊功能寄存器空间复制得到)。 仅在 位模式中,数据更多的有效字节 ,可 从 寄 存 器 读到。 在 位和 位模式中,数据最少有效字节可通过下列形式中的任何一种读取。 读 :读取最少有效字节并启动另外的单向读事务。 读 :读取最少有效字节,但是不启动另外的单向读事务。 下面是两个 程序片断,举例说明了如何在 位模式中编制单向读事务程序。 单向读事务处理程序 )单向读事务初始化程序 单向写事务处理 固件启动单向写波形框图( )如 图 所示。单向写事务波形如 图 所示。利用 工具设置图 中的波形如图 所示。 单向 写事 务比单 向读事 务的 处理更 简单 ,这是 因为没 有类似 虚拟 读操作 的要求 。执 行一 个 单 向 写 事 务 的 步 骤 如 下: ①初始化 配置寄存器和波形描述符。 图 固件启动单向写波形框图 图 单 向 写事 务处理波形 ② 如 果 在 位 模 式 中( )向 写最多的数据有效字节, 然后向 寄存器写最少的有效字节,就可以启动一个单向写事务。 在 位模式中,只要简单地向 寄存器写一个数据,就可以启动一 个单向写事务。 ③等待 显示事务已经完成。当事务完成时, 位( 或 将被设置为 。如 果 被 激 活,将 产 生 中断。 下面是两个 程序片断,举例说明了如何在 位模式( 中编制单向写事 务处理程序。 图 利用 单向写事务处理程序 工具设置图 中的波形 单向写事务处理初始化程序代码 读和 写事务处理 读和 写波形从/向 的从属 传输数据(详见第 章)。这个波形通 过向 写数据来启动。这里的“ ”表示 或 )从/向被传输的数据,或者 向 寄存器传输数据。 读或 写波 形通 常传 输一 个长 数据 流比 传输一 个单 字节 或字 更好 。通 常 ,当一 个 标 志 提 交 时( 例 如 ,当 一 个 为满或一个 为空 时),或 者在一 个规 定数量的事务之后,这个波形就被程序终止。 一个“事务”为一个单字节(如果 或字 (如果 从/向 的传输。用 的 术 语 来 讲 ,事 务 就 是“ 激 活 ”或 者“ 下 一 个 数 据 ”中 的 任 何 一 种 。 事务计数器 对于 ,为 使 用 事 务 计 数 器 , 用 要 求 的 事 务 数 值 ( )加 载 。当 读或写波形在那个 上触发时, 将自 动 传 输 规 定 数 量 的 字 节( 或 字 ,如 果 时 )。 这个操作模式被称为长传输模式,当事务计数器被用在这个方式时,波形描述符在每个事 务之后将转移到闲置状态。 每经过一个闲置状态, 将递减事务计数,当它计满时,波形终止并且 位 置 位; 否则, 再执行全部的波形描述符。在长传输模式中,直到事务计数满 位时,才被 置位。 当事务计数激活并在每次通过闲置状态时, 检查满标志(对于 )或空标志 (对于 。如果标志被提交,那么 处于暂停,直到上溢出或下溢出的威胁被再 次移除,或者它自动恢复。这样,在长传输模式中, 自动遏制数据流。 寄存器是可读的,并且它们由于事务发生而更新,所以 在任何时候都 能读到事务计数值。 在判决点状态中读事务计数状态 为了 采样判决 点状态 中事务 计数状态 ,将 置 它命令 用事务 计数状态取代 输入),然后,启动一个使用事务计数的 事务。当事务计数满时, 将 置 。 这个特性的典型应用就是用于“再执行”控制任务,在每一个事务之后,它允许事务计数器 不用经过闲置状态。 标志的选择 在波形期间, 可以检查 寄存器中的 或 (当前 的)。这些标志中的一个是通过 位来选择的,那个被选择的标志被称为 标志。 标志停止 当 被置 时 , 读和写事务通过 标志的提交而被终止。 当这个特性被使用时,它叠写事务计数器,仅当 标志提交时, 波形才终止(设置 为 )。 没有特定的波形描述符,而且在每个事务(例如,不使用事务计数器的波形) 波形描 述符经过闲置状态转换都不受影响。尽管如此,在闲置状态中, 的自动遏制还是要发 生,所 以,向 已经 满了 的 写数据或从空的 中读数据并没有危险。 除非固件通过向 寄存器写数据来半途终止 传 输 ,那 么 只 有 标 志的提交才能终止波形并将 位置位。如果 标志不提交,那么一个波形可以永远 执行下去。 仅仅 当通过 闲置状态 过渡时 才能被 测试 ,并且不 能被锁存 。如果 一个 标志提 交在一个状态中发生,并且下一个状态是判决点,它用于检测 标志和等待,直到在允许 状态机制继续闲置状态之前取消这个提交,则 将自动转回状态 ,就好像 标志从 来没有提交过一样。 读事务处理编程 固件启动 读波形框图如图 所示。 读事务实例如图 所示。 读事务波形如图 所示。 图  中的波形直到事务计数器计满(在这个例子中,是直到计数到 )都在运行。 在每次 经过闲置状态 ,事务计数器 就被递减和采 样。 波形的每一次反复都是从 数据总线读一个数据值到 ,然 后 ,递 减 并 检 查 事 务 计数器。当它计满时, 位被置 ,并且 中断请求有效。 利用 工具设置图 中的波形如图 所示。 一种典型情况是,当执行一个 读 时,在 波 形 中 只 需 要 一 个“ 激 活 ”,因 为 每 一 个“ 激 活”的执行都使得内部 指 针( 以 及 )自 动 累 加 。 执行一个 读事务处理的步骤如下: ①在 寄存器中,设置 位为 ,并且对于接收数据的 用相应的值加 载 : 编制 检测事务的完成情况。由于用于所有的 事务,当事务完成时, 图 固件启动 读波形框图 图 读事务实例 寄存器的第 位( 位 )发 送 信 号 。 ③编制 向端点提交从 来的数据。该数据可通过下述两种方法从 到端 点传输。 不在数据通路中, 自动从 数据总线向 提交数据。 :固件必 须通 过向 或者 (通过 )写 操 作 手动提交数据。 下列这些程序片段,举例说明了如何在 位模 式( 中当 时 图 读事 务 波形 编制 图 利用 读事务处理程序。 读事 务 处 理程 序 工具设置 图 中的波形 读事务处理初始化程序 读 ,经 提交包的程序 读 ,经 提交包的程序 固件存取 在 包中,自动( 包( 与 手 动( 之间仅有一点不同,就是包长度特 性( ,如图 所示。 图 读 事 务 处 理 源 代 码( 读事 务处理( : 图 显示固件可以通过 来干预存取。 图 固 件 干预( 固件存取 包( 在手动 模 式( 时,固件有如下的操作: ①当缓冲区有效时,固件可通过向 寄存器写相应的 ,提交(传递)从主控制器 到主机发 送包。 ②通过向 寄存器写 ,固件可跳过一个包。 ③固件可作为源来发送或编辑一个包(例如,直接对 值和设置 进 行 写 操 作 ),然 后 再 写 具体操作程序如下。 通过向 寄存器写相应的 值来提交一个包的程序( )通过写 来 跳 过 一 个 包( )的 程 序 )通 过 向 的写操作发送一个包的程序 写事务处理编程 图 所示为固件启动 写 波 形 框 图,而 图 所示为 写事务处理的一个 实 例。在 这 个 实 例 中,直 到 事 务 计 数 器 计 满,图 所示的波形才停止运行(在这个例子中 是直到计数到 。事务计数器在每次经过闲置状态时就被递减和采样。 图 固件启动 写波形框图 图 写事务处理实例 图 写事务处理波形 波形的每一次反复执行就从 向 数据总线写一个数值,然后递减并检查事务 计数器 。当它计满 时, 位就被置 ,并且 中断请求被激活。 利用 工具设置图 中的波形如图 所示。 图 利用 工具设置 图 中的波形 当编制一个 写 程 序 时 ,在 波 形 中 只 有 一 个“ 下 一 个 数 据 ”是 必 需 的,因 为 每 一 次“ 下 一个数据”的执行都将累加 指针。 编制一个 写事务处理程序的步骤如下: ①在 寄存器中,设置 位 到 ,并对接收数据的 用相应的值加载 : 。 ②对 编程,检测事务处理的完成情况。由于用于所有的 事务,所以当事务完 成时, 寄存器的第 位( 位)将发送通知信号。 ③编制 程 序 ,提交 (传 递 )从 端点 到 的数据。数据可以通过下述两种方法 传输。 不在数据通路中, 自动从 向 数 据 总 线 提 交 数 据; :固件必须通过写 手动向 数据总线提交数据 (通过写 ,固 件 可 以 选 择 跳 过 当 前 包 )。 下列这些程序片段,举例说明了如何在 位模式( 中就 时编制 写事务处理程序。 写事务处理程序 写 务处理初始化源代码 固件存取 为了达到最大的 被 旁 路 ,并 且 包( 带 宽 ,当 被自动提交到主机,如图 时,主机与主控制器被直接连接, 所示。 图 下面是配置为 不在数据通路中, 时的初始化程序的一个实例: 在 时 , 写事务处理源代码应当为如下形式: //无须从主机向主控制器发送 数据的代码 //当 并 时,在 字节 块中 自动提 交包 固件存取 包( 在 图 所示。 时,固件可以干预存取 包,可以选择跳过或提交 包 ,如 图 图件可跳过或提交 时 的 初 始 化 代 码: 在手动 模 式( 中,固件应当有如下操作: ①当缓冲区有效时,固件可通过将( 寄存器中的 位( 清 ,提 交(传递 )从主机到 主控制器发送 包。 ): ( !( 当 “ 非 ”空 时 )) ,主 机 发 送 包 ,经过缓冲区发往主控制器 ②通过将 寄存器中的 位( 主控制器的包。 置 ,固件可跳过一个从主机发往 : !( //当 “ 非 ”空 时 , )) ,主 机 发 送 包 ,不经过缓冲区发往主控制器 ③固件可通过直接向 后将这个包的长度写入 写了 之后, 缓冲区写来编辑一个包(或者发送一个完整的 包 ),然 。对 的 写 入 就 提 交 了 编 辑 的 包 ,所 以 ,在 也就可以写了。 //不从主机应答所有的 包 //提高所有对于 范 围的 缓冲区 //新创建源发包数据 //向接口 新提交源发包 //跳过未提交的包(第 个 包 ) 释放 在所有的情况中, 缓冲区自动重装,以便它能接收下一个包。 当一个包通过固件程序已经被跳过时,并不通知主控制器。 在上电复位期间, 不被提交到主机。因此,在它的初始化程序中,为了保证全 部的 都能被提交到主机,固件程序应跳过 个包(这里 或 ,具体数值取决于缓 冲 深 度 )。上 电 复 位 后 ,为 保 证 是空的,必须进行初始化。其程序如下: 为 为 端点不用控制 //通过写 //通过写 来控制第 个缓冲区 来控制第 个缓冲区 突发 事务处理 可以被配置为自动重复事务处理,而不用固件程序干预。这些“突发”事务处理(必 须是 读或写事务)可 由事务计数器、 标志或 寄存器来控制。 下列这些程序片段,举例说明了如何利用在 位 模 式( 中就 时的 来编制突发 读事务处理程序。 突发 读事务处理程序 突发 读事务初始化程序 突发 读事务处理程序实例:写 来提交 //设置位 来使用 //设置位 来使用 )突 发 读事务处理程序实例:写 来提交 拥有附加特定 寄存器,用于 的信息,请联系 半导体公司的应用部。 接口 )接口。如果需要知道更多 第 章  硬件开发工具介绍 本章将介绍 的开发工具,让读者了解学习和开发 所需要的 必要工具。 半导体公司为 开发人员提供了专门的开发系统,为开发人 员提供了学习和开发的便利条件。本章重点介绍一款由上海思越电子科技有限公司( )开 发 的 开发系统,利用该开发系统可以加快学习 和开 发的 速度 。与 半导体公司提供的开发系统相似,该开发系统不但具有较完善的 硬件支持和设计方案,还配有大量的例程供学习和借鉴,可以达到事半功倍的效果。本书后续 章节的例程和实例都基于 开发系统,并在该开发系统中得到了验证。 开发系统简介 概述 半导体公司的 是一款高密度集成电路,为 外围设备提供了 一种高度集成的解决方案。 有以下 个 主 要 的 特 性: 系 列 芯 片 提 供 一 种“ 软(”基 于 的)解决方案,根据这个特性可以实现反 复配置和方便地对设备固件程序更新; 提供了全速和高速 传 输 方 式; 系列芯片的 内核已经完成了很多 事务处理工作,这样, 就可以简化固件程序代码,并可加速 的学习和开发过程。 对于使用 芯片研制 外围设备,为了有助于缩短开发时间和学习过程,利用 现有的开发系统是一条捷径。 芯片包括 个 处 理 器、 个串行接口引擎 个 收 发 器、 片上 存储器以及 个通用可编程接口( 是一个全面集 成的解决方案,它占用更小的电路板空间,并可缩短开发时间。 拥有 个独特 的架构,其中包括 个 智 能 串 行 接 口 引 擎 。它执行所有基本的 功能,将嵌入式 解放出来用于实现专用的功能,并保证其持续的高性能传输速率。 还包括两个通 用可编程接口( ,允 许 它“ 无 胶 粘 接 ”即 可 与 任 何 或 进行连接;并且它还支持 所有通用总线标准,包括 和 完全适用于 ,并向下兼容 开发系统框图 开发系统框图如图 所示。最终的 应用系统应该包含以下几 部 分: 设备专用的 设 备 驱 动 程 序; 通用 设备驱动 程序; 固 件 程 序; 用户 应 用 程 序( 可 选 )。 在系统开发期间, 系统看上去与最终的应用系统稍微有些不同。对于处于开发 的系统,开发环境提供了调试工具。为了实现系统的开发,首先,监控程序被下载到 处理器并且运行;然后,使用 调试工具,可以加载固件程序,并通过单步调试和设置 断点来调试这个固件程序。一旦固件程序被加载, 控制面板程序(用 驱动) 将允许进行 传输,从而测试 控制固件程序。 图 开发系统框图 初始下载过程 系 列 芯 片 提 供 了 一 个“软(”基 于 )解决方案,允许无限反复配置和更新系 统。为了实现这一点,在系统运行前,系统必须经过初始下载过程。下面的例子详细描述了当 开发板插上主机时,主机和基于 设备的运行步骤。 这个例子是重枚举操作过程,从主机下载 程序代码。当然,对于特定的应用,也可以 选择不同的方案,例如可从外部 中加载 程序代码。详情可参考第 章的相关 内容。 ①插入系统,开发板由 总线供电。 复位电路暂时保持 芯片为复位状态,直到 锁相环)锁定 振荡 器。与此同时, 芯片发出稳定的 或 )时 钟 。 内核检测到一个 连接到 总线,芯片内核从 读 和 ,并且覆盖硬件 和 (开发板上外部 中的 。) ④主机检测被插入的设备,并询问设备 ( 经 请求内核端点 ,最重要的 是询问制造商 ) 和 产 品 序 列 号( 。设备用 来响应。 主机发现这些 ,并知道加载装载驱动程序(一般是基于 构成的驱动 程 序 )。 装载驱动程序执行嵌入式 固件程序的 下载,并下载到 芯 片中。 装载驱动使得 处理器脱离复位状态,并开始执行固件程序。 固件程序模拟电气断开 设备与 总线的连接。 主机检测到设备的断开,从主机存储器中卸载已经存在的装载驱动程序。 固件程序重新将 连接到 总线。 主机检测到设备插入,并询问设备 固件程序用下载配置后的设备 和 响应主机。 主 机得 到 了这 些 ,并加载类驱动程序或客户设备驱动程序。 此时,主机驱动程序和 固件程序就被加载和运行,并且开始执行具体应用中 所需要的传输和控制功能。同时也可以编写用户应用程序来调用设备驱动程序,完成 相应的发送和接收数据。 开发系统配套内容 由上海思越电子科技有限公司开发的 开发系统提供了完整的软/ 硬件来加速固件与主机驱动程序的开发工作。与其他使用仿真设备的 开发工具不同, 开发系统在整个开发过程中都使用真正的设备,即 以下列出了开发 所需要的基本软/硬件工具。 开发系统硬件 开 发 板 一 块; 连 接线; 带屏蔽的 连 接 线( 用电缆)。 软件工具与文档 控 制 面 板( ) 软 件; 通用驱动程序和源程序; 固件装载设备驱动程序和样例源文件; 固件库和源文件; 应用程序框架和源文件; 固 件 样 例 的 源 程 序; 控制面板使用指南; 通用驱动程序的文档; 固件装载驱动程序的文档; 固 件 库 文 档; 技术参考手册。 编 译器、汇编 器、链 接 器、调 试器、监控 程 序和 使 用帮 助 文档 等 以 上 版 本; ; 系 统( 。 其他推荐使用工具(系统未提供) :用 于 驱动程序调试。 协议分析仪。 开 发 工 具; 开发系统安装 软件安装 将安装光盘放入光盘驱动器,运行 所示的 安装界面。 安装 程序 ,将 出现 如图 图 安装界面 控制面板软件是一个用于 芯片通信的 应用程序。 安装中,应按照提示说明一步一步地进行安装操作。在安装完成后,可以从“开始”菜单选择 项运行该软件。 要想卸载控制面板软件,可在 的控制面板中选择 项来 实现。 开发环境用于编译、链接、调试 汇编程序,从安装程序中安装的是 评估 版,程序目标码限制在 以内。在安装完成 后,需要重新启动计算机。如果有 的正式版本,可以在上述过程完成后进行安装,这样程序目标代码就可以不受 的 限制。 硬件安装 硬件安装应遵循以下步骤: ①通过 连接线将 连接开发板 串口)。 开发板连接到主机上,即连接 电 缆 和 串 口 线( 默 认 连接示意图如图 所示。 图 连接示意图 ②安装主机装载开发板的设备驱动程序。该驱动程序是在安装 控制 面板软件时同时自动安装到系统中的。在用 监控程序开发时,开发板上的绿灯 变亮,表示监控程序已经经过 电缆下载到了开发板上,并正在运行。 验证开发板是否安装成功,只要运行控制面板程序就可以知道。验证的具体方法如下: 首先,运行控制面板应用程序,然后,单击控制面板上的 功能按钮, 在面板上的名称是 。控制面板将显示从开发板响应的如下信息: 如果看到了上述信息,就证明开发板安装成功。其中, 值为 ,是 半导体公司的 值为 ,是 开发板的产品识别码。可 以先单击 按钮清屏,然后再单击 按钮。在任何时候都可以通过单击 按 钮来得到开发板的相关信息。 开发板 总体介绍 由上海思越电子科技有限公司开发的 开发套件为 设备 的开发提供了一个良好的工具。开发板使用的是 引脚的 芯片,并且包含 个用 于扩 展接口 的引 出端。 板上 所有 的电源 电压 均为 ,开发板内由 连接器供电。 开发套件硬件具体说明如下: 使用 专 用 芯 片; 具有可扩充的 提供 数据总线和 地 址 总 线; 提供两个 串行口; 提供 芯 接口; 提供 个 芯扩充连接槽(用于 功能引脚引出); 提供 电 源 电 压; 用来选择 类型的 具有两个功能强大的 位 总线 芯片,用于驱动 和 控 制 开 关 和 按 钮; 具有电源和中断/监控器指示灯。 开发板基于 系列 总线控制器,包含标准的 外设模块和 模块。 模块集成了 的收发器、串行总线接口机制、功 能接口单元和收发缓冲区。它可灵活地改变 的地址空间,并方便地进行内存扩充。 的 总线上接有两块 位 扩展芯片( )和一块用于 引 导 、标 识 设备的 。该 采用 引脚 封装,可插拔。 按钮、选 择开关和 段 通过 连接到 总线上。这样,一方面为用户调试 固件程序提供了方便;另外一方面空出 口供开发使用。其中一块 提供了到 段 的 位输出;另外一块提供 位输出,分别来自 个 按 钮、微 动 开 关 。另 外 ,设 有 按钮,按下按钮会引发远程的 唤醒。 片内有 的程序和数据共享的 存储器,另外,还增补了 的外部 。该芯片支持 调试的监控程序被装载到内部 区 ,在 外 部 调试用户程序 的 带有两个通用的异步收发器( ,可选择作为 通信。 开发板示意图及布局如图 和图 所示。 图 开发板示意图 图 开发板布局 总线扩展连接器 ( 总线控制器使用 )和 ,除 了 完 成 从 串 行 引导加载的任务外,还可用于连接 外围设备的通用接口。为了方便用户使用, 开 发板 上 专门 设置 了 总线扩展连接器,将 总线引出。 总线扩展连接器 共 有 个引脚,具体功能如表 所 列 。 表 在开发板上, 和 引线上都连接了上拉电阻。 总线扩展连接器功能 注意:即使在 总线上没有连接任何设备,也必须 连接这两个上拉电阻。也就是说,每个引线应当通过 电阻连接到 总线频率默认约为 ,也能被配置成默认频 率的 倍。当然,此时连接到总线上的设备应当能够支持 这个更高的速度。 选择和使能跳线连接器 开发板上提供的 选择和使能跳线 表 连接器,通过跳线短路块的不同连接,可实现选择 类型的目的,其连线排号和功能如表 所列。 当短接 时,选择 的 所谓的 的 是指容量较小的 选择和使能跳线连接器 ,包括 和 。它们可用于提供常规的 和 信 息,允 许 与用户设计的驱动程序对设备进行枚举。当短接 时 ,选 择 的 ,一 般 是 指 和 。它可以将用户的固件以 文件格式存放在其中,上电复位后,加载 到 内部的 中运行,实现设备的枚举。 和串口连接器 和串口连接器引脚及其信号如表 表 连接器 表 所列。 连接器 表 连接器 扩展连接器 开发板提供了 个 脚的扩展插针连接器和 个 引脚 扩展连接器,以方便与外部电路连接。各个连接器的信号连接如图 所示。 图 扩展连接器 信号连接 图 扩展连接器 信号连接 图 扩展连接器 信号连接 图 扩展连接器 信号连接 图 扩展连接器 信号连接 图 扩展连接器 信号连接 图 扩展连接器 信号连接 扩展 开发板上有两片 可提供调试 用。以下摘要介绍它们的基本特性。 )从地址为 开发 板上 的开 关和按 钮连 接到 ,其地 址是 。在读 位数据时,先发送 到 ,然后读出数据。另外, 引脚 是一个漏极开路输出引脚,当任何状态发 生变化时,都会产生一个低电平。而 又与 相连,所以任何按钮按下时都会启 动一次 的远程唤醒。 )控 制 段 的 ,其 地 址 是 ,发 送 一 个 命 令 到 ,然 后 写入字节。 地址分配 在调试程序装载后, 存储器地址分配图如图 所示。 图 地址分配图 注意:地址为 的存储器低端和 的 可用存储器是为用户程序留的可 用空间。还要注意,在“空( ”区域中没有安装程序,该部分地址可用于外部硬件和 总线扩展。 开发板整体操作流程 本节介绍 开发板与 主机连接的整体动作和操作流程。下面列 出 开发板开发过程的一般流程: ①主机检测新插入的设备(开发板),并询问其 ② 设 备( 开 发 板 )用 非下载开发套件设备的 响应(制造商: ;产 品: 驱动程序执行将 监控固件程序下载到嵌入式 中( 可 以是外部 ,也可以是芯片内部的 驱动程序使得 处理器脱离复位状态,并开始执行 监 控代 码。 当开发板上的绿色指示灯亮时,表示 监控程序已经在开发板上运行了。 ⑤一旦 监控程序运行,则可在主机上运行 调 试 程 序,并 通 过 串口下载应用程序固件代码到开发板上的内部或外部 中。 调试程序随之开始运行应用固件程序,并可进行单步调试和设置断点。 至 此 ,就 可 以 运 行 应用固件程序了。 固件程序模拟电气断开 与 总线的连接。 主机检测到 开发板断开后,就从主机的存储器中将 卸载。 固件程序重新将 连接到 总线。 主机检测到开发板的插入,并询问其 固件程序完全用下载配置的设备来响应。 主机得到了这些 ,并加载客户设备驱动程序。 此时 ,主机 驱动程 序和 固件程序就被加载和运行了,并且开始执行具体应用 中所需要的传输和控制功能。同时也可以编写用户应用程序来调用设备驱动程序,完 成相应的发送和接收数据。 下面结合开发板的具体现象来说明开发板整体操作流程。 首先,用户在插入 电缆到 主机时,如果使用的是 以上版本的操作系统, 则操作系统就会获取 系统驱动程序的安装信息 ,同 时 驱 动 系统程序 。用户只要查看 系统内容,就可以看到 驱动程序已经安装成功,如图 所示。 图 安装成功后在设备管理器中看到的信息 图 中显示的“ ”就 是 的驱动程序,用户可以执行 查看注册表信息。 运行 后可以在注册表中发现 下的 ,这就是所谓的 和 ,它们是 机 和 系统连接的重要参数。这些码被存放 在 系统的 )内。也就是用户在插上 到机 时, 上的 芯片内的 ,经 过 接 口 直 接 连 接 )并读取此信息。用以下方法可以验证 内的 和 信 息,如 图 所示。 图 启动 如图 所示,首先启动 到 上 运 行 ,在 运行 ,可 以 观 察到 如 图 所示的情况。 图 下方所列的 就是 与 机连接 的重要参数。其中 的第 字节 代表 芯片启动时的系统参数。 当 第 字节为 时 ,表 示 上的固件程序是由 机提 供并下载的。若此时连接 电缆,则控制权在 机 。 当 第 字节为 时 ,表 示 固件程序由板上 提 供 ,通 过 总 线 读 取 固 件 程 序 到 中,同时重新对 枚举,此时控制权在 本身。 知道了 的区别后,接下来以 为例加以说明:当接上 电缆后,系统加电并 通过 总线读取 信息, 机的操作系统会读取符合 的 的注册信息。下面列出注册文档 图 运行 程序 ;;下 面 的 ;;的 是对于所有的 设备。其受限于 系列芯片的,这些是硬编码的 ,将被报告为没有外部 由 面的注册信息可以发现 的踪 迹 。从前面 的叙 述中 可以了 解到 ,当 的第 字节为 时 , 中的程序是在 一侧下载的,这也就 证明了 不仅为 提供驱动,同时也会下载程序。用户可以利 用逻辑测试仪测试 上的 接口的 脚,来验证固件程序下载的 情形。这个下载的程序就是 的监控程序。由于 系统可透过 在线调试程序,所以当启动 系统后, 的监控程序就自动下载到系 统上,同时可随时由 来调试程序。后面还要详细叙述 调试。 从这里也可以得到提示,用户可以利用这一点简单判断开发板的正常与否。如果 的 监控程序能够正常下载,则开发板上的 发光二极管就会亮;如果不亮,则可能功能不 正常。 关于 开发套件更详细的资料,可以到 查询。 第 章  软件开发工具及其使用 第 章介绍了硬件开发工具及其使用方法,但只有硬件工具是无法完成对 的开发工作的。用户应当结合必要的软件开发工具,并合理搭配这些工具,才能最终完 成开发工作。其实,在第 章中已经简单介绍了开发工作所需的相关软件工具,其中在系统 开发程序安装完成后,有两个工具软件是必需的,即控制面板程序( 和 套装软件。本章将讲述这些软件及使用方法。 控制面板 控制面板的启动 当用户安装好 开发套件程序后,就可选择“开始”“ 程 序 ” 项直接运行 控制面板程序了。也可以运行 来启动控制面板程序。 如果没有连接开发板或开发板没有安装成功,那么启动控制面板程序后,将无法进入控制 面板应用程序,此时会出现如图 所示的界面。 图 没有连接开发板或开发板没有安装成功时的控制面板程序界面 如果用户正确安装了开发板后,即可顺利进入控制面板应用程序。此时,在操作系统的设 备管理器中可以发现在通用串行总线控制器中出现“ 如果在设备管理器中显示的信息是“ ,则 可 能是开发板上的 (一般配置为 )发生了错误。 如果出现这种错误情况,则可能由以下 种因素导致: ①未插 芯 片; 的类型和选择与使能跳线连接器的跳线不对应; ③开发板初始的 内码不正确。 但是,即使如此,控制面板程序和开发板仍然可以运行。 控制面板程序的基本操作内容 控制面板支持如下的基本操作: 取描 述符; 下 载 固 件 程 序; 从屏幕或文件中发送或接收批量数据; 收发同步( )数 据; 循环测试。 启动控制面板的步骤如下: ①通过 连接电缆将开发板与计算机相连; ②选择“开始”“ 程 序 ” 项,即可运行。也可 以直接运行 文件。 当启动控制面板程序时,系统首先检查 总线上是否存在 设备。若存在,则会 在主窗口生成相应的控制按钮,用户可以键人命令进行操作。控制面板界面如图 所示。 图 控制面板界面 主操作菜单 菜单命令 菜单命令如图 所示。其主要命令定义如下。 :查询所有的有效 设 备,并 将 它们 全部 加入 到下 拉列 表 框中 ,然 后打 开一 个 进 行操 作 。如 果一 个 设备是在控制面 板启动后插入的,则控制面板程序不能识别,此时 应当选用 来添加设备到 列表中。 :用 于 设计的辅助工具,利用它 可以方便 设计。 程序的退出可选择 中的 或直接单击右上角的“ 菜单命令 菜单命令如图 所示。 菜单命令 菜单命令如图 所示。 图 ”即可。 菜单命令 图 菜单命令 图 莱单命令 菜单命令 对 话 框( 属 性 )的 选项卡如图 所示。其各选项定义如下。 :允许选择更详细地观察传输信息的输出。 :允许选择想要观看的操作工具条。当选择时,可弹出适 当的工具栏,以便观察。当需要一个较大的屏幕观看区,或是更快地选择有效的操作 时,可选择该项有效。 :自动处理内部事务代替使用 按钮。 :防 止 操作被控制面板悬挂。 :指定悬挂操作的最多次数。如果运行超过了限制,那 么以后的操作将无效,不会被启动。用户可以在任何时候增加限制量,以允许进行发 送操作。 选项卡如图 所示。 :允许选项默认的 控制程序及其所在的位置,见 中有关监控文件选择的说明文件 。用户可以用浏览 按钮来选择默认的控制程序,当单击 按钮时,所选择的控制程序被下载到目标 系统中。 图 选项卡 图 菜单命令 菜单命令如图 所示。 菜单命令 菜单命令如图 所示。 选项卡 图 菜单命令 图 菜单命令 应用程序工具栏 如图 所示,应用程序工具栏提供标准的按钮,如 和 此外, 按钮可得到软件的版本信息。 按钮允许用户指定被使用的 器件或 器件。 图 应用程序工具栏 主屏工具栏 如图 所示,主屏工具栏包含一个标准 请求的下拉子菜单和一个 按钮来 发起命令传输,还包含与 设备相关的设备和接口标识字符串; 按钮清除 缓冲 区 的 内 容; 按钮下载监控程序到 设备。监控程序允许使用一个串行口来调试 开发的 目标代码。 图 主屏工具栏 操作工具栏 如图 所示,操作工具栏的下面是一个文本窗口,用于调试 传输所产生的输出。 当一个命令被发送和接收时,用于诊断的文本参数添加到该窗口。这些 命令和参数可以 被打印输出。当从下拉菜单选择一个 命令时,其他工具栏的参数随命令有效。 图 操作工具栏各选项定义如下。 :取设备描述符。单击 操作工具栏 按钮,获取设备描述符。屏幕显示如下: :取配置描述符。单击 按钮 ,获取配 置描述 符 。屏 幕显示如 下 : :取管道信息。单击 按 钮 ,获 取 管 道信 息 。该 设备 请 求 并不 产 生 传输,而只是简单地查询设备驱动程序,以取得管道的配置信息。 :取得描述符。单击 按钮,获取描述符信息。 :下载固件。单击 按钮,将下载固件到开发板上运行。此时,系统 会提示要求输入一个文件名,可选择一个 文件 作为设 备目标代 码文件 。在 目录下有许多 文件的例子。 :编程串行 。单击 按钮,选择一个 文 件 ,并 下载该文件到 中。 一般用来存放设备的 号 ,以 便 在上电或插入时系统能知道设备的特性。因此,编程 可改变 的 枚举方式。基于 开发板,可将 格式的文件写入 中 , 其 步 骤 如 下: ①用新的 替代开发板上的 ②选择跳线与 相 对 应; ③单击控制面板上的 按 钮 ,选 择 文 件 ; ④ 下 载 文件; ⑤下载完成后,单击 按 钮; 单击控制面板的 按钮。 单击 按钮,查看管道信息,如果发现默认的管道信息变成了对应程序中的管道 信息,则表明该固件已经在开发板上运行了。 状态。取得最近 错 误的 状态 报告 。多 个 错误将对应单一 的一个 错误 这 种 错误一般直接通过控制平台来显示,但是,这样的 错误都以 的说明来取代。如果单击 按钮,将以手动的 方式请求最后一个 )错 误 。但是 ,许 多类 型的 错误 (例 如 , 错误的参数)在取得传到 总线之前就已经失效了。因此,这样所获得的 错误一点意义也没有。单击 按钮将可以看到最后一个 的错误,如果可 能,还可以将此错误译码。 :将 的 重 置 进 入“ 保 持 ”状 态 。 :将 的 重 置 进 入“ 释 放 ”状 态 。 制造商请求工具栏 制造商请求工具栏如图 所示。用户可以在此工具栏中进行各种制造商请求所要设 置 的各 种 参数 。关 于 这方 面 的详 细资 料 可参 阅 通用驱动程序)的规范。这些制造商请求的参数是根据执行目标设备的范例程序而定的。 例如 程序可被加载到开发板上,完成各种制 造商特定的请求。一旦将 程序加载,用户就可以修改 的字段,以便送出不 同 的 请 求 ,例 如 ,读 取 位 于 开 发 板 的内容等。 图 制造商请求工具栏 对于制造商请求工具栏,各种参数的定义如下。 :所呈现请求类型的 数值。 :索引值。 :长度的字节。 ; :数据的字节字段。 同步传输工具栏 同步传输工具栏如图 所示。在此工具栏中,键入各种同步传输所要设置的各种参 数和同步传输的总内容量的大小(限制在 以 内 )。 当用户要使用 按钮将数据传送出去时,不断累加的 数据会填入缓冲区中。 此外,如果要将一个特定数据的文件通过同步传输传送出去,就要使用位于管道操作工具上的 按钮。而对于同步传输更详细的数据,可参考 节。 图 该工具栏各种参数的定义如下。 同步传输工具栏 ( 管 道 ):用 户 可 以 选 择 管 道 或 端 点 来 操 作 。 (包的数量):这个数值是用户要从设备读取的同步数据的帧数目。而每一次 帧 )发生时,就会产生一个同步传输。例如,如果设置 为 用户将可同步传输 的数据。这个参数必须符合下列公式: ) (包的大小):以字节来表示包的大小。这是在每一帧中所要读取的同步数据的大 小。通常这个数值是与同步端点的最大包值相符的,但也可以小于最大包值。 (缓冲区数量):所要使用的缓冲区的大小。针对这个传输动作,所要使用的传输 请求的区块)的值。 是较佳的默认值。 每一缓冲区的帧数):这个数值即是在单一 中所要传输的 帧 数据的数目。 是较佳的默认值。 批量 传输工具栏 批量传输工具栏如图 所要设置的各种参数。 所示。用户可以在此工具栏中键入各种批量传输(字节模式) 图 批量传输工具栏 该工具栏各种参数的定义如下。 (管道/ 端点 ):可以分别选择管道/端点加以操作。 长度):所要传输数据量的大小。 ( 批 量 循 环 测 试 ):用 户 可 以 经 过 端点送出数据并且经过 端点加以 读取的方式执行循环的测试。这个操作需要先在 设备上执行特定的程序, 使得在一个循环中能先将端点连在一起。 (十六进制字节):十六进制的数据字节。 管道操作和设置接口工具栏 管道操作和设置接口工具栏如图 ( 字 节 模 式 )所 要 设 置 的 各 种 参 数 。 所示。用户可以在此工具栏中键入各种批量传输 图 管道操作和设置 接口工具栏 管道/端点):可以分别选择管道/端点加以操作。 操作模式):允许用户设置管道的操作。 (文件传输):通过这个文件传输的操作,用户可以选择同步或批量端点来作 为文件传输所依据的模式。当单击这个按钮时,应用程序将会询问文件名。如果用户 选择了 管道,则会打开这个文件并通过 管道将文件传输出去。同样,如果 用户选择了 管道,则也会打开 这个文件,并通过 产生)接收数据。 ( 接 口 ):选 择 接 口 索 引 值 。 ( 切 换 设 置 ):选 择 切 换 接 口 索 引 值 。 管 道(有 时 候,这 个管 道 必 须 由 的具体作用及其操作方法简介 在主控制菜单的 菜单命令中的 是用于 设计的辅助工具,利用它可 以方便 设计。 图 所示的是 的主界面,用户可以通过下拉菜单及弹出对话框来对 程序进行编辑和修改,随之生成 程序,供用户使用。图 所示的主界面中, 显示的是 程序文件内容。某些区域的内容显示为蓝色,并且当鼠标指示其上时会 显示为高亮,这些区域的内容可以由用户根据需要选择修改,更改的结果将更新 程序。 图 主界面 提供如下的功能。 文件菜单:提供标准文件菜单操作。 编辑菜单:提供标准编辑菜单操作。 显示菜单工具和状态栏:用户可以选择显示或隐藏该工具和状态栏。 菜单:提供标准 菜单操作。 菜 单:提 供 菜单操作。 工程 )菜 单:提 供 生 成 新 的 工程。 帮助菜单:包括版本信息和帮助文件。 利用 调试程序 利用 的功能,必须首先下载 到开发板上运行。当 开发板插上主机时, 就自动下载到了开发板上运行。因此,为 了保证 在开发板上运行,最简单的方法就是拔下 连接电缆,再重 新插上,或单击开发板上的 按钮。如果 绿色指示灯亮,则表明 已经在开发板上正常运行。默认的 被装入片外的 空 间 ,并 使用 ) ,其通信波特率为 注意:单击开发板上的 按钮并没有重新初始化 ,因此绿色指示灯保持原状态, 可能不亮;但是 被重新装入。 还可以使用开发板上控制面板的 按钮下载 程序。该程序放置 在 路径下,共有 个可以 利用的文件。 可根据硬件配 置选择 文件。 通过 串行口建立从主机到开发板的连接。开发板上有 和 两个 串 口 ,默 认 使 用 口。主机如果有多个 口,则通过配置菜单进行设置。 这里,以 \ 目录下的例子为例,说明如何使用 软件进 行程序调试。其步骤如下: ①正确连接 串行口电缆和 电缆。 一旦 在开发板上正常运行,则选择 项 ,启 动 ③打开 目录下的 工程文件,如 图 所示。 图 工程文件菜单 ④确认使用正确的串行口和波特率。选择 项 ,如 图 所示。选择 选项卡,进行 设置,如图 所示。选择 选 项 卡 ,进 行 设 置 ,如 图 所 示 。选 择 选 项 卡 ,单 击 按 钮 ,如 图 所示,设置波特率为 ,并正确选择在主机 上 使 用 的 口。单击 按钮,关闭该窗口。 ⑤选择工具栏的 按钮启动 ,如 图 所示。这时固件程序通过 串口下载到开发板中,如图 所示。 选择 菜单中的单步( 、宏单步( 、连续运行( )和 停 止 )等各调试命令,查看运行结果。 图 选择目标板连接设置 图 设置 图 设置 图 设置串口和波特率 图 启动 图 调试界面 第 章  固件框架和函数库 在使用 芯片进行应用开发中,利用 固件框架可以简化和加 速开发基于 芯片的外围设备。而 固件函数库则提供了一系列 函数来进一步加速 外设固件程序的开发,这就大大提高了用户开发的效率。本章将对 的固件框架和固件函数库进行详细讨论。 固件框架 固件框架主要包含初始化、处理标准 了现成的 程序代码,只需简单地提供 一个功能完善的 外设。 设备请求以及 挂起时的电源管理等,提供 描述符表及编写外设功能代码,就可以开发出 概述 框架完成 设备 的基 本功能 需求 。通过 链接一 个描 述符表 ,甚 至不写 一行代 码就 可以 开发出一个功能完善的 外设功能。利用框架提供的结构函数,可依次完善各函数的功 能,逐渐开发出功能完善的 外设。 框架完成了一个简单的任务循环(见图 。首先框架初始化内部的状态变量,然后调 用用户初始化函数 。从该函数返回后,框架初始化 接口到未配置状态并使能 中断。然后每隔 进行一次设备重枚举,直到端点 接收到一个 包。一旦检测到 包,框架将开始交互的任务调度,其任务调度的步骤如下: 调用用户函数 ( 。这部分程序由开发者填写,以实现 外设的主要功能。 判断是否有标准设备请求等待处理。如果有,则分析该请求并响应。 ③判断 内核是否收到 挂起信号。如果收到,则调用用户函数 从该函数成功返回后(返回值为 ,再 检 测 是 否 发 生 唤醒事件。如果未检测到,则 处理器进入挂起方式;如果检测到,则调用用户函数 程序继续运行。如果从 函数返回 ,则程序继续运行。 标准请求和 专用请 求由框架分 析和执行 。默认情况下 ,对标准请 求执行 规 定的响应 。无论如何 ,框架 提供交互的连接 ,以允许用户程序处 理或覆盖指定的设 备请求 。 中断也交给框架进行处理。任务循环的流程图如图 所示。 图 固件框架流程图 构建框架 该固件框架是用 编 写 ,其 中 使 用 了 许 多 对标准 译器不能保证编译的程序没有问题,因此,编译该库最好还是使用 批处理文件可以用来生成该库。用户可以在命令行下键入: 的扩展。使用其他编 。位于库目录下的 来了解 命令行的选项列表信息 创建该固件库需要用到如表 所列的源文件。 表 固件库源文件 续表 框架函数挂钩 框架函数提供交互的函数挂钩来方便用户添加完成特定功能的代码。所谓的函数挂钩就 是应用程序之间的桥梁,其作用就好像用钩子在应用程序之间建立联系。框架函数挂钩非常 简单,所能完成的功能也非常有限。用户可以根据实际需要向函数中添加代码,以实现特定的 功能。根据调用对象的不同,框架函数可分为以下 类 : 任务分配器(以 为字首); 标准设备请求分析(以 为字首); 中断处理(以 为字首)。 下面给出这些函数的完整描述。 任务分配器( ) 【功能描述】该函数在框架初始化期间被调用。在设备重枚举和任务调度启用之前调用 该函数,用来初始化用户的全局状态变量。在该函数中,用户可设置整体状态变量的初始值, 并可规定各种端点资源的使用(包含中断)以及配置外围接口的输入/输出等。 ) 功能描述】在设备工作期间,该函数被重复调用。它包含一个执行外设功能的状态机。 该函数在高优先级的任务处理完后返回。然而,如果不能从该函数中返回,则会使得框架不能 响应设备请求和 挂起事件。如果某项任务需要大量的处理时间,则应该将该任务分为若 干小任务,通过对该函数的多次调用来分批处理。 ) 【功能描述】该函数在框架进入挂起状态之前被调用。函数中应该包含使设备进入低功 耗状态的程序,然后返回 。当然,可以让函数返回 ,以阻止设备进入挂起状态。 ) 【功能描述】该函数在设备被外部的唤醒事件唤醒且框架程序恢复处理后被调用。此时, 设备恢复到正常的操作方式。 设 备 请 求( ) 【功能描述]该函数在框架解码并执行 设备请求之前被调用。寄存器阵列 中包含当前 字 节 的 命令。通过分析用户代码来决定哪个 命令被执行。如果函数返回 ,则框架将分析并执行该命令;如果返回 任何处理。 ,则 不 做 ) 【功能描述】该函数在框架执行 设备请求之前被调用。寄存器阵列 中包含当前 字节的 命令。在缺省情况下,框架分析描述符表,以确定新 的配置接口和端点。然后,框架配置 的控制寄存器,以履行新的端点。如果配置被 设 为 ,则框架将禁止使用所有的端点;如果函数返回 ,则框架将执 行该命令;如果返回 ,则不做任何处理。 //当收到 命令时,就加以调用 //交由用户程序代码来处理 ) 【功能描述】该函数在框架执行 中包含当前 字 节的 果返回 ,则不做任何处理。 设 备请 求之 前被 调用 。寄 存器 阵列 命令。如果函数返回 ,则 框架 执 行 该 命令;如 //当收到 命令时,就加以调用 //交由用户程序代码来处理 [功能描述】该函数在框架执行 设备请求之前被调用。寄存器阵列 中包含当前 字节的 命令 。在缺 省情 况下 ,框架分 析描述 符表 ,以确 定新 的 接口 端点 。然 后 ,框 架配 置 的控制寄存器,以履行新的端点。如果函数返回 ,则 框 架 将 执 行 该 命 令;如 果 返 回 ,则 不 做 任 何 处 理 。 //当收到 命令时,就加以调用 ]存放交替设置值 //交由用户程序代码来处理 ) 【功 能描 述 该 数在框架执行 设备请求前被调用。寄存器阵列 中包含当前 字 节的 命令。如果函数返回 ,则框架将执行该命令;如果返回 ,则不做任何处理。 //当收到 命令时,就加以调用 //交替确定值放置于 ]中 //交由用户程序代码来处理 ) 【功能描述】该函数在框架执行 设备请求之前被调用。寄存器阵列 中包含当前 字节的 命令 。如 果函数 返回 ,则框架将执行该命令;如果返回 ,则不做任何处理。 //当收到 命令时,就加以调用 //交由用户程序代码来处理 ) 【功能描述】该函数在框架执行 设备请求之前被调用。寄存器阵列 中包含当前 字节的 命令。如果函数返回 ,则 框 架 执 行 该 命 令;如 果返回 ,则 不 做 任 何 处 理 。 //当收到 命令时,就加以调用 //交由用户程序代码来处理 ) 【功能描述】该函数在框架执行 设备请求之前被调用。寄存器阵列 中包含当前 字节的 命令 。如果函 数返回 ,则 框 架 执 行 该 命 令;如 果返回 ,则 不 做 任 何 处 理 。 //当收到 命令时,就加以调用 //交由用户程序代码来处理 ) 【功能描述】该函数在框架决定采用某一指定的 命令时被调用。寄存器阵列 中包含当前 字 节 的 命令。该函数没有返回值。框架也没有执行任何 命令。然而, 的串行口引擎使用 专用命令 来实现软件的上传和 下载。 //决定采用某一指定的 命令时被调用 交由用户程序代码来处理 中 断( ) 【功能描述】该函数在设备接收到 处理器内部被调用。在该函数执行期间, 数据有效)中断时,在中断 中断及优先级比当前中断低的中断被禁止。 //设置标志 //清除 【功能描述】该函数在设备接收到 令牌)中断时,在中断处理器内部 被调用。在该函数执行期间, 中断及优先级比当前中断低的中断被禁止。 //清除 【功能描述】该函数在设备接收到 帧起始)中断时,在中断处理 器内部被调用。在该函数执行期间, 中断及优先级比当前中断低的中断被禁止。 //清除 ) 【功能描述】该函数在设备接收到 挂起)中断时,在中断处理器内部 被调用。在该函数执行期间, 中断及优先级比当前中断低的中断被禁止。 ) 【功能描述】该函数在设备接收到 复位)中断时,在中断处理器内部被调 用 。在 该函 数执 行期 间 , 中断及优先级比当前中断低的中断被禁止。 只要得到一个 复位,则应当恢复到全速方式 ( ) ) ( ) ) //清除 【功能描述]该函数在设备接收到 高速中断时,在中断处理器内部被调用。在该函 数执行期间, 中断及优先级比当前中断低的中断被禁止。 ) 【功能描述]该函数在设备接收到端点 数据输入中断时,在中断处理器内部被调用。在 该函数执行期间, 中断及优先级比当前中断低的中断被禁止。 ) 【功能描述】该函数在设备接收到端点 数据输出中断时,在中断处理器内部被调用。在 该函数执行期间, 中断及优先级比当前中断低的中断被禁止。 这里 为 或 。下面省略关于其他端点和 框架全局变量 的 中断函数。 框架中有几个全局变量用来反映 置值及含义如表 所列。 表 设备的状态。这些全局变量的名称,类型、初始设 框架中使用的全局变量 描述符表 文件 中 包含 有设 备 描述 符 表 。描述 符 表包 括标 准 设备 描述 符 、类 描 述符 和用 户 指定的描述符。串行接口引擎 )和框架提供的描述符分析器,都对描述符表中各描述符 出现的顺序有一定的要求。因此,各描述符应按照如下的顺序在描述符表中出现: ;设 备 描 述 符 ;配 置 描 述 符 ;接 口 描 述 符 ;端 点 描 述 符 ;端 点 描 述 符 ;接 口 描述符 ;端 点 描述符 ;配 置 描 述 符 ;字符串 描述符 ;字符串 描述符 ;群 组 描 述 符 群组描述符 描述符 框架利用 将描述符返回给主机。因此描述符数据必须位于芯片内的外部数据 存储器部分存储空间上。例如,对于 为 的器件,描述符数据必须位于 内。各个描述符的内容由 字节)值表示 例如, 为 规范或给定的设备类别规范定义。最短的形式是用 ,则用 表 示 。 定 义 如 下: 位( 双 设备描述符 设备描述符描述设备的一般特性,一台设备只能有一个设备描述符。以下是框架提供的 设 备 描 述 符 示 例: ;;描 述 符 长 度 ;;描 述 符 类 型 ; ;协 议 版 本( ;设备类 设备子类 设备子 子类 ;;最 大 包 长 度 ;;制 造 商 ;;产 品 ;;产 品 版 本 ;;生 产 商 字 符 串 索 引 ;;产 品 字 符 串 索 引 ;;序 列 号 字 符 串 索 引 ;;配 置 数 设备限定描述符 设备限定描述符描述对设备的限定特性。以下是框架提供的设备限定描述符示例: ;;描 述 符 长 度 ; 描述符类型 ;;协 议 版 本( ; 设备类 ;;设 备 子 类 ;;设 备 子 子类 ;;最 大 包 长 度 配置数 保留 高速和全速设备配置描述符 高速和全速配置描述符描述设备配置为高速或全速。设备所支持的所有配置彼此之间是 相互独立的。各种不同的操作模式需要 总线提供不同的电流。设置不同的设备配置是 为了 提供方 便 。一种配 置可以 有一 个或多 个接口 。以下 是框 架提供 的配置 描述 符的示 例 。 高速配置描述符示例 ; 属 性( 为 ;;功 率 需 求( 除 以 ;;描 述符 长度 ;;描 述 符 类 型 ;;总 长 度( ) ;;总 长 度( ;;接 口 数 配置数 ;;配 置 字 符 串 为 为) 全 速配置 描 述 符示 例 ;;属 性( 为 ;;功 率 需 求( 除 以 ;;描 述 符 长 度 ;;描 述 符 类 型 ;;总长度( ;;总长度( ;;接 口 数 配置数 ;;配 置 字 符 串 为 为 接口描述符 接口描述符描述某一逻辑设备接口。某一配置的各个接口之间可以是相关的,也可以是 相互独立的。接口号与交替设置值决定接口之间的关系。具有相同接口号和不同交替设置值 的接口是相互独立的,具有不同接口号和相同交替设置值的接口是相关的。一个接口可以有 个或多个端点。以下是框架提供的接口描述符示例: ;;描 述 符 长 度 ;;描 述 符 类 型 ;;该 接 口 基 于 的索引 交替设置 端点数 ;;接 口 类 型 ;;接 口 子 类 接口子 子类 接口描述符字符串索引 端点描述符 端点描述符描述一个 端点。这些参数包括端点号、类型和数据包长度等。某一接口 的端点之间是相关的。以下是框架提供的端点描述符示例: 描述符长度 ;;描 述 符 类 型 ;;端 点 数 及 其 方 向 端点类型 ;;最 大 包 长 度( ;;最 大 包 长 度( 轮询间隔 字符串描述符 该描述符包含提供 设备驱动程序或用户应用程序使用的 字符串。根据 在字符串描述表中出现的顺序先后,首先出现的字符串为字符串 ,其 次为字符串 ,依 次类 推。字符串 中包含设备所支持的语言代码。以下是框架提供的字符串描述符示例: ;;设 置 描 述 符 长 度 : , , , , , 设置描述符长度 , , 描述符长度 , , , 类别描述符 该描述符用于描述设备的类别信息,由 空描述符 该描述符是描述符表的结束标志。其 固件框架应用举例 设备类别规范定义。 为 ,描述符长度也为 。 下面通过分析一个 软件开发包中提供的例程来进一步了解如何利用 程序框架进行程序设计。该例程位于 目 录下 。它 用 于批量传输测试,首先主机应用程序向端点 或 输出数据,然后固件程序将 端点数据送到其对应的端点 或 ,接着主机应用程序从端点读回数据。该例程包 括两部分:在该目录下的  子 目 录 下 运 行 于 主 机 部 分的 应 用程 序 以及 在 当前 目 录下 的 固件程序。这里只介绍固件框架程序,关于主机应用程序将在后续章节中讨论。 固件框架程序(文件 # //常 //宏定义 (( ( //全局变 时 ,延 时 //同步延时 常数 //同步延时 常数 时 ,延 时 : : ) 定义 和 睡眠方式使能标志 //设备描述符指针,描述符可以移动 //产生端点控制和状态寄存器( # //程序代码部分 //任务分配器 地址宏 初始化全局状态变 //禁止睡眠方式 禁止远程唤醒 禁止自举 / / 清 除“ 获 得 设 置 数 据 ”标 志 初始化用户设备 ); //下面的程序用于重新定位描述符表,由于 和 被用于描述符表的地址,所以描述符 //表必须放置在片内 。仅 当 描 述 符 表 放 置 在 片 外 存 储 器 中 时 ,才 使 用 固 件 进 行 重 新 定 位 ( ( ( ( ); ); //使能 中断 //唤醒中断 ( 使能 和 自动向 使能被选中断 使能 中断 # //注:如果需要,可进行重枚举。可以检测 位,如果已经设置,就无须重枚举。如果固件从 中被加载了,那么 位就已经被设置了 ! ; # 无条件重新连接。如果从 不会有任何损害 中装载就被断开,则需要连接;如果仅是重枚举,则无须重连接, ( //清除睡眠标志 //设置延展为 在 重 枚 举 后 ) //任务分配 ); 主循环 等待 //执行 //清除 命令 标志 //轮询用户设备 //注意:闲置方式将停止处理器时钟。只有两种方法可以退出闲置状态: 引脚和在 //总线上检测到 总线恢复的状态。定时器将停止处理器的工作,而任何其他中断都不能唤 //醒处理器 //清除“进入睡眠”标志,以防止唤醒和下次进入睡眠之间相互竞争 ; 使处理器进入闲置方式 ! 加入主机禁止远程唤醒。当外部的 ; 引脚产生唤醒信号时,必须返回到挂起状态 //由于 总线或 ; 引脚的作用, //如果唤醒源是 将恢复工作 引脚,则向主机发送恢复信号 ; 设备请求分析 ) { } 取描述符 //设备 ; 设备限定 ; ; //配置 ; //其他速度配置 ; ; //字符串 ; ; )) ); ) ); // 清除特征 //设备 //禁止远程唤醒 //停滞端点 //端点 ); 停滞端点 // 设置特征 )) //设备 //使能远程唤醒 设置 特征 测试 方式 。程 序代 码处 理该 请求 。但是 ,在 芯片 即将 进入 测试 方式 //之前,必须用固件来完成控制传输的握手段。同时,也必须在即将进入测试 //方式之前,主机端和 进行物理连接( 和 //停滞端点 //端点 ) // 无效命令 )) //停滞端点 //设备请求应答握手段 //唤醒中断握手 执行 ); 外设功能的程序(文件 # 宏 接收设置数据标志 # //任务分配器挂钩 //设置 时钟为 设置从属 接口为 仅使用默认值,也可以不需要 ; //当前设置 交替设置 //在起始调用一次 //参见附录 有 关 内 容 : //输出端点无须提交控制 / /由 于默 认双 缓冲 ,所 以必 须写 虚字 节计 数两 次 //通过写字节计数 ; 来控制 //通过写字节计数 来控制 //使能双指针特性 //使能远程唤醒 //当设备闲置时,重复调用 ! //检测 ! //检测 中的 ( 空 )位 ,当 为空时,程序代码设置该位 )中 的 ); ); ( 忙 )位 ,当 为满时,程序代码设置该位 ); ); ( //循环 缓冲区数据到 ++ //采用 )设 置 ,传 输 缓冲区数据到 缓冲区 //控制 //重新控制 (! //检测 ! //检测 中的 (空)位,当 为空时,程序代码设置该位 )中 的 ); ); ( 忙 )位 ,当 为满时,程序代码设置该位 ); ); < 循环 缓冲区数据到 ) //采用 设 置 ,传 输 ; 缓冲区数据到 缓冲区 //控制 //重新控制 ; ; //设备请求挂钩 在设备进入挂起方式时调用 //在设备恢复后调用 中断处理:由 中断跳转表调用 //设置数据有效中断处理 { ; //设置令牌中断处理 //设置标志 //清除 //清除 设备描述符程序 文件 ;;描 述 符 类 型 :设 备 ;;描 述 符 类 型 :配 置 ;;描 述 符 类 型 :字 符 串 ;;描 述 符 类 型 :接 口 ;;描 述 符 类 型 :端 点 描述符类型 :设备限定 ;;全 局 变 ;;端 点 类 型 :控 制 ;;端 点 类 型 :同 步 端点类型:批 端点类型:中断 ;;将描述符表置于片上存储器中 ;;描 述 符 长 度 描述符类型 协 议 版 本( ;;设 备 类 设备子类 设 备 子 子类 ;;最 大 包 长 度 ;;制 造 商 ;;产 品 ;;产 品 版 本 ;;生 产 商 字 符串 索 引 产品字符串索引 ;;序 列 号 字 符串 索 引 ;;配 置 数 ;;接 口 描 述 符 ;;端 点 描 述 符( 端 点 ;;端 点 描 述 符( 端 点 ;;描 述 符 长 度 ;;描 述 符 类 型 协议版本( 设备类 ;;设 备 子 类 ;;设 备 子 子类 最大包长度 ;;配 置 数 保留 描述符长度 ;;描 述 符 类 型 接口数 配数 配 字符串 ; 属性( 为 功率需求(除以 ;;总 长 度( / ;;总 长 度( 为 为 描述符长度 ;;描 述 符 类 型 ;;该接口基于 的索引 ;;交 替 设 置 ;;端 点 数 ;;接 口 类 型 接口子类 ;;接 口 子 子类 接口描述符字符串索引 描述符长度 ;;描 述 符 类 型 端点数及其方向 ;;端 点 类 型 ; 最大包长度( ;;最大包长度( ;;轮 询 间 隔 描述符长度 ;;描 述 符 类 型 端点数及其方向 ; 端点描述符(端点 ;;端 点 描 述 符( 端 点 ;;接 口 描 述 符 ;;端 点 类 型 ; ; 最 大 包 长 度( ; ; 最 大 包 长 度( ;;轮 询 间 隔 描述符长度 描述符类型 端点数及其方向 ;;端 点 类 型 最大包长度( 最大包长度( ; 轮询间隔 描述符长度 描述符类型 端点数及其方向 端点类型 最大包长度 最 大 包 长 度( 轮询间隔 描述符长度 描述符类型 ; 接口数 配数 ;;配 置 字 符 串 属 性( 为 ;;功 率 需 求( 除 以 ;;总 长 度( / 总 长 度( 为 为 描述符长度 描述符类型 该接口基于 的索引 交替设置 ;;端 点 数 ;;接 口 类 ;;接 口 子 类 ;;接 口 子 子 类 端点描述符(端点 端点描述符(端点 端点描述符(端点 端点描述符(端点 接口描述符字符串索引 描述符长度 描述符类型 端点数及其方向 端点类型 最 大 包 长 度( 最 大 包 长 度( 轮询间隔 描述符长度 描述符类型 端点数及其方向 端点类型 最 大 包 长 度( ;;最大包长度( 轮询间隔 描述符长度 描述符类型 端点数及其方向 端点类型 最大包长度( 最大包长度( ; 轮询间隔 描述符长度 描述符长度 端点数及其方向 端点类型 最大包长度( 最大包长度 ;;轮 询 间 隔 ; 设置描述符长度 : 设置描述符长度 , , , , 描述符长度 设计专用设备固件程序 从上述的例子可以看出,该固件程序仅仅是在 开发包提供的固件框架的 基础上完成的。 的固件框架在目录 中。在 前面的章节中已经介绍了 集成开发环境,也了解了建立专用程序以及连接和 编译的一些基本方法。 用户 要建立一 个新的 文件 ,就要将各 个函数 库及固 件框架放 置在同 一个专 用文件中 。如 小节的 的例子就是一个完整的 外 围 设 备,其 专 用 文 件 包 含了 和 等 文 件,如 图 所示。 在该例子中,包含的文件除了上述的固件框 架 、设备文件 和描述符文件 之外,还有文件 和 两个。它们分别是函数库文件 (下面将详细介绍)和 中断跳转表目标 文件。 用户开发的重点应当是外围设备控制文件 (在上述例子中的 。这也是 学习的重点。一些函数挂钩在 和 内都有使用,但是,其代表的意义有所不同。 图 设计完整的外图设备例子 固件函数库 该固件函数库提供常量、数据结构、宏以及函数,使用户可以更方便地使用 的 资源。用户在编写源程序时,只需在其程序中包含 和 这 两 个 头 文 件,并 且链接 库就可以使用该函数库。在 软件开发包的固件程序示例中,就 使用了该固件函数库。在本节的最后将分析使用该库的一个例子。 固件函数库相关文件 假设 软件开发包安装在 盘根目录下,则在 目录下包含该固件库的源文件( 文 件 和 文件)和目标文件 。该目录 还包含 目标文件。 包含 中断的中断向量和跳转 表。如果在项目中链接了该目标文件,则在使能中断之前将使能自动向量特性。在源文件 中可以找到函数调用的跳转表。利用 重新编译这些源文件,以得到 库文件;或者直接执行该目录下的 批处理文件,以重新得到 库文件。 和 头文件位于 目录下。 头文件中包含函数库的常量定义、宏定义、数据结构、全局变量声明和 库的 函数原型 文件包含位标志定义和 寄存器变量声明。 固件函数库 以下列出固件函数库中主要的部分。要了解所有函数及数据结构,请查看 全局变是 说明 ) 【说 明】该 变量用 于描 述表分 析函数 。它指 向设备 描述 符表的 顶端 。详见 架文档资料中关于描述表的完整描述。 ) 【说明】该变量用于描述表分析函数。它指向第 个配置描述符。详见 文档资料中关于描述符表的完整描述。 ) 【说明】该变量用于描述表分析函数。它指向第 个字符串描述符。详见 架文档资料中关于描述符表的完整描述。 文件。 小节框 小节框架 小节框 【说明】该变量用于描述表分析函数。它指向第 个用户描述符。详见 文档资料中关于描述符表的完整描述。 小节框架 )  【说明】该变量用于 接口函数。它保存当前 接口的状态。 函数说明 ) 【参数说明 参数用于设置 控制寄存器的 位。如果 ,则 位被置位 ,从该函数返回后, 处理器将负责处理端点 设 备 请 求;相 反,如 果 为  ,则 位不变。当 时, 的串口引擎将负责处理端点 上大部分的 设备请求。 为 所有的 位为 【函数功能 断开 连 接 ,延 迟 ,然 后 返 回 。 【 函 数 功 能 】挂 起 处 理 器,以 响 应 的挂起事件。除非 总线恢复或 的 引脚产生唤醒时间以清除挂起条件;否则,该函数不会返回。另外,如果挂起事件无 效,则函数将立即返回。 ) 【函数功能】该函数在 总线上产生用于 设备远程唤醒所需的 状态,该函数的 调用紧随 函数之后。根据 恢复或远程唤醒并产生 状态的结果,自 动进行唤醒。 【函数功能 通过执行空循环延迟 ) 【参数说明】 为等待的 数 。 【 函 数 功 能 】等 待 ) 【参数说明 为配置描述符的实例号。 【函数功能】该函数返回配置描述符表中某一配置描述符实例的指针。实例由 参数确定。如果不存在所给出的实例,则参数返回 指针。 ) 【参数说明 和 用于确定某一指定接口。 函数 功能 】返 回某一 指定 的接 口描述 符的 指针 。如 果描述 符表 不包 含指定 的接 口 ,则函 数返回 指针。 参数说明 为实例号。 【函数功能】该函数返回描述符表中某一实例的字符串描述符的指针。如果所给实例不 存 在 描 述 符 表 ,则 函 数 返 回 指针。 【函数功能 该函数用来初始化 )函数 前,必须 调用 该函 数。 接口。在调用 ()或 参数说明】 指定 设备的地址; 为传送数据的长度; 为发送数据缓冲 区的起始地址。 【函数功能 该函数用于向 接口写一串数据。在所有提供的数据被发送之 前,该函数立即返回。如果当前正在发送或接收数据,则调用该函数时返回 ,且数据不 被发送。假如 端口不忙,则数据进入队列,函数返回 ) 【参 数说 明】 指定 设备 的地 址; 为传送数据的长度; 为接收数据缓冲 区的起始地址。 函数功能 该函数用于向 冲区之前,该函数立即返回。用户必须询问 发送或接收数据,则调用该函数时返回 数据队列,函数返回 接 口读 一 组数 据 。在 所 有 被请 求 的数 据 读入 缓 的状态,以确定数据何时有效。如果当前正在 ,且 数 据 不 被 读 出 。假 如 端口不忙,则读取 固件函数库应用举例 这里列举一个用 固件函数库编写的例子,该例程位于 \目录 ,该程序未使用框架编写。 该程序的目的是验证如何使用开发板上的按钮和 。按钮和 程序运行后,当分 别按下开发板上的 和 按钮时,将有不同的现象。 段 可显示 和 。该固件的源程序如下: ! >> ( (+ //如果有键按下,得到键值 //对应于开发板上的 //对应于开发板上的 //对应于开发板上的 //对应于开发板上的 > ; 在 上显示结果 ; ); 由于开发板上对按钮和 的读/写采用了一款 面的程序中,读取按钮状态时,调用以下函数: 总线控制芯片 而在 操作时则采用了以下的函数: 这两个函数都是 , )) 固件函数库中提供的重要函数。 ,所 以 ,在 上 第 章  设备驱动及应用程序设计 本章将介绍 系列芯片的用户设备驱动程序的生成,以及通用驱动程序( 软件开发包提供的 驱动 程序 只需 经过 少量 修改 ,就 可以支持一个专门的设备。本章将具体介绍生成用户固件下载 设 备 驱 动 程 序 的 步 骤 ,然 后介绍 通用设备驱动程序( )规范,最后举例说明应用程序的设计 固件下载 设备驱动程序 简介 系列芯片都具有通过下载固件和重枚举的方式来动态改变设备特性的能力。 前面已经了解到,可以用两种方式下载固件到 芯片中。第 种方法是使用 控制面板通过 口下载固件( 格 式 的 文 件 );第 种方法是使用 调 试 监 控 程 序( )通 过 串口下载固件。在开发过程中,这两种方法均可 采用。但是,我们希望最终作出的产品能自动完成固件下载以及设备重枚举。这就需要一个 特殊的、具有下载固件并完成设备重枚举功能的设备驱动程序,暂且称之为固件下载驱动程 序。 软件开发包提供 个固件下载驱动程序的模板,即 驱动程序是一个非常简单的 驱动程序模板,简化到用户只需要知道如何去做一 件事情 下载固件到 外设即可。因此,可以使用该模板非常简单地开发出自己的设备 驱动程序。 由于 软件开发包提供的 驱动程序只需经过少量修改就可以支持 一个专门的设备,因此,它不需要有较深的 驱动程序编程的知识背景。然而,用户应 该非常熟悉 的 即 插 即 用、 文 件、 的注册表和 驱动程序是一个设备驱动程序,因此它需要 的设备驱动程序包 对用户来说并不友好,在尝试制作 驱 动 程序 之 前 ,应 该 验 证所 用 的 有能力创建设备驱动程序。 对于一个典型的基于 芯片的设备,如果它具有了固件下载驱动程序的功能,那 么它只需有少量的存储器(例如 等 )来 存 储 设 备 的 与主机系统中制定的设备驱动程序相关联。该设备驱动程序的惟一功能是下载固件到外设的 芯片中。 本节将讨论如何利用 开发用户所需要的固件下载驱动程序,以了解 如何下载固件到指定的 外设。该模板包含的文件如表 所列。 表 固件下载驱动程序所需源文件列表 开发 创建 设备驱动程序的步骤 驱 动 程 序 需 要 如 下 工 具: 以上版本。在安装 。在运行 时 ,会 自 动 调 用 记录格式的文件转换为 文件的工具 记录格式的输入文件转换成 代码数组。 了该工具 该工具的命令格式如下: 之前,必须首先安装 编译器。 。该工具将 软件开发包提供 输入的 文件名,由 工具生成。 输出的 文件名。 产生的 输出文件中数组的名称。该参数为可选项,缺省时,该 数组名称为 创建 设备驱动程序的一般步骤如下: 新 建 一 个 目 录 ,将 软件开发包中 目录下的所有文件连 同子目录复制到该目录下。 注 意: 和 目录结构必须完整;否则,在编译过程中将 会出错。 编辑该目录下的 文 件 ,在 一行中修改目标文件 名 。这 里 的目 标文 件 是指 由 产 生 的 驱 动 文 件( ③利用 将固件的 记录格式的代码文件转换为 文件。打开该 文件,用其中的 ]数 组 代 替 中提供的 中的 数组。 ④利用 的 命令编译创建该驱动程序。 在修改 驱动程序之前,用户应该为定制的固件下载驱动程序创建一个新的 目录,一旦生成了新的目录,则复制 下的所有源文件到该目录,使用 的 命令编译生成 驱动程序。 文件和 一起告诉 如何创建驱动程序。指定的源文 件由驱动程序和驱动程序输出文件名组成。已提供的 文件将产生一个名为 的驱动程序。根据 环境,该文件将产生于 或 目录 下。这些目录将在 驱动程序产生或 报告一个错误之前产生。当定制 驱动程序时,需要改变驱动程序的输出文件名,而不是 ,可以通过改变 文 件中的 到一个新名字来实现。 设计举例 这里举例说明生成 固件装载驱动程序的详细过程。所选取的例子是 目录下的 目标程序。它由 软件工具 编译、链 接后生成。设计的目标是在设备插上后,主机能通过 总线自动下载该固件到 外设芯片中,并自动运行该固件程序。 首先,需要分配设备的 号。采用重枚举的设备需要两个 ,一 个 绑 定 到 固件下载之前的设备驱动程序,另一个绑定到固件下载之后的设备驱动程序。在此,前一个驱 动程序等待开发,后一个驱动程序采用 软件和硬件开发包提供的 驱动程 序 。将 绑定到前一个驱动程序, 绑定到 驱动程序。这 里, 均为 注意 :这里 设备的 为 开发固件装载驱动程序应按如下步骤进行: ①新建一个目录,假设为 。将\\ \ 目录下的文件和 子目录的内容全部复制到该目录下。 ②用任何一个文本编辑器打开该目录下的 文件,将“ 修 改 为“ 。这一名称将影响到最后产生的 文件的名 称。 ③利用 ,将 文件转换为 文件。 现在, 包含了一个 记录结构的数组,被称为 ④打开 和 文 件,将 中的 ]数 组 用 的 ]数组 替换。 ⑤利用 创建目标驱动程序。运行 ,选 择 的 环 境 ,进 入 到 子目录,键入: 中 或者是 开始创建驱动程序。这取决于所选择的编译环境。如果编译成功,将在 \ 或 目录下产生一个 文 件 ,这 就 是 所需要的固件装载包或被驱动程序(目标驱动程序)。将该驱动程序复制到 目录下。 最后,要使该驱动程序正确工作,还必须为它编写一个安装信息文件,即 文 件 。 它 将设备的 绑定到特定的设备驱动程序上。该 文件可存放在任一指定目 录下。当该 外设首次被连上时,系统会自动询问该文件所在的位置。下面创建 一个 文 件 , 内 容 如 下: 修改 开发板的 为 。将该 外设的 号写入 到串行 中 ,有 以 下两 种 方 法。 第 一 种:使 用 编程器。将 这 字节编程到串行 的前 个单元中。 第 种:使用 控制面板。单击 按钮,选择\\ 文件,几秒后该文件将下载到 芯片 中;接着 修改 开发板的 为第 步中 文件所指定 的 的 值 ,设 置 ;最 后 ,单 击 按钮,即可 将新的 值写入到串行的 中。 重新插上开发板, 操作系统提示找到新硬件,并要求提供该设备的驱动程序。 按照 操作系统添加新硬件向导的提示,将 提供给 查看结果,发现驱动程序装入后, 固件就开始在开发板上运行了。 通用设备驱动程序( )规 范 引言 通用驱动程序是一个可用于基于 的计算机外围设备接口的通用设备 驱动程序,下面简称 或 。这个驱动程序提供应用程序与公共 设备 请 求和 数据 传 输的 接口 。首先 ,它 辅 助从 事基 于 设备或固件开发人员,通过 控制面板程序,允许开发人员执行标准的 设备请求和数据传送,以测试设备的性 能;其次,它提供用于 设备驱动程序开发的样例代码,利用通用驱动程序可生成用户定制 的驱动程序或最小化驱动程序。 规范的目的 该规范文本的目的是描述从用户应用图形程序到 的接口方式。用户的应 用指类似 和 等应用程序。用户应用程序可应 用于各种形形色色的操作系统中。它们可用于存取文件、操作数据以及用户通过 进行交互操作。但是,用户应用程序不允许直接对硬件进行操作。用户应用程序对硬件 的操作,必须通过中间媒介才能进行,这个所谓的中间媒介就是设备驱动程序。设备驱动程序 通常在内核模式中运行,因为在该模式下具有较高的优先级。 的 就是一个内 核模式的设备驱动程序。 为了进一步了解内核模式的 驱动程序是如何工作的, 开发软件包提供了 的源代码。 规范文档适合的阅读对象 对于 规范的适合阅读人员,应当是需要用 编写客户端应用程序与 设备进行通信的开发人员。阅读者应当精通 语言编程,还应当具有对 非常好的 理解。 接口支持 在某一时刻只能与某一个设备接口进行通信。虽然对于所选择设备的任 一接口、交替设置均可以访问,但是该驱动程序不能同时与多接口设备的多个接口同时进行通 信。支持多接口设备可以调用该驱动程序的多个例程, 的 即插即用( 多 配置驱动程序)文档中认可了这种做法。在设备枚举阶段, 尝试选择接口 和 交替设置 。 生成 通用设备驱动程序 生成 需要 或 )和 以上的版本。 可从 获得。 通用设备驱动程序为用户编写 设备驱动程序提供了一个极好的范例。当 用户需要修改 时,可以利用 工具重新生成该驱动程序。如果用户 不需要修改驱动程序,那么可使用已经编译形成的文件 对用户来说,开发需要访问 外设的应用程序。可使用任何一个支持 函 数( )和 ()的编译器。所提供的样例程序是基于 的。 装载 通用设备驱动程序 本节叙述如何装载 设备驱动程序以及如何将 加载到用户的设备等 基 本方 法 。要 获得 详 细的 信 息 ,请查 阅 的相关文档。 文件 所有的 设备都至少具有一个 和 和 通过设备描述符表提交给 系统。同时, 系统使用 文件将某一 和 绑定到某一设备驱动 程序。这样, 系统在知道了设备的 和 后 就通过存储在 文件中的信息 查找该设备的驱动程序。关于 开发板的 文件在第 章已经列出 了,这里列出比较简单的 开发板的 文件。 注册登记 一个 文件与 个设备的设备驱动程序相关联。实际上, 系统并不是每次都 查找 文件来获得设备的 和 。当新设备首次插上计算机时, 系统会出 现“ 找到新硬 件”对话 框。这时,用户需 要将 文件提交给 系统。此后, 系统就会将该设备的 和 信息保存在注册表中。以后当该设备重新插上时, 系统就会在注册表中很快地查找该设备的驱动程序信息。大部分关键的 信息被储存在 系统注册表的如下目录下: 运行 修改。 命令可以查看和修改系统注册表。在修改注册表时,要多加小心,不要轻易 与应用程序的接口 对用户来说,所有的应用程序都通过 控制来访问 。用户的应用程序 首先通过调用 函数 来取得 访问设备 驱动程序的 句柄 。然后 ,用户程 序使用 函数 )来提交 控制码,并且为 ( )函 数 返 回 的设备句柄 设置 缓冲区。 链接符 可以和多台 设备进行通信。对于每一个连接到主机的 设备 都为它创建一个形如 的链接符,从 开始递增。假如由 个 设备连接到主机,那么就使用 个链 接符: 和 。调 用 函数,实际上即使获取由设备驱动程序产生的目标设备的句柄,也要使用设备 的链接符作为函数参数。下面的例程验证所获取的 设备 的 句柄: 设备 控制 用户的应用程序通过调用 下面一段代码用于验证请求 程中返回的设备句柄。 函数 读取设备的 来向设备驱动程序发送请求。 设备描述符。它利用了上面例 已经打开的设备句柄 //没有输入缓冲区 //输入缓冲区长度 //缓冲保存设备描述符 //输出缓冲区长度 //实际返回的字节数 //不覆盖 控 制 码( )参 考 本小节将详细讨论由 所支持的各个 。有关 )和 )更详细的信息参见 的 文档。下面显示的是 函数的原型。 使用相同的函数参数名。 //外设句柄 // / 操 作 控 制 代 码 //输入缓冲区指针 //输入缓冲区大小 //输出缓冲区指针 //输出缓冲区大小 //实际返回的字节数 用于异步操作的重叠指针 和相应的输入/输出结构在开发软件包提供的 了定义。 提供的 定义了标准 的 结构。 标准设备请求 标准设备请求的 控制码用于执行标准 设备请求。 ) 该控制码使得驱动程序向设备发出 的 求( 见 表 。 表 中作出 标准设备请 该控制码使得驱动程序向设备发出 的 标准设备请 求( 见 表 。该请求不仅返回配置描述符,同时也得到接口、端点以及类描述符。 表 ) 该控制码读取 设备的字符串描述符(见表 ) 该控制码利用 控制码在不同的交替设置之间切换(见表 数据传送 ) 该控制码从指定的批量或中断管道中( )读 取 数 据( 见 表 用进程 直到数据传送完成。 。读操作将阻塞调 表 表 表 ) 该控制码写数据到指定的批量管道( 直到数据传送完成。 表 见表 。该操作将阻塞调用进程, 该控制码从某一指定的同步管道( )读取 数据(见 表 。该操作将阻塞调用进 程,直到数据传送完成。根据 主机控制器驱动程序的规定,在完成一次同步传输后,必须 复位该管道才能进行下一次传输。复位管道需要利用 控制码 ( 该 控 制 码 将 在 下 面 讲 到 )。 表 续表 ) 该控制码向某一指定的同步管道( )写数 据( 见表 。该操作将阻塞调用进 程,直到数据传送完成。根据 主机控制器驱动程序的规定,在完成一次同步传输后,必须 复位该管道才能进行下一次传输。复位管道需要利用 控制码。 该控制码将在下面讲到。 表 续表 ) 在驱动程序级声明启动一个 流 ,这 个 流将一直持续下去,直到调用 才结束该同步传输流(见表 读取 数据时,可通过 控制码将数据复制到一 个缓冲区中。如果该缓冲区溢出,则新读入的数据将被丢弃,直到缓冲区中有了可用的空间位 置。缓冲区的长度由 参数决定。 在启动一个 流之前,必须调用 控制码来复位管道。驱 动程序仅支持单个 流。 表  ) 该控制码终止由 表 启动的 流( 见 表 ) 该控制码与 该 用来恢复被读取的任意数据(见表 表 一起使用。一旦启动一个 流, 辅助 ) 该控制码向控制端点发送一个 表 或 专 用 请 求( 见 表 该控制码返回当前的 得 当 前 帧 号( 见 表 表 帧号。它不产生任何 传输,只需要查询主机控制器,以取 ) 该控制码返回当前接口的管道信息(见表 表 ) 该控制码复位指定的管道(见表 表 ) 该控制码取消指定端点所有悬挂的传输(见表 表 ) 该控制码返回 设备驱动程序的版本信息(见表 表 专用 ) 该控制码下载数据到 表 芯片的 中 ,起 始 地 址 为 见 表 ) 该控制码下载数据至 表 芯片的外部 中,起始地址由参数指定(见表 应用程序设计举例 在本示例中,继续第 章提到的 例子来讨论如何在主机应用程序中使用 即如何通过 在主机应用程序中访问 外设。 前面已经讨论过,该例程用于批量传输测试,主机应用程序向端点 或 输出数据,然后固件程序将端点数据送到其对应的端点 或 ,接着主机应用程序 从端点读回数据。运行于主机 部分的应用程序位于 \ 目 录 下,文 件 名 为 。关于固件框架程序,在前面已经详细讨论过了,这里 讨论主机应用程序。 要使用 ,首先应该在程序中包含 头文件,如下所示: # \\ 然 后 ,打 开 设 备 ,利 用 控制码对设备发出相应的设备请求即可 。可以先看一下主机 程序目录下的 源文件。要看懂这一源文件,要求读者具备 +十编程的知 识。但是抛开用于构建 以及处理 消息 的代码 ,程序 中用 于与设 备通 信的代码主要由如下 部分的代码组成。 用于打开设备的代码 该代码的目的是用提供的符号名来打开设备驱动。其输入参数: 为对于 文件句柄所在的设备驱动句柄指针; 为无效终止字符串包含的设备名。返回值 表示驱动是否被成功打开。 设备测试连接 //连接数据 设备传输连接代码 综上所述,对于批量传输端点的操作都是通过 控制码来实现的。 函数向设备发送相应的 第章 及应用实例 编程 在\ 下有很多实际的例子程序可以供学习和开发时使用。 在 开发套件中提供了更多的例子,下面举例说明。 上传和下载 内部 和扩展 是 固件程序,可用于向 在控制面板程序界面上,设定 的 信息包 值和传输数据的 芯 片( 以及 其 具 体 的 方 法 如 下: ①在控制面板程序中,单击 内部和扩展 上传和下载数据。 ,其下载和上传的地址是通过 值来设定的。这个固件适用于所有的 下载固件 设定 ③指定 值; ④可以进行上传和下载操作,上传时选择 ,可输入 具体值,然后单击 键; ⑤ 下载 时选 择 ,单击 按钮,就可以在下方的显示窗口中读到刚才上传的内容。 上传和下载 内部和扩展 的运行结果实例如图 所示。 说 明:向 起始地址写 图 上传和下载 内部和扩展 并回传。 行结果 批量端点环路测试( 固件程序在 批 量 端 点 环 路 测 试 程 序( )是 批量端点环路测试专用固件。环路测试对 应 的 端 点: 对应 对应 环路测试程序采用外部自动指针,数据从端点 的外部 缓存器复制到端点 的缓存器。图 所示为批量端点环路测试运行后界面。 图 批量 端点环路测试运行结果 批量环路测试( 批量环路测试固件程序( )基于固件框架设计。对应端点 和 。对此固件程序进行编译连接生成,需要完全板 工具支持。 该固件程序在 而应用程序界 面采用 编 制 ,有 源 代 码 ,程 序 在 \ \目录下。 用“控制面板”下载固件程序到 开发板上运行,再运行应用程序,应用程序运行后 界面如图 所示 。在 中,单击 按钮后在显示框中显示 的管道信息。这里选择 为 为 ,单击 按钮后就开始批量环路测试。 图 批量 环路测试运行结果 批量端点无限发送接收测试( 如图 所示,在批量端点无限发送接收测试程序( 中, 和 将总是接收批量 总是返回一个 字节包,这个包包含起始增量字节 图 批是 端点无限发送接收测试运行结果 为 。由于 总是返回 求。 将连续返回写入 该固件程序在 \ 字 节包 ,所 以该 端 点除 了高 速 主机 控制 器不 会 响应 其他 请 的最新数据包。 按钮 和灯( 在光盘中的 \ 目录下,提供 按钮和灯的源程序和 编译好的结果。连接开发板,启动控制面板程序,选择 目录 下的 到开发板,就可以运行程序 按钮和灯程序运行后,当分别按下开发板上的 和 按钮(见图 时 ,将 有 不同的现象出现。 段 可显示 和 。其按钮 功 能 如 下: :段 段 置 显 示; 递减 显示; 段 递增 显示; 段 置 显示。 源程序代码参见 小节。 图 开发板操作 批量传输测试( 这是一个用汇编语言编写的批量传输测试的例子,用于学习在 开发板与控制 面 板之 间进 行批 量 传输 。使 用端 点 和 来 进 行批 量 传 输 。该 程 序 中首 先 用 的递减计数器的值填充端点 缓冲区,保持对端点 和 传输的计 数 ,对 端 点 接收到的数据不作任何处理,只改变端点 缓冲区的前两字节,其 中第 字节 )用 端 点 传输次数的计数值代替;第 字 节( 用端点 传输次 数的计数值代替。 使用控制面板进行测试的步骤如下: ①下载程序。既可以在 的 集成 环境 ,也 可 以用 控制 面板 的 按钮来下载 文件。 ②设置 为, 为 。确定 和 端点使用最大包长度为 字 节 ,单 击 按钮来更新设置。 ③如图 所示 ,在 批量 传输 按钮 条中 选择 端点 ,单击批量传输按钮,可看见 递减计数器的 字节。 ④如图 所 示,选择 ,再次单击批量传输按钮,以执行另一个 传输。现 在除了字节 的数值发生了变化外,其他的数值均相同。字节 用来指示 传输的 次数,每发生一次 传输,其计数值加 图 选择 单 击批量 传输按钮 图 选择 再 次 单 击 批量 传输按钮 ⑤在批量传输按钮条中选择端点 ,单击批量传输按钮,发送 字 节 到 ,该 数 据 被 忽 略 。 选择端点 ,单击批量传输按钮,发现第 字节的数值发生 了变化。字节 用 来 指示 传输的次数,每发生一次 传 输 ,其 计 数 值 加 该程序使用查询法,不断地对端点“忙”位进行查询。比较好的方法是采用中断向量法。 利用批量端点对进行环路测试( 如图 所示,该固件完成批量端点环路测试,固件利用 传输的初始化。对应的端点为 和 该固件程序在 \ )中 断 来 进 行 图 利 用 批量 端点对进行环路测试 内部存储器测试( 用于对 芯片内部的存储器进行测试,是一个 固件程序。该 固件运行后,如果内部存储器测试合格,将在 段 上 循 环 显 示“ ;如 果 内 部 存 储 器 有 故障,将在 段 上循环显示故障出现的首地址。 源 程 序 如 下: 读按钮状态 采用 中断的批量端点环路测试( 如图 所 示,该 固 件 完 成 批 量 端 点 环 路 测 试 ,固 件 利 用 初始化。对应的端点为 和 该固件程序在 \ 目录下。 中断来进行传输的 图 采用 中断的批量端点环路测试 专 用 命 令 程 序( 通过 控制面板的 按钮可下载该程序到 主要解释执行 的 以 下 几 个 命 令: 下 载: 读取 读取外部 设置 地 址; 读取 的类型 字节或 字 节 ); 读 取 芯 片 版 本 信 息; 重枚举。 该固件程序是基于 固件框架开发的。 开发板上运行。它 人机接口设备的开发实例 利用开发板上的资源,可以设计一个使用 显示和按钮控制的 设备 。可以 通过 开发板上的按钮以及 应用程序 实现人机交互 。通过这个例 子 ,可以达到 系统了解 外围设备开发过程以及相关知识的效果。 描述符 通过前面的介绍已经知道,主机新连上一个 设备后,将进行设备枚举。在设备枚举 过程中,当主机取回一连串的描述符后,主机即可辨识这个刚连上去的 设备。而当设备 被接入至 后端的根集线器或此设备被连接上电源后,这种设备枚举的过程就再一次被触 发激活。每一个 设备 配置一 个设备 描述符 以及一 个或更 多配置 描述符 。因此 ,如果 主机 具有多个配置描述符可以使用,则在设备枚举的过程中就会选择其中一种配置方式;而每一个 配置描述符轮流支持一个或更多的接口描述符。 在描述文件中,若设备描述符的群组码的字段设置为 ,而接口描述符的接口群组字 段设置为 ,则此设备属于 群组设备。若是 设备,就需要额外再设置 群组 描述符和报告描述符。 有关设备描述符、配置描述符、接口描述符和端点描述符的内容将在 小节以具体 实例方式给出,这里重点介绍报告描述符。 设备必须包含一个(或超过一个)报告描述符,这些描述符在主机已经辨 识(设备枚 举 )此 设 备 为 群组之后,将会请求被传送回来,并设置驱动程序加以控制。报告描述符也 是 中最 为复 杂的 描述 符 。它不 像其 他几 种描 述符具 有整 体架 构的 特性 ,反 而像 计算 机编 程语言,用来严谨地描述设备数据的格式。因此在这个描述符中,定义了传送至主机或从主机 接收的数据格式。 报告描述符由许多项目 )组成,所谓项目就是报告描述符中所包含的一连串信息。 一个报告描述符中一般含有下列项目类型: 输 入、输 出、特 性 和 集 合( 这 是 个主要的项目); 用 途( 用途 页( 逻辑的最 大值; 逻辑的最 小值; 报告 长度( ; 报 告 的 数 值( 若要描述设备的数据报告格式,则需要设置所有的项目。 设备的基本请求 基 本 上 , 群组与一般的 设 备 没有 什 么 区 别 ,它 也 包 含 一 个智 能 型 专用控 制 器 ,能 通 过 端口来处理各种主机的请求以及其他所需的工作。而这个控制器必须含有 一个或更多端点,以作为存储所收到的数据或等待传送出去的数据缓冲区。端点 是双向的, 可用于设备枚举和控制传输。通过这个端点 ,每一个设备必须对 规范所定义的一系列 设备请求加以响应。其中,设备枚举所请求的取得设备描述符的数据,也必须存放在设备的 中。 除了应用至所有设备的基本需求外, 还必须具有下列基本请求: ①若要以周期的方式将数据传回至主机, 必须含有一个中断 端点。 必须包含群组描述符以及一个或更多的报告描述符。 ③  必 须提 供 的特定控制请求 和能够支持可选择的请求 ④ 对 于 中断传输而言,设备必须将报告数据放人中断的端点缓冲区内,并且使能这个 中 断;对 于 中断传输 ,设备必须使能这个端点 ,并且从中断端点的缓 冲区取出接 收到的报告数据(通常通过设备的中断来通知)。 有别于标准设备的请求,对于人机接口设备 的设备群组,也需要对其所规范的报告 提出请求。表 中列出了人机接口设备的请求。 表 人机接口设备的请求 设备固件程序 描述符(文件 设备描述符 设备描述符描述设备的一般特性,一台设备只能有一个设备描述符。以下是框架的设备 描 述 符 示 例: ;描 述 符 长 度 ;描述符类型:设备 ; 符合 规范 ;接 口 群 组 码 群组设备接 协议 ;最大封包大小 ;制 造 商 ;产 品 ;设备 发行序 列号 ;制造商的字符串描述符索引 ;产品字符串描述符索引 ;设备序列号字符串描述符索引 ; 配 置 数 目: 配置描述符 配置描述符描述设备的某一种配置。设备所支持的所有配置彼此之间是相互独立的。各 种不同的操作模式需要 总 线提 供不 同 的电 流 。设 置不 同 的设 备配 置 是为 了 提供 方便 。 一种 配置可以 有一个或 多个接口 。以下是 框架提供 的配置描 述符的示 例 : ;描述符长度 ;类 型 :配 置 ;总长度( ;用来配置的接口数 ;配 置 值 配置字符串索引 为 为 自供 电; ;最大电源电流为 为远程唤醒特性 )接口描述符 接口描述符描述某一逻辑设备接口。某一配置的各个接口之间可以是相关的,也可以是 相互独立的。接口号和交替设置值决定接口之间的关系。具有相同接口号与不同交替设置值 的接口是相互独立的,具有不同接口号与相同交替设置值的接口是相关的。一个接口可以有 个或多个端点。以下是框架提供的接口描述符的示例: ;接 口 群 组 ;描述符长度 ;类型:接口 ;接口数目以 为基数,交互设置值为 ;端点数目 规 格 定 义 码为 。没 有次 接口 群组 ;接口之字符串描述符的索引 : 字符串描述符 该描述符包含提供 设备驱动程序或用户应用程序使用的 字符串 。根据 在字符串描述表中出现的先后顺序,首先出现的字符串为字符串 ,其次 为字 符串 ,依次类 推。字符串 中包含设备所支持的语言代码。以下是框架的字符串描述符示例: : ;描述符长度 ;类型:字符串 : , )类别描述符 类别描述符用于描述设备的类别信息。该描述符由 架程序中 群 组 的 描 述 符 示 例: 设备类别规范定义。下面是框 ;描述 符长度 ;类 型: ; 规范 ;国 家 编 码( 空 ) 群组描述符数 ;群组描述符类型:报告 ;报 告 长 度 端点描述符 由于 群组增加了报告描述符,所以需要在 描述符文件中加上群组描述 符和报告描述符的部分,并且设置两个用于中断传输的端点描述符。端点描述符描述一个 端点。其参数包括端点号、类型和数据包长度等。以下是框架的端点描述符示例: ;端点 输入 传输 ;描述符长度 ;类 型 :端 点 端 点 ,方 向 ;类 型 :中 断 最大数据包数 ;轮询间隔 报告描述符 报告描述符描述 设备报告的用途和大小等。 输入报告描述符 ”输出报告描述值 用途页( ,制造商定义) 用途 (制造商 定义) 集合 (应 用) 用途 (制造商 定义) 集合(实体) 用途页(制造商定义 ;用途(制造商定义) 用途(制造商定义 逻辑最小值( 或 逻辑最大值( 或 实际最小值( 实际最大值 ;报 告大 小( 位 ) ;报 告 数 输 入(数据、变 、绝对值) ;用途(制造商定义) 用途(制造商定义 逻辑最小值( 或 逻辑最大值 或 ;实际最小值( ;实际最大值( ;报告大小( 位 ) ;报告数( 输出(数据 变量、绝对值) ;集合结束(实体) ;集合结束(应用) 设备文件(文件 在这个程序中,将设置外围电路的输入和输出,也就是执行 接口的控制和传输。由 于 芯片与 兼容 ,因 此编 写外 部电 路驱 动接 口的 固件 程序 ,就 好像 是用 语言编写 程序一样。 主 程 序 如 下: //不要产生中断向 # //延时程序 //所收到的设置数据的标志 ( ) # # # # 当前配置 交替配置 // //设备请求副函数的钩子 //以下的副函数钩子将通过设备请求器来调用 // //等待结束信号 //设置初始值 按键地址 //等待结束 设置结束位 //起始时调用 //设置端点,使能端点 与 中断 附录 列出的一些寄存器再写入时需要用到这个延迟函数 设 置端 点 ,使 能 中断 //因为默认的端点都是双倍缓冲,所以必须将数据写入两次 //通过对 计数寄存器写入值来准备 输出传输 通过对 计数寄存器写入值来准备 输出传输 ; //数码管只显示小数点 //初始值 //检测小数点值是否有变化 准备 输入传输 //使能远程唤醒 //当设备停滞时,重复调用这个函数 //关闭 )中 断 //更新数码管的显示设置 { (! ) ; ! ! 按钮是否有变化 输出寄存器是否有数据准备好 //输出报告 //小数点 //重新准备 位为固定时间( 传输 //准备 传输 //如果小数点的数据有变化,则更新数码管显示 //更新小数点值 ; 应用程序设计 运行在 或其他更高版本操作系统的 机系统,将提供通用的 设备底层 驱 动 。此外 ,还 单独 提供 了一 些 设备的完整驱动,使应用程序能够很容易地与操作系统 内部的 通信。这也就是说,要实现 类的 设备是不需要自己开发驱动程序的, 也不一定要是标准的外设类型,惟一的要求就是交换的数据存储在报文的结构内,设备 固件必须支持报文的格式。 函数简介 在 驱动程序开发工具组( )中 ,对 于 用 户 模 式( 应 用 程 序 阶 层 )的 通信 部分,提供了比较完整的指导守则,也提供了使用 语言来编写的范例 。设计者也可以使用 等语言调用 函 数 ,以 完 成 主 机 与 设备的通信。 表 列出了在 通信中所要使用到的主要 函数。这些函数包含在 和 个动态链接库中,分别起到与 设备通信、寻找与识别设备 和交换数据的作用。 表 函数 应用程序 语言句法简单、灵活、易于掌握,用它来开发通信程序是一种比较快捷的途径。但是 声明格式在 的文档中全部采用的是 语言的格式声明,而且 与 语言在变量 的声明、存储格式上都有很大的区别,因此首先需要进行类型转换。另外,在 语言中有指针 的概念而 中却没有,所以需要用 按地址传递或 取变量地址等方法进行相应 的操作。 对 函数的具体调用在这里不做详细介绍,因为涉及到的 函数多是一些通用 函 数。 源程序代码如下: 文 件: 程序运行结果 首先打开控制面板,单击 将固件程序下载到开发板上。这时查看计算机“设备 管 理 器 ”,显 示 的 设 备 如 图 所示。 这就说明固件程序已经在开发板上运行, 系统 也已经找到了 设备的驱动程序。此时观察开发板数码 管,可以看到已经开始显示从 的数据。 运行设计好的 应 用 程 序, 运 行 后 的 界面 如 图 所示。图 显示在 开发板的运行效果,表明固件 图 程序与主机能够很好地通信。可以发现,图 中显示的 设备管理器 号与固件描述文件中的 号一致。单击 按钮,主机将开始寻找与程 序描述中相符的 设备。如果找到此设备,则显 示 ;否 则 将 显 示 ,说 明未找到指定的 设备。 下面的数字框将开发板上数码管正在显示的数 字显示在主机上,滑动条与开发板上 和 按 钮 的作 用一 致 。按下 滑动条向左移,同时数字累加 的速度变慢;按下 滑动条向右移,同时数码管上 数字变化的速度变快。在主机上拖动滑动条,也可 以很方便地控制数字变化的快慢。 按 钮 与 开 发 板 上 的 和 按钮相同,用来改变开发板和框图 中小数点的状态。单击 按钮显示小数点,单击 图 应用程序运行界面 按钮不显示小数点。同时,在主机上单击 按 钮显示小数点,再次单击 按钮将不显示小数点。 图 程序在 开发板的运行效果 附录 封 装、 脚分配及功能 表示可编程极性。图 图 引脚 中的“ ”含 义 均 同 封装的引脚及其分配 图 引脚 封装的引脚及其分配 图 引脚 封装的引脚及其分配 图 引脚 封装的引脚及其分配 引脚 封装尺寸 图 引脚 封装尺寸 图 引脚 封装尺寸 图 引脚 封装尺寸 表 引脚描述 续表 续表 续表 续表 续表 续表 续表 续表 续表 续表 附录 寄存器 引  言 本附 录根据 寄存器 出现 在存储 器表中 的次序 ,对 寄存器进行描述。寄存 器根据以下的规则命名。 大多数寄存器都用于端点的处理。通用寄存器的结构为 其 中: 代表端点的方向,相对于主机的 和 为 端 点 的 编 号 ,其 中 表示作为一个组合整体的同步端点。 是功能 ,其中: 为控制和状态寄存器。 为中断请求位。 为中断允许位。 和 为字节计数寄存器。 用于单字节计数, 用 于 位字 节计 数的高 、低字节。 为访问 的单寄存器。 为缓冲区起始地址。 寄 存 器 形 式 举 例: 指的是端点 的 字节计 数。 其 他 规 则: 表 示 整 体( 而 不 是 特 定 的 端 点 )的 功能。 为一个地址。 表示有效的。 为帧计数。 为一个地址指针。 图 给出了寄存器描述格式,说明如下 ; 第 行为寄存器名称、功能和在 存 储 器 中 的 地 址; 第 行为寄存器中各位的位置; 第 行为寄存器中每一位的名称; 第 行为 的访问权 只 读( 、只 写( )和读/写( 第 行为默认值,这些值是上电复位 )后 的赋 值。 图 寄存器描述格式 特殊功能寄存器 引入了很多控制寄存器作为特殊功能寄存器( ,这些特殊功能寄存器在表 中列出。粗体显示的 在标准 中 没 有 ,是 特有的。 表 特殊功能寄存器 注:所有未标注的为被保留的。 由于 是直接寻址内部寄存器,所以固件程序能够快速地对其进行访问,而无须采用 加载数据指针的间接方式和用 指令编程。例如,固件程序读 的端口 引脚 可以 采 用 单 指 令: 同样,固件程序向端口 写 入值 ,仅用 指令就可以实现 在 表 中, 行的特殊功能寄存器是位寻址,采用特殊的位寻址指令,寄存器的各个 位可以有效地设置、清除或触发,例如, 设置 寄存器的位 对于当前正提供中断服务的 中 断 ,向 或 写 任 意 值,将 清除 或 中断请求位。 写这些寄存器中的一个寄存器和清除相应的 外部寄存器区的中断请求位效果是一 样 的 。例 如 , 空标志中断是激活的, 自动设置 寄存器位 在外部数据 存储区的 ,并激活 中断请求。 利用自动向量, 自动调用(指向) 中 断 服 务 程 序( 首 要的任务是清除中断请求位 。固件程序可通过访问 寄存器 (在 并向它的位 写 ,或者也可以简单地向 写入任意一个值来实现。第 种方法使用的是数据指针,它必须保存并且保留在 的累加器中。第 种方法速度较快, 并且无须保存数据指针,所以这种方法是首选。 中的各位与 表 寄存器文件中的端点状态位相对应,如表 与 寄存器文件对应表 所列。 注:端点状态位表示包状态。 提供两个同样的自动指针,其类似于内部 数据指针,并具有如下特性:每一 个指针都能在每次访问存储器后自动加 ;利用一个或者两个自动指针, 固件程序可以快 速执行存储批量传输。 寄存器被配置为如下形式: 设置 冻 结 地址 指 针 ,设 置 ,对于每一次读或写 的特性。 寄存器都能使地址指针自动加 。这一位默认值为 ,并 允许自动加 为了使能自动指针,则应设置 。自动 指针使能 会产生如 下的作用 :任何 代码 访问( 例如,一个指令 来回)地址 和 ,将返回 值 ,而 不是这两个地址的代码存储器值。 随后,固件程序向 写 位地址。为了每一次对 的 读/写,地址指针自动地加 ( 如 果 端口 呈现为位寻址 。读寄存器或者位返回端口引脚 逻辑电平值需要两个 时钟。写一个寄存器位向端口锁存器写,而无论呈现在 引脚的端口锁存器的值是否依赖于引脚 )位的状态。 引脚也可以被设 计为交替功能值。在这种情况中, 和 位的值逐位覆盖。 是位寻址,例如,设置 的 位 ,从而设置 ,可以用下面的单指令 实 现: 端口 也采用一个特殊功能寄存器来访问,但是,与 不同,它不是位寻址。例如,可以用 (“ 或 指令来设置位 ;设 位 中的位打开用于 个 端口 则打开输出缓冲区,置 则关闭缓冲区。 的输出缓冲区。将 位 置 这些 寄存器的大多数也可以放在外部 空 间 ,其 地 址 如 表 表 寄 存器 与 外 部 等同 所列。 波形描述符数据 波形存储器 仅当 时可以存放。 个 波形描述符表被存放在 波形存储器空间。 通用配置寄存器 控制和状态 的 引脚和 引脚封装都有两个输出引脚,即 和 。它们可用于在 上的同步数据传输。当 时,这个特性被使能。任何一个对 的读操作,都会激活 选 通;同 样,任 何 对 于 的写操作都会激活一个 选通。 和 选通信号作用两个 时钟 周期,在 引脚被刷新之后, 选 通信号持续两个 时钟周期。 如果设计采用 引脚封装的 ,并且连接了片外存储器到其地址和数据总线,那么这 一位应当被设置为 。这是因为 和 引脚也是用于读/写片外存储器的标准选通信号, 所 以 ,对 端口 的读/写将中断正常的对存储器的访问。 时钟速率 这些位用于设置 时钟速率,具体设置如表 所列。在上电复位期间,这些位默认 为 固件程序在任何时刻都可以对这些位进行修改。 表 时钟速率 接 配置(端口、 接口配 置(端口 位 该位选择用于 和 的 时钟 源 。如 果 ,则 在 部时钟;如果 ( 默 认),则 选择 内 部 或 (默认为 位 位 用于选择内部 时钟频率,其频率如表 所 列。 表 内部 时钟频率 引脚选择外 )时 钟 。 三 态; =驱动。 位 表示 信号被反向。当 时,时钟极性反向,如图 所示。 时,时钟极性正常;当 图 配置 当 ,则 同步操作为:在 引脚上,时钟可以由内部,也可以 由外部来提供;对于时钟信号, 控制信号功能为读/写使能信号。 当 异步操作为:不要求有时钟信号从 输 入 , 控制 信号作用直接作为读/写选通。 位 当 用于诊断。 时,在 端 口 中的 位 如 表 所列。  位表示 表 端口 交替功能(当 时) 的状态, 接口方式选择如表 所列。 表 或 选择 这两个位控制的 接口信号如表 所 列 。 表 端口 引脚功能的 选择 续表 从属 注:黑体显示的信号不通过 改变,只是为了显示的全面。 引脚配置 有个 标志输出引脚,即 ,使用 个选择位。这些标志可以被编程表示为各种 器控制 和 信 号 ,而 寄存器控制 于所有 种标志的 位编码是一样的,如表 所 列 。 注意: 中的“ 可 以 是 或者 和 标志。 和 。对于每一个 寄存 信号。对 表 标志引脚功能 注: 默认为 固定的标志) 对 于 默 认( 选择, 个 标志被引用在表格的首行中。输入引脚 和 选择与 个 中 的 哪 一 个 相 对 应 。这 些 引 脚 解 码 如 表 所列。 表 与 和 引脚相对应的内容 如果 ,并且 地址引脚被 驱 动 ,则 是 可编程 标志, 是 的满标志, 是 的空标志,并且 默认为 。设置 ,使用 默认是 ( 固 定 的 标 志 )。 另外的 的( 非 值允许设计者独立配置 个标志输出 到与之相应的 个端点 的任意标志,即可编程、满、空。这就允许每一个标志被分配到 个 中的任意一个。外部逻辑可以用数据填充 ,同时也检查 的满标志。 复位 将 位某个 常操作。 位 写入该寄存器不应答所有从主机来的传输,然后,写 (例 如,恢复 端点 标志和字节计数为它们的默认状态),再写 通过写想要的端点数( 逻辑复位这个特定的端点。 断点、断点高位地址和断点低位地址 或 ,复 来恢复正 点 当 地址总线的地址与保存在位断点地址寄存器( 时, 位被置位。 引 脚反 映 出该 位 的状 态 ,可 以 通过 向 如 果 脉 冲 方 式 位( 置位,则没有必要清除 位。 )的地址 相一致 位写 来清除。 当 地址总线与保存在断点地址寄存器中的地址相匹配时,设置该位为 时 ,将 在 个 时钟周期中使得 位(以及 引 脚 )为 高;设 置 该 位 为 时 , 位(以及引脚 )将 保 持 为 高 ,直 到 通 过 固 件 程 序 清 除 为 止 。 如 果该 位为 ,那 么 ,只 要 致 ,就 产 生 信号。 脉冲激发,具体方式取决于 位地址线的值与断点地址寄存器( 位的行为以及与之相关联的 位的状态。 中的值一 引脚信号将被锁存或 当前的 断点事件。 位 地 址( 代 码 或 寄存器中的 设置 )与 位和 地址一致时,就产生一个 位控制断点事件的动作。 设置这两个位为 覆盖定时器向 的输入 ,而且 。这个方式向 提供正确的频率,此时不用考虑 或者 接口引脚极性 和 将使用 时钟频率为多少 该位选择 而 选择高电平有效。 输入引脚的极性。 选择如数据表所示的极性(低电平有效), 该位选择 择高电平有效。 输入引脚极性。 选择如 数据表所示 的极性( 低电平有效 ),而 选 该位选择 择高电平有效。 输入引脚极性。 选择如数 据表所示的极 性(低电平有 效),而 选 该位选择 选择高电平有效。 输入引脚极性。 选择如数据表所示的极性(低电平有效),而 该位选择 选择高电平有效。 输 出引 脚极 性。 选择如数据表所示的极性(低电平有效),而 该位选择 选择高电平有效。 芯片修改 输出引脚极性。 选择如数据表所示的极性(低电平有效),而 这些寄存器位定义硅片版本,可参见 芯片版本控制 半导体公司的数据资料。 在上电复位时, 和 都设置为 位 默认为 。 半导体公司推荐最好两个 的 当 时,程序代码在 从 向 切换时自举。这意味着在自动 输出方式与手动输出方式切换时,固件程序必须复位端点(此时可能会失去端点数据)。 当 时,程 序 代 码 在 从 向 切换时不允许自举。当自动与 手动方式切换时,这一特性允许 干预,而不必复位端点。 注 意 :当 并且 时 ,通 过运 行端 点, 由“ 起 动 泵 ”得 到 响应( 传递数据包到主机)。 当 时 , 既不能发出 数据包,也不能跳过 如下的性能。 数据包:跳过或提交; 数据包:提交或编辑/发送。 当 时 , 具有如下附加的性能。 数据包:跳过 、提交或者 编辑/发送; 数据包:跳过、提交或者编辑/发送。 保持时间 数据包。它只具有 对于任何事务处理, 写数据到 。这个寄存器决定了数据保持多长时间。 有效的选择是 或个 时钟周期。该寄存器适用于任何通过 写到 : 的数据,不论是否经过了流状态。 对于非流状态,通过在 中的特定数值,保持的值仅为 : 正常 (无保持)呈现的延时。 对 于 流 状 态 , 为总线上的主控制器( ,保 持 的 时 间 值 与 主 控 制器 选通信 号的有 效沿 有关 。在这种 情况中 ,主控 制器 选通信 号是 脚上的信号。 另外 ,对于流 状态 , 在总线上是从属的( ,通过在 中的特定数值,保持的实际值仅为 : 正常(无 保持)呈现的延 时,可作 用于主控 制器选通信号 的有效沿 。在 这种情况下 ,主控制器选 通信号是 引脚上的信号。 注意:在这种情况下,保持值不直接与主控制器选通信号的有效沿相关,而是同什么时候 数据对主控制器选通信号作出正常的回应有关,其中包括隐含的同步主控制器选通信号。 在所有的情况中,数据将保持想要的值,即使为确保 状态而要求数据总线为三态时 也一样。也可以说, 输出使能将通过与数据本身一致的值来保持。 =保留。 周 期; 周 期; 周 期; 端点配置寄存器 端点 /端点 配置 设置 默认 激活 一个 端点;而 时,端点处于不激活状态。所有 。一个端点的 位为 时,不响应任何 传输。 端点 这两个位定义端点的类型,其定义如表 所列。 表 端点类型定义 端点 和 配置 这几个寄存器设定为 大数据处理端点。 设置 默认 ,激 活 一 个 端 点;而 时,端点处于不激活状态。所有 端点 。一个端点的 位为 时,不响应任何 传输。 这两个位定义端点类型,其配置如表 表 所列。 端点类型配置 位用于所有大端点配置寄存器。 字 节; 端点 和 只能为 字节。 字节,而端点 和 可 以 选 择 。 位 端点缓冲区的数量如表 所列。 表 端点缓冲区数 缓 数量 端点 和的 配置 当一个 配置寄存器的 或 位被设置为 时,对于该端点变为有效 采样的 标志比 条件产生的要早。这些位只有在 依据内部或外部提供 的时钟进行同步操作时才起作用。具有 标志提早检测时钟的特性在相当程度上简化了 同步接口的设计(仅用于 端 点 )。 当 配置寄存器的 或 位被设置为 时,对于该端点变为有效采 样的 标志比 条件产生的要早。这些位只有在 依据内部或外部提供的 时钟进行同步操作时才起作用。具有 标志提早检测时钟的特性在相当程度上简化了同 步 接 口 的 设 计( 仅 用 于 端 点 )。 该位仅用于 端点。 当 时,只要缓冲区填入 数据,缓冲区就自动绕过 直接向端点 提交数据。这个端点 标志和缓冲区计数立即指示变化的 状态。 当 时,只要缓冲区中填入 数据,端点中断就被激活。缓冲区和端点 的连接由固件程序控制 而不是自动连接。采用这种方法,固件程序能够检查 包 的数据,并基于其发现,选择是否该包包含在端点 中。固件程序甚至能够更改该包的数 据,随之向端点 提交。 位( 在 寄存器中)选择跳过和提交包数据。 该位仅用于 端点。 有 寄 存器 ,允 许 固件 程序 配 置端 点的 大 小小 于用 于 实现 端点 缓 冲 区( 或 字节)的物理存储器。例如,固件程序配置 缓冲区为 字 节 ,然 后 通过设置 来设置 为 字节 (这里必 须配合 端点描述 符中 的 值 )。这 样 ,对 于 主机就使得 显示为 字节的端点,而实际 的物理缓冲区的大小是 字节。 当 时, 根 据 包 的 长 度 值 自 动 打 包 并 分 派 包,该长度值在 寄存器中。在这个例子中, 或外部主控制器,如果 工作在 方式时)可以用 字节缓冲区的 来加载, 逻辑作为两个( 和 字 节 )包 自动发送。 当 时,每一个包必须初始时由手动提交给 ( 称 为 当该标志为 时 ,只 要 被激活并且当前包中无字节数据,则将发送一个零长度 包。如果该标志为 ,零长度包将不能在 上发送。 该位选择在 和 引脚上的字节或字 或 。 全部 个 位 的“或 ”决 定 是为 位指示数据将如何通过各自对应的端点。 位应用于 还是为 。每一个 端点 包长度(高/低位) 包长度的高 位 。 包长度的高 位 。 包长度的低 位 。 这些寄存器能够被用于比物理缓冲区尺寸较小的包。 对于所有的端点,默认包的大小是 字节。 注 意: 和 可以具有的最大字节为 字节 而 和 可以具有的最大字 节为 字节,这与端点的结构相一致。 端点 可编程级标志(高/低位) 对 于 个端点的每一个 ,这些寄存器可控制指向哪一个可编程标志( )是激活的。 对于 和 端点, 域被中断的方式是不同的。 对于可编程级标志( )被 配置如 下。 当 返回一个用户定义满极限时,每一个 的 可编 程 级标 志( 就被激活 。其 极 限 配 置 如 下: 对于 包,这个极限被保存在 中。当全部 中的字节数小于或等 于( )或者大于或等于( )极限值时, 就被激活。 对 于 包 ,当 时 ,极 限 值 保 存 在 ]中 。当 被写 进当 前的 、在 中仍然未被提交的包的字节数小于或等于( 或者大于或等于( 极限值时, 就被激活。 对于 包 ,当 时,这个极限值被保存为两部分: 保持被提 交 包 的 数 量;而 保留当前的、仍未提交包的字节数。当 的满程度小于 或 等 于( 或 者 大 于 或 等 于( 极限值时, 就被激活。 根据默认设置, 是对于当前由 ]引脚指示的端点的可编程级标志 。对于 和 端点,其默认端点配置为 和 ,并且当整个 大于或等于 字节时, 引脚处于激活状态。而对于 和 端点,其默认端点配置为 和 ,并且当整个 小于或等于 字 节 时, 引脚处于激活状态。 换 言 之 ,当 为半满时,对于 和 的默认配置 是激活的;而对于 和 ,当 其 为半空时,默认配置 是激活的。 在 下 面的 例 中,位 具有要全部传送的数据。在例 中位 不需要在意这些位, 这是因为 例 假设通过端点 有一个批量 传输,并且 或 寄存器低位的总数)。 (十进制的 为两个包……)。 :表示传输将包含信息包(由位 定义)正字节(在标志 :表示期望传输期间传输的信息包的数量(在这种情况下, 在当前满包中有正 字 节( 在 ( 十 进 制 值 ))。 ,当 小 于( 例 为了执行通过同样端点数量的 写 一 个 值: 寄存器中的二进制总数为 )字节时, 才有效。 传 输 ,设 置 ,并向 寄存器 设置 ,使得 由基于字节独立计数来决定,忽略包计数。这种方式对于 双倍缓冲端点是非常有效的,在此,当前满包的字节计数显得非常重要。 ,在 当 前 的 中,当 小 于 字节时, 才有效。 的位 是字节计数寄存器的位 参见 和 寄存器定义。 参见 和 寄存器定义。 参见 和 寄存器定义。 参见 和 寄存器定义。 当 的位 在 端点 寄存器要求数据时,该寄存器包含当前被传输的包的字节。字节计数 寄存器的位 中。字节计数的位 为 寄存器的位 对 于 端点,触发寄存器由多个包构成,能应用于满 位控制这一选择,如表 所列。 或当前正在被填满的包中。 表 对 于 端点  的 中 断 例 下面是一个如何使用第 种情形的例子。 假设通过端点 有 一 个 批 量 传输。对于批量传输, 包缓冲区大小为 字节。 假设已告知每包为 字节的最大包大小值,而且已经配置了 倍缓冲区的端点。这意味着 只要 字节被加载到一个信息包的缓冲区, 逻辑就会向 接口提交该信息包缓冲区 数据,并 增加 字节到 端的 中。 在如下两个条件下,必须通知外部逻辑装满端点: 个包缓冲区中的其中两个为满(通过 提交发送,但是还没有发送); 当前的包缓冲区为半满。 换句话说,所有有效的 端点缓冲区空间总是满的,这一点可通过如下的设置来实现: 包含包的正字节。 :两个包。 在当前满包中有正 字 节。 例 如果要 ,设置 通 知 外 部 接 口(正 在 填 满 的 的控制接口逻辑),则只要当前的包装了 ,并加载一个信息包字节 的计数: 设置 ,使得 由基于字节计数来决定,忽略该包的计数。这种方式对于 双倍缓冲的端点很有用,在此,当前满包的字节计数是非常重要的。 端点 对于 端点, 标志应用于所有的多包 中的字节数,也包括无包计数。替代描 述字节计数的两个阶段为对于当前空包的信息包计数和字节计数,字节触发值显示全部在 中的字节有效。需要注意的是, 和  是不连续的。 注意:包字节计数不同于 高位,这是由于端点不同, 大小也不同。 最大可以为 字节长, 的 最大可以为 字节长,而 和 的 最 大为 字节长。 图 显示了最大 的字节长。 端点 图 每帧 大 尺寸 包 位 这些位仅对于 表 所列。 每 端点,用以确定每个微帧的包的数量(高速方式),如 表 每微帧 包 强制 包结束 当 自动分配一个 缓冲。 )被 设 置 为 时,设置该位为 将跳过 包。对该位清 将 复制 引脚的功能。这个性能仅用于 传输。 通 过 写 端 点 数( 和 逻辑自动分配一个 缓冲。例如,可以向 交信息包,并向端点的字节计数寄存器写累计字节计数,从而控制 传输。 强制 包结束 逻辑提 当 自动分配 缓冲。 )被 置 为 时,设置该位为 将跳过 包。对该位清 将 替换 (跳过)的功能。该性能仅用于 传输。通过写端点值( 和 逻辑自动跳过或提交( 包( 根 据 位 设 置 )。 注意:如果 ,那么该寄存器将不起作用。 中断寄存器 端点 标志中断使能/请求 中断寄存器控制所有 中断使能( )和中断请求( 求位为可编程标志( 、空标志( )和满标志( 为了使能这些中断中的任何一个, 。端点 )和 的中断使能和请 必须为 当 时,中断触发在可编程标志的上升沿;当 编程标志的下降沿 。 注意:为了使 指向适当的中断服务程序, 必 须 设 置 为 ( 、 ( 。 时,中断触发在可 当该位为 时,可编程标志中断由 使能;当该 位为 时,可编程标志中断被禁止。 当该位为 时,空标志中断在 使能;当该 位为 时,空标志中断被禁止。 当该位为 时,满标志中断由 使能;当该位为 时,满标志中断被禁止。 端点 的中断使能和请求位为可编程标志( 、空标志( 和满标志( 设置 有效。 为 来指示可编程标志中断请求。在中断向量寄存器 中,中断源为 设置 有效。 为 来指示一个空标志中断请求。在中断向量寄存器 中 ,中 断 源 为 设置 为 来指示满标志中断请求。在中断向量寄存器 中,中断源为 有效。 注意:不要通过读 寄存器、对其内容用位屏蔽以及向 寄存器回写等方法来清除 位;否则将导致清除所有待处理的中断任务。直接向 寄存器写入位屏蔽值即可处理 中断请求(在需要清除的 的对应位上写入 中断使能/请求 这些中断发生在主机向 端点还没有加载数据,并且对 端点发送一个 令牌的时候,这时,这个 传输控制。在这种情况下, 自动返回无应答 令 牌,并设置该端点的 位。 设置 ,使 能 中 断;设 置 ,禁 止 中 断 。 一个 位被设置为 ,用于指示中断请求。这个中断源在中断向量寄存器 中为 有效。固件程序通过向它写 来清除 位。 注意:不要通过读 寄存器、对其内容用位屏蔽以及向 寄存器回写等方法来清除 位;否则将导致清除所有待处理的中断任务。直接向 寄存器写入位屏蔽值即可处理 中断请求(在需要清除的 的对应位上写入 端点 中断使能/请求 这些寄存器仅在高速( )操作时 才起作用。 对于 传输 通过实行 机制对 总线的带宽进行了有 效改善。当主机要向一个端点发送 数据时,它首先发送一个 令牌去观察是否端 点已经准备好了,例如,是否有一个空缓冲区等。如果一个缓冲区是无效的,那么 将返回 一个 握手 信号; 传 输 将 继 续 ,直 到 缓冲区为有效。此时, 用 握手信号来回应一个 ,然后主机向该端点发送 数据。 中断表示主机试图发送 数据,但是由于没有端点缓冲存储器是 有效的,所以 将用 来响应。固件程序可以用该中断来释放一个 端点缓冲区。 当任何 批量端点用 来响应 令牌时,该位将自动设置。该中断发生在向批量 端点发送一个 令牌时,而该 批量端点还未准备好。单独的使能和请求(对于每一个 端点)是通过 和 寄存器来控制的,清除该中断请求可以向该位写入 仅在所有被使能的 源 的“或 ”条 件 的 到 转化中触发。 固件通过向它写 来清除 位。 中断使能/请求 状态段完成。 当准许向 高 速( )存 取 时 , 设置该位。 通过控制 + 和 为低电平(至少 发送总线复位信号。当 到 总线复位发生时,会使 中断请求有效。当 内核检测到 它设置该位为 。向该位写 可以清除中断请求。 内核检测 总线复位时, 如果 核检测到 以清除该中断请求。 检测到 总线无活动,将激活 ( 挂 起 )中 断 请 求 。当 内 发出的信号(无总线活动 )时,将 设置该位为 。向它写入 可 当 内核接收到 令牌时,将设置该位为 。向它写入 可以清除该中断请求。 当 内核接收到 包时,将设置该位为 。向它写入 可以清除该中断请求。 当 内核已经从端点 向内部寄存器(在 )传输了 个 数 据 字 节 的 包时,将设置该位为 。向它写入 可以清除该中断请求。 端点中断使能/请求 这些端点中断使能/请求寄存器指示对于每个批量端点的待处理中断。对于 端 点 ,当 主机从端点得到一个包时中断激活。而对于 端点,中断的激活是在主机向端点提供一 个包时发生的。 的位功能是独立的中断使能( )位,所以中断请求由中断是否被使能来控制。 注意:不要通过读 寄存器、对其内容用位屏蔽以及向 寄存器回写等方法来清除 位;否则将导致清除所有待处理的中断任务。直接向 寄存器写入位屏蔽值即可处理 中断请求(在需要清除的 的对应位上写入 中断使能/请求 到 固件 程 序在 波 形中 的 “挂 钩 ” 。当 波形 描 述符 被 运行 时 ,激 活 中断。 = 处 理 中 传 输; =传输完成( 处 于闲 置 ,因 此 已经准备下次的传输),如果使能,则触发 。 固件程序通过向其写 来清除中断请求。 注意:不要通过读 寄存器、对其内容用位屏蔽以及向 位,否则将导致清除所有待处理的中断任务 。可 以 直 接 向 需要清除的 的对应位上写入 寄存器回写等方法来清除 寄存器写入位屏蔽值(在 错误中断使能/请求 在如下情况时, 标志被 设置: 数据 超出序列(仅应用于高速方式); 由于 包(在缓冲区满或是高速方式)无有效的缓冲空间,所以一个 空出。 包被 计数 总线出错 、位滞 塞等,以及当 编程极限 达到时,触 发中断。 固件程序通过向其写 来清除中断请求。 注意:不要通过读 寄存器、对其内容用位屏蔽以及向 寄存器回写等方法来清除 位,否则将导致清除所有待处理的中断任务。可以直接向 寄存器写入位屏蔽值(在 需要清除的 的对应位上写入 错误计数器限定 出错计数的最大值为 总线出错计数和极限。当极限达到时,固件程序可以使能中断,从而产生一个中断。 默认极限计数值为 清除错误计数 向该寄存器写入 ,可清除在 )自 动 向 量 寄存器中的 )位 。 为了保存代码和处理定时请求而对 中断产生分类, 代码提供第 级中断向量, 被称为自动向量。当 获取 中断时,将程序计数器值压入其堆栈,并且随之跳转到地 址 ,在此处预期找到 中断服务程序的跳转指令。 显示从 其更新 内核来的一个中断源。当 来指示该中断源。该中断源由 内核产生一个 来编码。 和 )自 动 向 量 中断请求时, 为了保存代码和处理定时请求而对 中断产生分类, 核心提供第 级中 断向 量, 被称为自动向量。当 取得 中断时,其将程序计数器的值压入堆栈中,并且随之跳转 到地址 ,在此处预期找到 中断服务程序的跳转指令。 显示从 内核来的一个中断源。当 内核产生一个 中断 请求时,其更新 来指示该中断源。该中断源由 : 来编码。 和 设置 为了流畅处理 中断的代码,该位使能 上的自动向量。 如果 ,则 源内部来提供。 通过引脚来提供;如果 ,则 通过 为了流畅处理 中断的 代 码 ,该 位 使 能 上的自动向量。 输入/输出寄存器 交替配置 注:位 在 唤 醒 寄 存 器 中 的 寄存器选择对于 中。 引脚的交替功能。 如果 ,则设置该位为 ,配 置 引脚为 ,即可 编 程 标志。 如果 选择。 ,则设置该位为 ,配 置 引脚为 ,即为从属 芯片 设置这些位为 ,配置这些 为 注意:位 和 置 ,则 将取得优先。 交替配置 或 引脚。 两者都影响引脚 。如果两个位都被设 设置这些引脚为 ,配置该端口用于输出使能 寄存器中的位 设 置 。 设置这些引脚为 配置为端口 地址引脚的低位地址。辅助位在 交替配置 地址位 引脚,设置这些引脚为 地址。 设置这些引脚为 ,配置为端口 ,配置该端点输出使能 地址引脚的高位 定时/计数器 俘获/重新加载输入。 设置该位为 来配置该端口 引脚为 方式 同步数据输出 方式 : 同步数据输出。 串行方式 提供同步、半双工串行通信。对于串行端口 ,串行数据在 出 ,由 引脚接收;而对于传送和接收, 引脚提供移位时钟。方式 式 :串 行 端 口 数据输出。 引脚输 :时 钟 输 出;方 总线控制和状态 设置 位为 来准备总线传输。如果 在 中的数据的串行字节来产生随后的起始条件。在 清除 位。 ,则 下 一 次 向 写将通过 间隔期间,由总线控制器来 设置 来结束总线的传输。在完成 条件后,由总线控制器来清除 位。如果固件程序在字节传输期间设置了 位 ,则 条件将在随后的 字节传 输阶段立即产生。如果 位 被 设 置 但 没 有 字 节 传 输,则 条件将在总线上立即被执 行。直到 位返回低电平,数据都不必写入 或 中。 为了读 总线上的数据,总线主控制器将 浮 空 ,而 在 线上产生时钟脉冲。在 每一个 位发出后,主控制器驱动 为低电平作为一个用于指示 信号。为了发送读 传送的最后一字节,主控制器在 期间将 线浮空,命令从设备停止发送。在读最后 读传送字节之前,通过设置 来 控 制 。 在 传 输 的 末 尾( 期 间 ),总 线 控 制 器 清 除 位。 这些位通过引导加载设置,在上电时,用于指示被检测到的 位 或 的从地址是 还 是 。通常,它们仅用于调试。 位地址 该位指示总线出错。 表示存在总线冲突,当一个外部设备驱动总线为低电平而 又不能实现时,或者当另一个总线控制器得到了优先权而控制了总线时,这个错误结果就会出 现。当 寄存器被读/写时, 将被清除。 每当第 个 或写操作从设备时,通过发出 来声明字节被接收。在此期间,总线 控制器将 浮空,采样 线,并用检测值的补码更新 位。 ,表 示 确 认; ,表明未得到确认。 内核设置 的同时更新 位。对于总线上的读 传 输 ,则 忽 略 位。 不 论 控制器何时完成字节传送,都会在 后设置该位。当控制器设置 位 时,还产生一个 中断请求( 。不论何时读/写 寄存器, 控制器都会自动清 除 位 和 中断请求位。 总线数据 位数据,触发总线传输。 总线控制 当 位在 到 寄存器的 确定中断源。 的转换时, 位中断请求被激活。为了使能该中断,应设置在 位。固件程序通过检查 寄存器中的 和 位来 对于支持 总线的设备, 总线可以工作在 。为 了 兼 容 ,总 线 上 电 时 ,可 工 作 在 。如果 ,则 总线 作在 ;如 果 ,则 总 线将 按 的频率工作。该位被复制到 寄 存 器 的 位 ,并由固件程序来读/写。 总线的速度是通过 位来初始化设置的,并且可通过固件加以改变。 自动指针 和 的 访问 数据向 寄存器读或写,是通过 后的任意增加地址来访问存储器地址的。 寄存器 寄存器和在读或写之 这两个寄存器是为调试而设置的。由这两个寄存器描述的 是基于 传输的 协议定义的规则来计算的。当数据在 上 传 输 时 ,由 自动计算。 这两个寄存器在传输中的任何一点实时返回 的 计 算 值 ,但 是 在 进入闲置状态 时 ,将 重 新 设 置 种子值。因为这两个寄存器是可写的,因此当前计算的 包括种 子值在任何时刻都可以被改写。 该寄存器仅应用于 传输,并由主机决定。另外,该寄存器可以完全被忽略。 该寄存器涵盖一个非常特殊、潜在不存在的 情况(从一个典型的系统执行的 立场出发。一个典型的 系统具有一个设备替代主机,来决定 传 输,因 此 应 当完全避免这种情况)。然而,这种情况可能还是会发生,在 协议中是允许的,因此应 当通过该寄存器来考虑并解决。 协议中规定,如果主机(这种情况指的是 )决 定 一 个 传 输 ,则 此 设备(如磁盘驱动器)被允许在主机使得 信号失效后,仍然可以发送 个或更多 字。这些“滴下”的字可能对于主机无用,因此可能被丢弃。然而,由于考虑传输差错冗余,主 机和设备必须与 比较和匹配,并仍然在它们中计算。 通常只计算在被写入 (并没有被丢弃)字上的 。这就出现了一个问题,某 些字将被丢弃但却仍然被包含在 的计算中。该寄存器提供了一个 计算具有额外 丢弃字情况 的途径。 可以通过如下的方法对该寄存器编程: 位被设置为 范围 被编制用于选择 引 脚 ,并 与 信号一致。 位被编程为 。这将指 示 在 时从设备来的任意 边沿计算 该位使能 限定的特性,并因此使能在该寄存器中的其他位。 该位说明 限 定 信 号( 由 写入 的字上计算。 选择)必须处于何种状态,并允许 在被 该位选择哪一个 ]引 脚 为 限定信号。 控制寄存器 控制和状态 如果 中断请求。 ,则 工作在高速方式( 。该位的 到 转换产生 位 是 控制和状态)寄存器中的 它控制重枚举过程。设置该位为 ,将通过从 +去除内部 断开连接。引导 通常在启动时刻默认该位为 该 控制位的其中之一。 上拉电阻而从 总线 几个寄存 如 果设 置为 ,则禁止混合缺少 该位控制 设备请求是通过固件处理,还是通过 自动处理。当 时, 代码处理所有的设备请求;当 时,固 件 处 理 除 了 之外的所有设 备请求。在一个总线断开连接期间,设置 ,传输 控制给固件。 ①完成“ ”引导加载; ②当使用外部存储器( ,并不使用引导 时。 设置 来 完 成 ,而 且 是 在 ,然后设置 ,可以 驱 动 在 总线上的 状 态 。 为 发送 进入挂起状态 状态。这将由可以远程唤醒的设备 信号,应设置 ,等待 向备用芯片写 ,而不必等待总线挂起。 唤醒控制和状态 有两个引脚,它们能由为得到 和 备用输出的外部逻辑激活。这两个引脚被称作 当唤醒通过 引脚初始化时, 设 该状态位为 。可以向该位写入 来清除。 当唤醒通过 引脚初始化 。可以向该位写入 来清除。 输入引脚的极性。 为低电平有效; 为高电平有效。 输入引脚的极性。 为低电平有效; 为高电平有效。 激活 信号通常初始化 唤醒顺序。 为 禁 止; 为使能。 时 ,从 引脚使能唤醒。 时 ,从 数据触发控制 引脚使能唤醒。 表示 写端点选择位( 和 表示 。端 点 由 和 位来选择。在读值之前, 通过写端点选择位( 和 选择期望端点后,设置 。当该位被写入时,端点选择位不应被改变。 来设置数据触发为 设置 来设置数据触发为 。当该位被写入时,端点选择位不应被改变。 设置该位在设置其 或 位之前来选择端点。 一个 端点。 ,选 择 一 个 端 点; ,选 择 设置这些位在设置其 或 位之前来选择端点。其有效值为 和 帧计数的高位 采用一个 牌。在每一个 部 ,并将 位累加帧计数,每毫秒主机发送一个表示帧状态的 令 复制帧计数到这些寄存器。帧计数的用途之一就是响应 请求。如果 内核侦测到缺失或错误的 ,那么就会产生一个内 加 帧计数的低位 采用一个 位累加帧计数,每毫秒主机发送一个表示帧状态的 令牌。在每一个 复制帧计数到这些寄存器。帧计数的用途之一就是响应 请求。如果 内核侦测到缺失或错误的 ,那么就会产生一个内部 ,并将 加 。 微帧计数 存器仅在 包括一个 的计数,分别表示最后出现的 个 处于高速状态时激活。 的微帧。该寄 功能地址 在 通常 重枚举过程中,主机发送一个设备的惟一地址, 核复制此地址到该寄存器。 不用知道其 设 备 地 址 ,这 是 因 为 内核仅自动响应它分配的地址。 端点寄存器 端点 字节计数高位) 即使 缓冲区仅为 字节, 字节计数也允许用 采用定制的长度扩展到 位 ,代 替 指令长度(依据设置数据包和请求字节数)。上表中圆括号中的字节计数位 仅用于 的时候。 通常决定有多少个字节通过 端点获得在 包中较小的 域以及 传输字节的有效数(字节计数)来响应一个驱动请求。 端点 控制和状态(字节计数低位) 即使 位 ,代 替 仅用于 缓冲区仅为 字节, 字节计数也允许用 采用定制的长度扩展到 指令长度(依据设置数据包和请求字节数)。上表中圆括号中的字节计数位 的时候。 端点 字节计数 端点 和端点 字节计数高位 和 可以为 字节或 字节,它们是由字节计数高 位决定的。 端点 和端点 字节计数高位 和 仅为 字节,这是字节计数最有意义的位。 端点 字节计数低位 端点 和 的低位字节计数。 端点 控制和状态 段为一个同数据段相反的空数据包,或者无数据段时为一个 包 。 这 个 空 包 在所有 传输中给设备提供 或 的选择。向 握手) 位写 对其清除,并命令 内核响应 段。直到设备已经有时间响应一个请求,在 整个 传输中, 位都应当保持。清除 位 (通 过 向其 写 ,命 令 内核响应传输状态段。 为 一 个 只 读 位,当 一 个 写字节计数来设置。 令牌到达时,自动清除。 位通过向 为一个读/写位,当一个 令牌到达时,自动清除。 器位写 来设置。 当 时 , 内核发送 ,可以为任意的 或 以产生控制传输的数据或握手阶段。 注意:为了在端点 上表示端点停滞,应当设置 和 位通过向寄存 令牌。这就可 位。如果仅设置 位,则端点 永远无法应答,这是因为主机保持的控制传输还待执行。 端点 控制和状态 位表示端点 缓冲区 的状态。当 缓冲区的主机数据有效 时 , 内核设置 。固件程序通过加载端点细节计数寄存器来设置 当 时 ,端 点 数 据为 无效 ,端 点缓 冲 区通 过固 件已 经 被置 空 ,并且 正在 等 待从主机来的新的 数据,或者正在处理通过 加载的数据。当 传输完成 并且端点在 中可由固件读的 数 据 有 效 时,那 么 。当 固件程序还在从 端 点 读 数 据 )时,端 点 令牌将无应答。 从 到 转换(表示固件可以访问缓冲区)对于 端点将产生一个中断请求。 当固件从 端点缓冲 区读数据之后 ,可采用任意加 载端点的字节计 数寄存器 ,从 而重新控 制端点,并自动设置 。这就使得从主机来的数据的 传输能够响应下一个 令牌。当 时 , 在任何时候都不应读端点数据。 位也表示端点的 缓冲区 的状态。当端点的 缓冲区为空并通过 固件准备加载时, 内核设置 。固件程序通过加载端点的字节计数寄存器来设 置 当 。 时,固件程序不应向 端点缓冲区写数据,这是因为端点 可能正在 通过 向主机进行传输数据的操作。当 传输完成并且用于固件访问的端点 数 据 为 有 效 时,则 。当 固 件 还 在 向 端 点 缓 冲 区 加 载 数 据 )时 ,对 于 端 点 的 令牌此时无应答。 从 到 转换(表示固件可以访问缓冲区)对于 端点将产生 一个中断请求 当 固件向端点缓冲区写被传输的数据之后,它就用传输的字节数来加载端点的计数寄存器,并自动 设置 。 这 就 使 得 向 主 机 的 数据传输能够响应下次的 令 牌 。再 者 ,当 时 , 任何时候也不应加载端点数据。 固件向 端点忙位写 来放弃对先前控制的端点(这时设置 。当 总线 复位、主机选择一个新的接口或变更设置使用端点时,固件才应如此做。这样可防止依据先前 通过主机的第 次使用新设置 传输而被接收的失效数据。 每一个批量端点( 或 )的控制和状态寄存器(位 都具有 设置了该位,那么任何请求端点返回一个 握手都优于返回 位。如果 或 。在得到端 点状态请求时,将返回对于表示字节 请求端点的 注意:端点数 (字 节 的位 指定用法。 端点 控制和状态 状态。 中 包 的 数 量 ,为 包。 该位设置为 ,表示端点 为满。 该位设置为 ,表示端点 为空。 设置该位为 ,可以停滞一个端点 设置该位为 ,则可以清除此停滞。 当停滞位为 时,对于所有对端点的请求, 内核将返回一个 通报主机某些意外情况的发生。 握手信号。这将 中 包 的 数 量 ,为 包。 该位设置为 ,表示端点 为满。 该位设置为 ,表示端点 为空。 设置该位为 ,可以停滞一个端点;设置该位为 ,则可以清除此停滞。 当停滞位为 时,对于所有对端点的请求, 内核将返回一个 通报主机某些意外情况的发生。 握手信号。这将 端点 控制和状态 中 包 的 数 量 ,为 包。 该位设置为 ,表示端点 为满。 该位设置为 ,表示端点 为空 设置该 位 为 ,可以停滞一个端点;设置该位为 ,则可以清除此停滞。 当停滞位为 时,对于所有对端点的请求 内核将返回一个 通报主机某些意外情况的发生。 握手信号。这将 端点 控制和状态 中 包 的 数 量 ,为 包。 位 该位设置为 ,表示端点 位 为满。 该位设置为 ,表示端点 位 为空。 设置该位为 ,可以停滞一个端点,设置该位为 ,则可以清除停滞。 当停滞位为 时,对于所有对端点的请求, 内核将返回一个 通报主机某些意外情况的发生。 端点 和端点 的 标志 握手信号。这将 可编程标志的状态。 空标志的状态。 满标志的状态。 注 意: 的设 不会影响该位。 端点 和端点 的 标志 可编程标志的状态。 默认值 和 是不同的。 空标志的状态。 满标志的状态。 注 意: 的设置不会影响这些位。 端点 的 总字节计数高位 端点 中的字节总数,最大为 字节。 端点 的 总字节计数高位 端点 中的字节总数,最大为 字节。 端点 和端点 的 字节计数高位 端点 中的字节总数,最大为 端点 的 字节。 字节计数低位 端点 中的字节数的低位字节。 设置数据指针高位和低位地址 该缓冲区通过设置数据指针来作为目标或源,而且必须与 字节)配套。对于处 理 传输,这个 位指针 : 提供硬件协助。 当固件加载 时 , 用适当的数据自动响应 命令 如 果 则长度 范围从信 息包或者描 述符得到 。如果 触发向主机发送,并 且该长度从 和 字节中得到。 设置自动数据指针 为了使用设置数据指针发送一个数据块,其批量的起始地址加载到 。该 批量的长度必须预先已经被设置,实现的方法应依据 位的状态。 (手动方式):用于通用的批量传输。固件向 写批量长度。 自 动 方 式 ):仅 用 于 发 送 设 备、配 置、字 符 串、设 备 限 定 以 及 其 他 速 度 配 置的描述符。批量长度从它本身描述符的长度范围自动读到,而且必须从外部加载 向 写入,启动传输, 将自动发送全部批量数据,而且分包。 注 意 :当 时 ,向 的写操作仅设 批量长度,而不能控制传输 (传输由向 的写来控制)。因此,在执行一个没有使用设置数据指针(意味着通过 向 写 来 控 制 )的 传输之前, 必须被置 设置数据的 字节 设 置 数 据 字 节 被 定 义 如 下: ; : 这个缓冲区包含从最近接收到的 (设置数据有效)的中断请求位被设置时, 传输的 数据包的 中的数据有效。 字节。当 通用可编程接口( 波形选择器 )寄 存 器 当单次写由固件触发时,指示波形程序运行。 当单次读由固件触发时,指示波形程序运行。 当 写由固件触发时,指示波形程序运行。 当 读由固件触发时,指示波形程序运行。 选择 波形: 工作和闲置驱动方式 为事务处理进行中; 为事务处理完成( 处理)。如果 使 能 ,则 将被触发。 为闲置,因此 已经准备下一次事务 当 为 闲 置 时 为三态数据总线; 为驱动数据总线。 输出 参见 控 制 引 脚( 具有如下输出方式,如表 所列。 可作为 输出(三态)或漏极开路输出; 可作为 输出或漏极开路输出。 如果 被配置为三态,那么 无效。 在 状态期间, 的 状 态 由 如 下 寄 存 器 的 位 决 定: ; ; 在 状态期间,这些位按如下的方式组合起来定义 如果 为 ,则在 状态期间 直接描述 的输 出状态。 位决定 : 输出是 ,还是漏极开路输出。如 果 ,那 么 为 输出;如果 ,则 为漏极开路输出。 如果 为 ,则 为 : 信号的输出使能,并且 为 的输出值。 和 在这种方式中无效。 表 列举了在 状态期间的控制输出的关系。 表 在 状态期间的控制输出( 高位地址 参见 地址的低位 被写到这个寄存器的数据将立即呈现在地址总线的 引脚上。 流状态寄存器 对于全部的流状态/ 信 息 ,请 与 半导体公司的应用部门联系。 在一个波形中, 种状态中的任何一种(而且只能有一种)都能被编程为流状态。这 个寄存器定义的状态,即使是任意的,在下一个 波形调用都将为流状态。 流状态全部使能。当 被禁止时,所有流状态寄存器将不起作用,并且下一个波形的 调用将不产生可用的流状态。 定义 状态为流状态。其有效值为 该寄存器的位定义与 在波形描述符中的操作代码的位定义相类似。不同的 是,禁止由控制判决点的分支来替代,在一个流状态中,它控制数据的冻结和流动。 当流逻辑等于 和 见 和 时 ,用 户 定 义 的 状态。这在使协议有效和无效中是很有用的。此时,按协议已经发出保持外部主控制器(这里 的作用就像一个从属设备)响应内部 标志的临界上溢出和下溢出情形警告。 在这种情况中, 为主控制器。当流逻辑判断为 或 时,也可以定义主控制器选通 是 否触 发(在 总线 上读 或者 写 数据 )。对 于 ,当 时 钟 数 据输 入、输 出 且当冻结数据 流时,考虑协议已经从从属设备以及 标志发出信号来判定,这些是很有用的。 应当被重视的是,这个流逻辑并没有取代定义在波形描述符中的判决点逻辑。在波形描 述符中的判决点逻辑仍然被用于判断何时进入流状态。判决点逻辑可使用完全不同的一对准 备就绪的信号与其判决的流逻辑进行比对。 流逻辑的判决可基于输出为 或 、 作。这里“!(! ”等 同 于“ ! 以及“!(! ”的 操 或 满 限( 依 据 标 志( 或 ,依据 ; 。 当流逻辑的输出为 时 , 定义 引脚的状态;当流逻辑输出等于 时, 定义流状态。在流状态期间,波形描述符中的 操作码完全被忽略, 并且 引脚的作用改为由这两个寄存器定义。 位:如果 未 被 使 用 ,而 则指定相应的 输出信号是否为三态。 为驱动 为三态 位:在所有状态期间,指定状态来设置 信号。 为高电平时,如果在 寄存器中的 位被置 ,那么输出驱动将为漏 极开路;如果在 寄存器中的 位被置 ,那么输出驱动将为 电平。 为低电平时,由 以及相应位来定义。 ; 。 在流状态期间,这些位联合定义 ,情 况如 下: 如果 为 ,那么在流状态期间 出状态。 位决定 输出为 ,则 为 电 平;如 果 为漏极开路。 如果 为 ,那 么 为对于 为 的输出值。 和 表 说明了在流状态期间的控制输出的关系。 表 在流状态期间的控制输出( 直接描述 的输 还是漏极开路。如果 ,则 信号的输出使能,并且 在该方式中无效。 说 明: 基于推荐 设置。 该寄存器定义在流状态期间用于数据的读/写主控制器选通。 对于 在总线上处于从属地位的传输,主控制器选通将是 引脚之一。这包 括外部主控制器可任意向 写数据(例如, )或 从 读出数据。 对于 在总线上处于主控制地位的传输,主控制器选通为 引 脚之 一 。这 包 括 向从属设备写数据(例如, )或 从 从 属 设 备 读 数 据 。 该位为 时 , 为总线传输的主控制器。这意味着 控制器选通,并且这一特别位将由 来选择。 该位为 时 , 为总线传输的从属设备。这意味着 控制器选通,并且这一特别位将由 来选择。 引脚的其中之一将为主 引脚的其中之一将为主 如果 引 脚 )与 同步。 为 ,则该位被忽略,否则该位为 时,主控制器选通(在这种情况下为 异步;该位为 时,主控制器选通(在这种情况下为 引 脚 )与 如果 为 ,则该位被忽略;否则,该位定义由主控制器选通(此时为 )触 发 的 流逻辑状态。如果该位被置 ,而且流逻辑的输出等于 ,则主控制器选通将由于数据在总线 上流动而触发;如果流逻辑输出等于 ,则主控制器选通将由于在总线上数据流暂停而冻结。 如果 为 ,则该位被忽略。 注 意:在 为 时,存在流状态,主控制器选通(此时为 定义在波形描述符中附加于 的操作码。 引脚)通常将返回被 如果 为 ,则这些位将选择 引脚的其中之一为主控制器选通。如果 为 ,则这些位将选择 引脚的其中之一为主控制器选通。 关于流状态传输有如下标准: 接 口 为 异 步; 的作用如同一个从属设备( 引 脚; 数据为被写入 的; 对于字宽数据总线,数据写入速率超过 ,并且主控制器选通为 ;而对于字节宽数据总线,速率为 为了能够与同步接口相匹配,定义用多少个 号还未准备好( 周期来判定向外部主控制器发送的信 定义是哪个应该声明的 信号状态未准备好。 定义 个 引脚中的哪一个将为 来时,它声明未准备好。这些引脚必须与 溢出保护的“未准备好”信号。 信号,当同步检测到一个潜在的溢出到 引脚一致,被选择为用于(宏指令级)端点 该寄存器定义是否主控制器选通(见 读或写。 )在下降沿、上升沿或两个边沿产生数据 该位为 时,数据在主控制器选通的下降沿未被传输;该位为 时,数据在主控制器选通 的下降沿被传输。 该位为 时,数据在主控制器选通的上升沿未被传输;该位为 时,数据在主控制器选通 的上升沿被传输。 为了在主控制器选通的上升和下降沿都传输数据,应设置这两位都为 假设流状态 为总线上的主控制器( ,则主控制器选通将是 引 脚之 一 。当 在 流状 态 时 ,如 果流 逻 辑 (见 )估计在这种方法中主控制 器选通将要触发(见 ,则该寄存器定义它将触发何频率。 更确切地说,该寄存器定义主控制器选通触发频率的半周期,还提供对于该主控制器选通 高度的分辨率。该主控制器选通半周期被定义在半 周 期 期 间 ,因 此 ,如 果 运行 在 ,则将提供 的分辨率。 半 周期 数定 义为 主控 制器选 通半 周期 (如 果为 引脚)。其值必须至少为 这意味着主控制器选通的最小半周期为一个满 周期。 对于 写数据到 上的事务处理,该寄存器决定数据保持的时间有多长。有 效的选择是 或个 周期。该寄存器应用于由 到 写 任 意 数 据,而 无论是否通过流状态。 对于非流状态,保持数仅是由在 中指定数的 的通常(非保持) 意义的延时。 对于在总线上 为主控制器的流状态( ,保持数与主控制器 选通的有效沿有关(在此种情况下为 引 脚 )。 对于在总线上 为从属设备的流状态( ,保 持 数 仅 是 由 在 中反作用于主控制器选通有效沿指定数的 的通常(非保持)意义的 延时(在此种情况下为 引 脚 )。 注意:在这种情况下,保持数与主控制器选通的有效沿没有直接的关联。适应于主控制 器选通包含的任何等待时间来同步主控制器选通,它与数据何时出现有关。 在所有情况中,即使保证 状 态要 求数 据总 线为 三态 ,数 据也 将被 保持 为期 望数 。换 句话说, 输出使能将保持为数据本身同样的数。 周 期; 周 期; 周 期; =保留。 事务处理计数字节 参考 参考 参考 寄存器 更新。 端点 以及 标志选择 描述 事务处理的实时 端点 标志选择值如表 表 端点 所列。 标志选择值 对于作为控制输入的 ,在 一 个 时 刻 只 能 有 一 个 位用于选择哪一个标志变为有效。 端点 停止传输 标志变为有效。 位和 该位为 时 ,当 标 志 由 为 时,事务处理计数已经交付。 的激活来选取时, 传输完成的状态;该位 端点 的 触发 向该寄存器写人 ,初 始 化 写。从该寄存器读操作来初始化 读。 数据高位( 位方式) 采用 波 形 ,对 于 端口 )引脚,包含了数据的读/写。 读/写 数据低位和触发传输 对于 端口 引脚,包含了数据的读/写。读或写低位字节触发 读 数 据 低 位 ,无 事 务 处 理 触 发 事务处理。 这些位包括从/向 处理。 端口 引脚 读/ 写数据 。读 或写 低位字 节不 触发 引脚配置 事务 内部 。作 为 第 个 输 入 功 能,由 固 件 来 替 代 引脚的控制。 同步和异步 信号。该位控制如何将 信号连接到 输入逻辑。 如果内部 用作 的 时 钟,则 信号能够在异步方式进行事务处理,例如, 不参考内部时钟。为了达到同步,设置 ,使得 通过双稳态触发器输入。 如果 信号和 同步,并且服从与该时钟相关的设置和保持次数,那么可以设 置 ,使得 信号通过单稳态触发器输入。 为了使用事务处理计数满限信号作为准备好向波形输入,设置该位为 。设置该位将占 据波形判决点中引脚 。该位的默认值为 引脚状态 引 脚 的 当 前 状 态 ,在 时钟的每一个上升沿采样。 对于闲置状态,写 端点 可以立即退出 事务处理和传输。 端点缓冲区寄存器 缓冲区 数 据 缓 冲 区( 端点 ,为 字节。 缓冲区 数据缓冲区,为 字节。 端点 缓冲区 数 据 缓 冲 区 ,为 端点 字节。 缓冲区 字节 缓冲区。 字节端点 缓冲区 字节 缓冲区。 字节端点 缓冲区 字节 缓冲区。 字节端点 缓冲区 字节 缓冲区。 同步延时寄存器 在某些确定的条件下,对于 寄存器的一些读/写访问必须通过同步延时进行隔离。 该延时仅在如下情形下是必需的: 地址为 的任意寄存器以及在表 所列的寄存器的写操作中; 对表 中寄存器的写操作和地址为 的任意寄存器的读操作中。 表 要求同步延时的寄存器 最小延时长度是 和 时钟 )频 率的函数,可 由如下 公式确定: 在 周期中的最小同步延时 周期 周期 注 意 : 表 示“ 上取整”周期。 当 运行在最低速度( /周)以及运行在最高速度( 时,请求为最小延时。在这种情况下,最小请求延时为 /周) 周期 当 运行 在最 高速( / 周 )以 及 周)时,请求为最大延时。最大请求延时为: 运行在慢速(例如, 周期 最典型的 的配置为 和 时 为: 两者都工作在 ,此时的最小延 周期 在 开发套件中提供的固件框架,其中包含了宏定义,称为 用于执行同步延时。该宏定义在文件 中。 附录 指令集 该附录提供 进制代码兼容。 的汇编语言指令集的描述及技术简介。所有的 指令与标准 二 指令位、标志和状态功能与标准 指令 相同 。然 而 ,它 们在 指令 时序 方面有两点不同,即在时钟周期数和用于每一个指令的指令周期数这两方面都有所不同。 对于 每一个指 令,表 中列出了 指令集和要求的指令周期数 表 定义了表 中用到的符号和助记符。 表 指令集 续表 续表 续表 周期数为用户选择。 表 指令集表中的符号定义 指令时序 在 中,指 令周期为 个时钟周期长度,而在标准 中则是每个指令周期采用 个时钟周期。在标准 中 ,除 了 和 之 外 的 所 有 指 令,只 要 花 个指令周期就 能 完成 。在 中,指 令 须 占 用 个指令周期才能完成。对于软件循环时序计算等,可参 照 表 中 的“ 周 期 ”栏“。字 节 ”栏显 示 每 条指 令 占用 的 字 节数。 默认为 的定时/计数器在每次递增运行 个时钟周期,以便基于定时器的事件与标 准 有同样的时序。定时器也能够被设置为每运行 个时钟周期加 ,从而发挥了 的高速性能。 延展存储器周期(等待状态) 可在小于两个指令周期内执行一条 指令 ,但 有时 也应 当要求 延展 该值 (例 如,存储低速存储器或低速存储映像外设,如 或 等 )。 的“延展存储周期” 特 性 ,能 够 使 得 的固件调整数据存储访问的速度(对程序存储器代码的取得无影响)。 时 钟 控 制 寄 存 器( ,在 的 )的 位 控制延展值,可以被采用的延展 值为 。延展值为 将增加 个指令周期,就会使得 指令执行两个指令周期;而延 展值为 则增加 个指令周期,这将使得 指令执行 个指令周期。延展值可以在程序 的控制下动态改变。 在上电复位时,延展值默认为 个周期的 。对于最快速的数据存储访问, 软件必须明确设置延展值为 。延展值仅影响存储器访问(不影响程序存储器的访问)。 延展值影响读/写选通所有相关时序的宽度。使用较大的延展值将导致读/写选通信号的 宽度,从而允许存储器和外设有更多的时间来响应。 表 列出了延展值为 的数据存储器访问速度。 为时钟控制寄存器 )的 个 设置 的基本时钟参考。这些位可在任何时刻通过 固件程序进行 修改。在上电复位期间, 被设置为“ 表 数据存储 延展值 双数据指针 采用双数据指针来加速数据存储器的块移动。标准 数 据 指 针( )为 位 指针,用于外部数据 或外部设备的寻址。 继承了作为 的标准数据指针,位 于标准 的 和 单 元 ,不 需 要 用 来更改现存的程序代码。 增加 一个第 数据指针( ,位 于 的 )和 )单 元 。 位( 在 的 单元, 选择寄存器 的位 选择该有效指针。当 时 ,使 用 的指令将采用 和 ;当 时 ,使 用 的指令将采 用 和 的其他位不使用。 所有与 相关的指令使用数据指针通过 位来选择。通过触发 位在两个数 据指 针之 间切 换 ,当进 行块移 动时 ,从 提供 保存的 源程 序和 目标 地址 解除 固件程序。因 此,当移动大块数据时,采用双数据指针对提高效率很有意义。 在两个数据指针之间触发 位的最快的方法是用 指令,它在 和 之间触 发 的位 与双数据指针相关的 单 元 有: 低 字 节; 高 字节; 低 字 节; 高 字节; 选 择(位 特殊功能寄存器 下面列出与 操作和程序执行相关的 器都可以位寻址。 :堆栈指针; :程序状态字; :累加器寄存器; : 寄存器。 表 列出了 寄存器各位的功能。 个特殊寄存器。除了堆栈指针 表 寄存 ,这 些寄存 附录 常用词汇英汉注释 :确 认 信 号 :正在使用的设备 :异 步 数 据 :异步自适应速率 :异步抽样转换率 :音 频 设 备 帧传输中的总线动作 :带 宽 :美 国 电 线 标 准 :比特 :带 宽 瓶 颈 :数据填充,以使 :每秒多少比特 可以提取时钟信号 :每秒多少字节 :缓冲区 :批量传送 :总 线 标 号 :字节 :能 力 :特 征 :客 户 配置软件 :控 制 端 口 :控制通道 :控制传送 :计算 机电信组织 默认地址 默认通道 :设 备、器 件 :设 备 地 址 :设 备 端 点 :循 环 冗 余 校 验 :设备资源 :设备软件 :下 行 :驱 动 :双 字 :动态插入及拆除 终端用户 :端 点 :端 点 地 址 :端 点 指 向 帧结束 :端 点 号 :包 结 束 :外 设 端 口 :错误的包结束标志 :帧 帧结构 :全 双 工 :功 能、功 能 部 件 :主 机 :握手包 :主机控制器 :主机资源 :集 线 器 :主 机 控 制 驱 动 : 层 :中 断 请 求 :中 断 传 送 :输出/输入请求包 :同步数据 :同 步 设 备 :同步接收端点 :同 步 源 端 点 :抖 动 :同 步 传 送 :传输速率每秒几千比特 :传输速率每秒几千字节 :有始 无终 的总 线传 输 :电擦写可编程只读存储器 :最 低 比 特 :最 低 字 节 :传输速率每秒几兆比特 :传输速率每秒几兆字节 存储器映像 :消息通道 :微 帧 :最 高 比 特 :最 高 字 节 :不确认 :对象 :非 归 翻转码 :数据包 :数据包缓冲区 :数据包标示位 :传 递 :相、相 位 :锁 相 环 :物理部件 :通道 :查询 :口 、端 口 :电 源 复 位 :协 议 :可编程数据速率 :自适应速率 :请 求、申 请 :取 消、终 止 :根 集 线 器、主 机 :根集线器的下游端口 :取 样、抽 样、采 样 :抽 样 速 率、采 样 速 率 :服 务 :抽 样 转 换 率、采 样 转 换 率 :服 务 间 隙 :服务质量的抖动参数 :指定端口每单位时间的服务数目 :包 开始 :控制传输的某个阶段 :帧 起 始 :流 通 道 :同 步 类 型 :同 步 的 :同 步 的 :超 时 :标 志 包 :事 务 处 理 :传 输 :传 输 类 :系 统 可 编 程 接 口 :时 分 复 用 传输 中包与包 之间的 间隔时间 ,用以 防止传输 冲突 : 驱动器 :上 行 提供的资源 多用接口 :字( :虚 拟 设 备 :冯 诺伊曼 位) 前  言 随着计算机技术的发展,对外围设备的接口技术也提出了更高的要求。由于 接口的 许多显著优点,使得它在计算机外围接口中占据了越来越明显的优势。目前,各种计算机,尤 其是个人电脑及其外围电子设备大量采用标准 接 口 ,标 准 接口已成为必需的接口 之 一 。 接口具有即插即用和热插拔的特性,而且安装和使用都相当方便。但是由于 接口技术涉及的知识面甚广,因此对于一般的工程师和学生来说,要涉足该领域有相当的难 度。为了使得 接口的相关设计变得简单,并进一步推广和普及该项接口技术,各厂商都 推出了自己的不同款式的芯片系列。以提供的整体配套资源来看,应当首推 半导体 公司的 系列芯片;而对于 芯片,当以 )适 应 性 最佳。 芯片除了带有超强的 引擎 外,还集成了改进的增强型 内核改进的增强型 内核采用倍频技术,并采用短周期,使其性能达到标准 的 倍,同时与标准 指令完全兼容。在芯片中,集成了 和 等模块,集成度高。该芯片可代替开发者完成 协议中规定的 的通信工 作,这使得开发者不需要非常深入地了解 底层协议,就可以顺利地开发所需的 外 设。 系列芯片还有一项贡献就是该系列芯片可采用“软”配置,外设未通过 接 口连接到 机之前,外设上的固件程序存储在 机上,一旦外设连接到 机 后 , 机首 先询问该外设,了解设备的描述,然后将固件程序下载到芯片的 中并执行。这一过程叫 做重枚举。这个特性给 接口开发者将带来许多方便,譬如开发者可将 机上修改好的 固件程序下载到芯片中执行,不用反复烧写芯片,从而节省了开发时间。该特性也为设计完成 的外设升级提供了切实可行的途径,厂商可将升级程序包分发给客户,客户就能对设备实现真 正意义的升级。 半导体公司提供了完善的软件开发工具包,固件程序可独立于驱动 程序被下载测试,驱动程序和固件的开发可以相互独立,从而加快了开发进度。除上述特点 外,芯片还具有快速外部数据批量传输、自动 中断向量、双指针等特点。这些特点保证了 芯片的开发过程简单且开发成本低廉,只要开发者具有 单片机的基础和 初步的应用程序编程能力,就可以快速开发 接口。经过近几年的推广和实践, 已成为 接口开发的主流芯片之一。 本书共分 章并有 个 附 录 ,对 的原理、编程、驱动和应用程序等内容进 行了全面介绍。第 章介绍了 基本概念和特性;第 章对 进行了简单介 绍;第 章为 芯片的基本原理部分,介绍了枚举和重枚举、中断、存储器、 、复位和电源管理、输入和输出、定时/计数器和串行接口、端点缓冲区存取、从属 和 ( 通 用 可 编 程 接 口 )等 内 容;第 章和第 章分别对硬件和软件开发工具进行了介绍; 第 章讨论固件框架和函数库;第 章对设备驱动及应用程序的编制方法进行了详细叙述; 第 章列举了若干范例,达到进一步总结和提高的目的。为了方便读者在实际使用中参考查 阅,本书还配置了 个附录,内容分别是:封装和引脚功能、寄存器、指令集和常用词汇英汉 注释。 本书由上海交通大学博士后钱峰编写,承蒙上海交通大学电子信息与电气工程学院金志 华教授和田蔚风教授的鼓励和指导,并得到了第二炮兵工程学院 教研室的支持和 半导体公司应用工程师刘辉先生的鼎立协助,以及上海思越电子科技公司工程技术人员的大 力支持,在此表示衷心的感谢。此外,也感谢李洁琳、叶枫在前期资料整理中所做的工作。同 时,更感谢家人给予的鼓励和理解。 希望本书能给广大读者带来一定的帮助,但由于编者水平有限,加之时间仓促,谬误在所 难免,敬请学者、专家和广大读者批评指正。 编者 年月

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。