STM32 USB 手册片段

发布于:2025-07-05 ⋅ 阅读:(14) ⋅ 点赞:(0)

STM32 USB 手册片段


USB 主要特性

  • 符合 USB 2.0 全速规范
    兼容 USB 2.0 规范中的全速(Full-Speed)标准,即 12 Mbps 传输速率。

  • 可配置的端点数量:1 到 8 个
    支持根据应用需求配置 1 到 8 个 USB 端点(Endpoint 是 USB 中用于数据传输的逻辑通道)。

  • 支持 CRC 校验、NRZI 编码/解码和位填充
    包括:

    • CRC(循环冗余校验) 用于数据完整性检查。
    • NRZI(非归零反向)编码/解码 是一种数据编码方式,USB 中用于数据传输。
    • 位填充(Bit-stuffing) 是为了保证数据传输同步性而在特定数据中插入额外位。
  • 支持等时传输(Isochronous Transfers)
    等时传输用于对延迟敏感的实时数据(如音频或视频),提供定时保障但不保证重传。

  • 支持双缓冲的批量/等时端点
    提高数据吞吐量的一种机制,允许数据在一个缓冲区处理时,另一个缓冲区进行接收/发送。

  • 支持 USB 挂起/恢复操作
    符合 USB 的省电模式,可进入挂起状态并在需要时唤醒恢复。

  • 生成帧锁定的时钟脉冲
    可用于同步 USB 帧的时钟信号生成,满足数据时序要求。


低、中、高和 XL 密度 的设备中,USB 和 CAN 总线共享一个 512 字节的专用 SRAM,用于数据的收发。因此:

  • USB 和 CAN 不能同时使用,因为它们独占访问这块共享 RAM。
  • 可以在同一个应用中使用 USB 和 CAN,但不能同时启用它们,需要轮流使用。

USB 功能描述

USB 外设提供一个符合 USB 标准的连接,用于在 主机 PC微控制器实现的功能模块 之间进行通信。
数据在主机 PC 与系统内存之间传输,是通过由 USB 外设直接访问专用数据包缓冲区 实现的。

  • 这个专用缓冲区的大小必须根据 所使用的端点数量最大数据包大小 来配置。

  • 缓冲区固定大小为 512 字节,最多支持:

    • 16 个单向端点(如:只接收或只发送)
    • 8 个双向端点(既接收又发送)

USB 外设与 USB 主机进行通信,包括:

  • 检测 令牌包(Token Packets)
  • 处理 数据的发送与接收
  • 根据 USB 标准处理 握手包(Handshake Packets)

硬件会自动完成事务格式化工作,包括:

  • CRC 校验码的生成与验证(用于确保数据完整性)

每个端点都有一个 缓冲描述块(Buffer Descriptor Block),用于指定:

  • 该端点相关内存的起始位置
  • 缓冲区的大小
  • 或者需要传输的字节数

当 USB 外设识别到一个有效的 功能/端点对的 Token 时,若该端点已被配置并允许传输,则:

  • 相关的数据传输就会自动开始
  • 数据会首先被加载到一个内部的 16 位寄存器
  • 然后访问专用缓冲区内存进行读写操作

当所有数据传输完成后(如果需要):

  • 将根据传输方向发送或接收一个合适的 握手包(如 ACK、NAK 等)

事务结束后:

  • 会生成一个 端点特定的中断
  • 微控制器通过读取 状态寄存器 或调用 不同的中断响应函数 来处理

微控制器可以识别:

  • 哪个端点需要服务

  • 发生了什么类型的事务,以及是否出现错误,例如:

    • 位填充错误(bit stuffing)
    • 数据格式错误
    • CRC 校验失败
    • 协议错误
    • 缺少 ACK
    • 数据溢出或欠载(overrun/underrun)

特别支持:

  • 等时传输(Isochronous)
  • 高吞吐量的批量传输(Bulk)

通过实现 双缓冲机制,允许:

  • USB 外设使用一个缓冲区的同时
  • 微控制器访问另一个缓冲区
    从而确保高效率和无间断的数据传输。

USB 模块可进入 低功耗模式(SUSPEND 模式),方法是写入控制寄存器。

此时:

  • 所有静态功耗都会停止
  • USB 时钟可降低频率或完全停止

USB 引脚检测到活动信号 时(如主机发起通信):

  • 可实现 异步唤醒

  • 特别的中断源还可连接到唤醒引脚,用于:

    • 立即恢复时钟
    • 或直接支持时钟启动/停止机制

USB 模块功能块描述

USB 外设实现了所有与 USB 接口相关的功能,包括以下功能模块:


🔹 串行接口引擎(SIE,Serial Interface Engine)

SIE 模块的功能包括:

  • 识别同步模式(如同步头 SYNC)
  • 位填充(Bit-stuffing)处理
  • CRC 的生成与校验
  • PID(Packet Identifier)的验证与生成
  • 握手(Handshake)评估与处理

此模块需要与 **USB 收发器(Transceiver)**连接,并使用由数据包缓冲区接口提供的虚拟缓冲区进行本地数据存储。

此外,SIE 还会根据 USB 外设事件(如帧开始 SOF、USB 复位、数据错误等)以及与端点相关的事件(如传输结束或正确接收数据包)生成中断信号。


🔹 定时器(Timer)
  • 生成与 帧开始(Start of Frame)同步 的时钟脉冲。
  • 检测来自主机的 全局挂起(Suspend) 状态,当 3 毫秒内无通信活动时视为挂起。

🔹 数据包缓冲区接口(Packet Buffer Interface)

这个模块负责管理本地内存缓冲区,实现灵活的数据收发:

  • 根据 SIE 的请求自动选择合适的缓冲区
  • 使用端点寄存器中提供的内存地址定位缓冲区位置
  • 每交换一个字(16 位)自动增加地址,并追踪已交换的字节数
  • 防止缓冲区溢出

🔹 端点相关寄存器(Endpoint-Related Registers)

每个端点都有对应的寄存器,用于定义:

  • 端点类型(控制、中断、批量、等时)
  • 当前端点的状态

说明:

  • 对于单向/单缓冲端点,一个寄存器可以实现两个独立端点

  • 一共提供 8 个寄存器,支持:

    • 最多 16 个单向/单缓冲端点
    • 最多 7 个双缓冲端点(取决于组合)

**举例:**可以配置为 4 个双缓冲端点 + 8 个单缓冲端点。


🔹 控制寄存器(Control Registers)

这些寄存器用于:

  • 显示整个 USB 外设的状态
  • 触发特定 USB 事件(如 Resume 恢复、Power-Down 掉电)

🔹 中断寄存器(Interrupt Registers)
  • 包含中断屏蔽设置(Interrupt Mask)
  • 记录中断事件
  • 可用于查询中断原因、状态或清除中断标志

与 APB1 总线的连接模块

USB 外设通过 APB1 总线接口 与系统连接,该接口包含以下模块:


🔹 数据包内存(Packet Memory)
  • 实际存储数据包的本地内存
  • 可供数据包缓冲区接口和应用程序软件直接访问
  • 大小为 512 字节,即 256 个 16 位字

🔹 仲裁器(Arbiter)
  • 接收来自 APB1 总线USB 接口 的内存访问请求
  • 优先响应 APB1 请求,但始终保留一半带宽用于 USB 数据传输
  • 实现了 时间复用的双端口 SRAM 结构,允许在 USB 事务执行期间访问内存
  • 支持任意长度的 APB1 多字(multiword)访问

🔹 寄存器映射器(Register Mapper)
  • 将 USB 外设的字节宽、位宽寄存器组织成结构化的 16 位寄存器集,通过 APB1 地址访问

🔹 APB1 包装器(APB1 Wrapper)
  • 为内存和寄存器提供 APB1 接口
  • 将整个 USB 外设映射到 APB1 地址空间中

🔹 中断映射器(Interrupt Mapper)

配置 USB 事件中断到 NVIC(嵌套向量中断控制器)上的三个中断通道:

  1. USB 低优先级中断(通道 20)

    • 所有 USB 事件(如正确传输、USB 复位等)都会触发
    • 需要固件进一步检查具体中断源
  2. USB 高优先级中断(通道 19)

    • 仅由等时传输双缓冲批量传输中的正确传输事件触发
    • 以实现尽可能高的传输速率
  3. USB 唤醒中断(通道 42)

    • 在 USB 挂起模式下被唤醒时触发
    • 可用于恢复系统时钟或支持直接唤醒

以下是你提供内容的中文翻译:


编程注意事项

在以下章节中,将描述 USB 外设与应用程序之间的预期交互方式,以便简化应用软件的开发过程。


这段话是这一章节的引言,接下来的内容通常会包含:

  • 如何初始化 USB 外设
  • 如何配置端点(Endpoint)
  • 如何处理 USB 中断
  • 数据的发送与接收逻辑
  • 挂起/恢复操作的管理
  • 与主机握手流程(如 SETUP 包处理)

以下是你提供内容的翻译及解释:


通用 USB 设备编程

本部分描述了应用软件需要执行的主要任务,以实现 符合 USB 标准 的设备行为。

在这里考虑了与最常见 USB 事件相关的操作,同时也特别讨论了:

  • 双缓冲端点(Double-buffered Endpoints)
  • 等时传输(Isochronous Transfers) 这两种特殊情况的处理。

除了系统复位(System Reset)以外,所有的操作都是由 USB 外设启动,由下述某个 USB 事件驱动。


🧠 简要理解:
这段内容是在告诉开发者:

  • USB 通信流程大多数是“由主机发起 → 外设响应”的机制
  • 应用程序的任务是:根据 USB 外设触发的事件(如 SETUP、OUT、IN、SUSPEND 等),及时做出正确处理
  • 系统初始化之外,开发者不需要主动轮询 USB 状态,而是等 USB 外设通过中断或标志通知

以下是你这段内容的完整翻译及简要解释:


系统与上电复位

在系统复位或上电复位后,应用程序软件的第一步操作是:

  1. 为 USB 外设提供所需的所有时钟信号
  2. 释放其复位信号,以便能够访问其寄存器。

整个初始化过程如下所述:

步骤 1:使能时钟与宏单元(macrocell)复位释放

应用软件需要通过设备的时钟管理逻辑,使用相关控制位:

  • 使能 USB 寄存器宏单元的时钟
  • 释放 USB 模块专用的复位信号

步骤 2:打开模拟部分(USB 收发器)

需要使用 CNTR 寄存器中的 PDWN 位 来开启 USB 模拟部分(即 USB 收发器电路):

  • 这个位用于开启内部电压基准,供 USB 端口使用
  • 这个电路有一个启动时间(tSTARTUP,在数据手册中指定),在此期间 USB 行为是不确定的

因此:在设置 PDWN 位后,必须等待 tSTARTUP 时间,然后再清除 CNTR 寄存器中的 FRES 位(即释放 USB 模块复位)

步骤 3:清除中断状态

清除 ISTR 寄存器中所有中断标志,以避免伪中断影响后续操作。


USB 外设复位(RESET 中断)

当接收到 USB Reset 事件时,USB 外设会恢复到系统复位之后的初始状态:

  • 所有端点通信都被禁用
  • 外设不响应任何 USB 数据包

应对方式:

  • 启用 USB 功能(Function Enable),地址默认为 0(USB_DADDR 寄存器中设置 EF 位)
  • 初始化控制端点(EP0,地址为 0):配置 EP0R 寄存器 和 对应数据包缓冲区

在后续 USB 枚举过程中,主机会给设备分配一个唯一地址,该地址需要写入 USB_DADDR 寄存器的 ADD[6:0] 位中,并配置其他端点。

⚠️ 注意:接收到 RESET 中断后,应用程序必须 在 10 毫秒内 启用默认端点(EP0)!


数据包缓冲区的结构与使用

每个双向端点都可能:

  • 从主机接收数据(RX)
  • 向主机发送数据(TX)

缓冲区管理机制:

  • 每个端点有两个专属内存缓冲区:一个用于接收、一个用于发送

  • 这些缓冲区由 Packet Buffer Interface(数据包缓冲接口) 控制访问

  • 若微控制器和 USB 外设同时访问缓冲区,仲裁逻辑 会进行协调:

    • 使用 APB1 总线的半个周期给 MCU,另半个周期给 USB 外设
    • 构造出类似 “双端口 SRAM” 的效果,避免冲突

时钟要求:

  • USB 外设使用固定 48 MHz 时钟

  • USB 接口与 APB1 的时钟频率可以不同,但:

    APB1 时钟必须 > 8 MHz,否则可能会导致数据溢出/欠载问题


缓冲区描述表(Buffer Description Table)

  • 每个端点都在缓冲区描述表中有对应的条目,指定其 TX/RX 缓冲区位置和大小
  • 描述表位置由 USB_BTABLE 寄存器指定
  • 每个条目占 4 个 16 位字(8 字节),所以表地址必须 8 字节对齐USB_BTABLE 寄存器低 3 位始终为 “000”)

特殊情况:

  • 单向端点且非等时/双缓冲,只需要一个缓冲区
  • 未用端点的描述表空间可由用户自由使用
  • 等时传输(Isochronous)双缓冲批量传输(Double-buffered Bulk) 需要特殊处理(详见手册第 23.4.3 与 23.4.4 节)

✅ 总结:初始化流程重点

步骤 动作
1 启用 USB 时钟、释放复位
2 设置 PDWN,等待启动时间
3 清除 FRES,清空中断标志
4 初始化默认端点、设置地址
5 配置缓冲描述表

以下是你提供的STM32 USB数据手册段落的中文翻译,为方便阅读,按逻辑分段整理:


📦 每个数据包缓冲区的使用

每个数据包缓冲区在接收或发送过程中,从起始地址(底部)开始使用。
USB 外设
绝不会修改
邻近于分配缓冲区的内存区域。

  • 如果接收到的数据包大于已分配的缓冲区长度

    • 会检测到缓冲区溢出
    • 不会继续写入溢出区域。

当传输被启用(发送或接收),以下寄存器不得由软件修改

  • USB_EPnR
  • ADDRn_TX / ADDRn_RX
  • COUNTn_TX / COUNTn_RX

因为硬件可能在传输期间实时更改它们的值。

一旦传输完成(通过 CTR 中断事件通知),这些寄存器才可以再次访问,以开启新的传输。


📤 IN 数据包(数据发送)

当主机发送一个 IN token 时:

  1. 若地址匹配某个配置并有效的端点:

    • USB 外设读取对应端点缓冲描述符表中的 ADDRn_TXCOUNTn_TX
    • 将这些值存入内部的 16 位寄存器 ADDRCOUNT(软件不可访问)。
    • 读取第一个待发送的字(word),根据 DTOG_TX 发送 DATA0DATA1 的 PID。
    • 第一个字节进入输出移位寄存器,经 USB 总线发送。
    • 所有字节发送完后,发送 CRC。
    • 若该端点无效,根据 STAT_TX 位发送 NAKSTALL 而非数据包。
  2. 传输细节:

    • ADDR 寄存器指向当前缓冲位置。
    • COUNT 表示剩余待传输字节数。
    • 每个 word 从 LSB 开始发送。
    • 若字节数为奇数,最后一个 word 的高位字节被忽略。
  3. 当主机返回 ACK

    • DTOG_TX 翻转。

    • STAT_TX 设置为 10 (NAK),端点无效。

    • CTR_TX 位被置位。

    • 软件应:

      • 读取 USB_ISTREP_IDDIR 判断是哪一个端点中断。
      • 清除 CTR_TX 位。
      • 准备下一个缓冲区的数据。
      • 写入 COUNTn_TX
      • STAT_TX 设置为 11 (VALID) 重新启用端点。

⚠️ 若 STAT_TX = 10 (NAK),则所有 IN 请求都被 NAK,应按顺序完成上述操作,否则可能错过主机立即跟随的第二个 IN 请求。


📥 OUT 与 SETUP 数据包(数据接收)

OUT 和 SETUP token 的处理方式基本一致。

  1. 接收到 OUT/SETUP:

    • 若地址匹配有效端点:

      • USB 外设读取 ADDRn_RXCOUNTn_RX

      • ADDRn_RX 保存至内部 ADDR 寄存器。

      • COUNT 被重置。

      • COUNTn_RX 中读取 BL_SIZENUM_BLOCK,初始化 BUF_COUNT(内部 16 位计数器,用于检测溢出)。

      • 接收的字节按字打包(第一个字节为 LSB)写入缓冲区。

      • 每写入一个字节:

        • BUF_COUNT 递减;
        • COUNT 递增。
  2. 接收完成:

    • 校验 CRC;

    • 若无错误,发送 ACK。

    • 若 CRC 错误或其他错误(位填充、帧错误等):

      • 错误之前的字节仍会写入缓冲区;
      • 不发送 ACK;
      • 设置 USB_ISTR.ERR
      • 一般不需要软件干预,USB 外设会自动恢复。
  3. 若端点无效:

    • 发送 NAKSTALL
    • 不写入任何数据。
  4. 数据存储:

    • ADDRn_RX 开始写入;
    • 总长度为数据包实际字节数(含 CRC),或分配的缓冲区长度(由 BL_SIZENUM_BLOCK 决定),取小值
    • 永远不会写出分配缓冲区外。
  5. 若数据长度超出缓冲区:

    • 检测到缓冲区溢出
    • 发送 STALL
    • 不触发中断;
    • 传输被视为失败。
  6. 正常完成时:

    • 内部 COUNT 复制回 COUNTn_RX,但保留 BL_SIZENUM_BLOCK

    • USB_EPnR 更新如下:

      • DTOG_RX 翻转;
      • STAT_RX = 10 (NAK)
      • CTR_RX 置位。

软件响应:

  • 检查 USB_ISTR 中的 EP_IDDIR
  • 根据 USB_EPnRSETUP 位判断是否为 SETUP 包;
  • 清除 CTR_RX
  • 读取 COUNTn_RX 获得数据长度;
  • 处理接收到的数据;
  • 设置 STAT_RX = 11 (VALID) 允许下一次接收。

⚠️ 若 STAT_RX = 10 (NAK),主机会重试该 OUT 请求。上述流程必须严格按顺序执行,避免漏掉紧接的 OUT 请求通知。


🔁 控制传输

控制传输由以下三个阶段组成:

  1. SETUP 阶段(始终为 OUT);
  2. 数据阶段(可选,方向相同);
  3. 状态阶段(零字节,方向相反)。

SETUP 阶段处理:

  • 仅控制端点处理;

  • 类似 OUT,但设置:

    • DTOG_TX = 1
    • DTOG_RX = 0
    • STAT_TX = STAT_RX = 10 (NAK)
  • 软件据 SETUP 内容决定后续方向(IN 或 OUT);

  • 每次 CTR_RX 时需检查 SETUP 位,以区分 SETUP 与普通 OUT;

  • 若出错,必须 STALL 整个传输;

  • 在数据阶段:

    • 另一方向应设置为 STALL,防止主机方向错误;
  • 启用最后一个数据阶段时,需将相反方向设置为 NAK,确保状态阶段不会提前执行;

    • 控制操作成功则改为 VALID,否则 STALL

状态阶段:

  • 若为 OUT 状态阶段,需设置 EP_KIND.STATUS_OUT

  • 若主机发送非 0 数据,会触发错误;

  • 处理完状态阶段:

    • 清除 STATUS_OUT
    • STAT_RX = VALID
    • STAT_TX = NAK
    • 准备下一次命令。

SETUP 丢包保护:

  • USB 规范规定 SETUP 必须回复 ACK,不能 NAK 或 STALL;

  • STAT_RX = NAK/STALL 且收到 SETUP:

    • USB 会接受该数据包并发送 ACK;
  • 但如果 CTR_RX 未处理完(即上一事务未清除):

    • 丢弃新 SETUP;
    • 不发送握手;
    • 模拟接收错误,强制主机重发。

双缓冲端点

USB标准定义的各种端点类型代表了不同的数据传输模型,描述了不同类型数据传输操作的典型需求。当需要在主机PC与USB功能之间传输大量数据时,块传输(bulk)端点是最适合的模型。这是因为主机会调度块传输事务以填满帧中所有可用带宽,从而最大化实际传输速率,前提是USB设备能够及时处理针对它的块传输事务。

如果USB设备仍在处理上一事务时,下一事务到达,它将以NAK握手回应,主机PC会重复发起相同事务,直到设备准备好处理。这会因重传占用带宽而降低实际传输速率。为此,块端点可使用专门的**“双缓冲”**功能。

启用双缓冲时,会通过数据切换序列(data toggle sequencing)来选择USB外设使用哪个缓冲区进行数据传输。它利用传输(transmission)和接收(reception)两种数据包内存区域,在每次事务成功时切换缓冲区,从而始终保持一个完整缓冲区供应用程序使用,另一缓冲区由USB外设填充。

例如,在面向“接收”双缓冲块端点的OUT事务中,当一个缓冲区正被USB主机写入新数据时,另一个缓冲区可供微控制器软件使用;对于“传输”双缓冲块端点的IN事务,也同理。

由于交换缓冲区管理需要使用全部四个缓冲区描述表位置(存放地址指针和缓冲区大小),用于实现双缓冲块端点的USB_EPnR寄存器被限制为单向使用。因此,仅需设置一个STAT位对为非“00(禁用)”的状态:

  • 当启用接收的双缓冲块端点时,设置STAT_RX
  • 当启用传输的双缓冲块端点时,设置STAT_TX

如果需要同时启用收发双缓冲块端点,则必须使用两个USB_EPnR寄存器。

为了充分利用双缓冲并达到最高传输速率,端点流控结构(前面章节描述过)需要修改,使端点仅在USB外设与应用软件缓冲区冲突时才切换至NAK,而不是在每次事务结束时。

当前被USB外设使用的缓冲区由与端点方向相关的DTOG位定义:

  • 对于接收双缓冲块端点,是USB_EPnR寄存器的DTOG_RX(位14)
  • 对于传输双缓冲块端点,是DTOG_TX(位6)

为了实现新流控机制,USB外设需要知道应用程序当前使用的是哪个缓冲区,以检测冲突。USB_EPnR寄存器有两个DTOG位,但由于双缓冲的单向约束,USB外设只使用其中一个进行数据和缓冲区切换,另一个可供应用软件用来标示其当前使用的缓冲区。这个新的缓冲区标志称为 SW_BUF

下表说明了USB_EPnR寄存器位与DTOG/SW_BUF的对应关系(分别针对“传输”和“接收”双缓冲块端点):

缓冲区标志 传输端点 接收端点
DTOG DTOG_TX (bit 6) DTOG_RX (bit 14)
SW_BUF bit 14 bit 6

当前被USB外设使用的缓冲区由DTOG标志定义,当前被应用软件使用的缓冲区由SW_BUF标志定义。两者标志值与对应缓冲区的关系如下:

端点类型 DTOG SW_BUF USB外设使用的缓冲区地址 应用程序使用的缓冲区地址
传输 01 01 ADDRn_TX_0 / COUNTn_TX_0 ADDRn_TX_1 / COUNTn_TX_1
传输 10 10 ADDRn_TX_1 / COUNTn_TX_1 ADDRn_TX_0 / COUNTn_TX_0
传输 00 00 无(注1) ADDRn_TX_0 / COUNTn_TX_0
传输 11 11 无(注1) ADDRn_TX_0 / COUNTn_TX_0
接收 01 01 ADDRn_RX_0 / COUNTn_RX_0 ADDRn_RX_1 / COUNTn_RX_1
接收 10 10 ADDRn_RX_1 / COUNTn_RX_1 ADDRn_RX_0 / COUNTn_RX_0
接收 00 00 无(注1) ADDRn_RX_0 / COUNTn_RX_0
接收 11 11 无(注1) ADDRn_RX_1 / COUNTn_RX_1

注1:端点处于NAK状态。

双缓冲块端点功能通过如下操作激活:

  • 将USB_EPnR寄存器中的EP_TYPE位字段写为00,定义为块端点;
  • 同一寄存器中将EP_KIND位设置为1,启用双缓冲(DBL_BUF)。

应用软件负责根据首个使用缓冲区,初始化DTOG和SW_BUF位,需注意这两个位的特殊仅切换属性。设置DBL_BUF后,首次事务结束将触发双缓冲端点的特殊流控,该流控在DBL_BUF保持有效期间对所有事务生效。

每次事务结束时,相关方向的CTR_RX或CTR_TX位在USB_EPnR寄存器被置位,同时相关的DTOG位由硬件自动切换,使USB外设缓冲区交换完全独立于软件。与普通事务不同,STAT位对不受事务结束影响,保持11(有效)。

当新事务的token包接收时,如果USB外设和应用软件使用的缓冲区相同(DTOG和SW_BUF相等),端点状态会被屏蔽为10(NAK),表明缓冲区冲突。应用软件通过响应CTR事件,清除中断标志并处理完成的事务。处理结束后,软件切换SW_BUF位(写1),通知USB外设缓冲区可用。

这样,NAK事务的数量仅受应用处理事务数据时间限制:若处理时间短于USB事务完成时间,则无重传,实际传输速率只受主机PC限制。

应用软件也可以随时覆盖双缓冲特殊流控,通过向USB_EPnR寄存器的STAT位对写入非11值强制端点状态,USB外设将始终使用编程的端点状态,而不考虑缓冲区使用情况。


当然!这是这段关于双缓冲块端点的简短摘要和关键点提炼:


双缓冲块端点简短摘要

  • 块传输端点适合大量数据传输,但当设备忙时会返回NAK导致重传,降低效率。
  • 双缓冲功能允许设备同时使用两个缓冲区,一个缓冲数据传输,另一个供应用处理,从而避免频繁NAK。
  • 通过数据切换位(DTOG)和应用标识位(SW_BUF)管理缓冲区使用状态,保证缓冲区切换自动且高效。
  • 端点状态只有在USB外设和应用软件缓冲区冲突时才切换为NAK,减少不必要的重传。
  • 启用双缓冲需要设置端点类型为块传输且打开双缓冲标志。
  • 软件负责初始化和管理DTOG与SW_BUF位,通知USB外设缓冲区状态。
  • 应用软件可强制覆盖端点状态,灵活控制流量。

关键点

  • 双缓冲避免缓冲区等待,提升USB传输效率。
  • USB_EPnR寄存器管理缓冲区和状态位,单向使用限制。
  • DTOG标志表示USB外设使用的缓冲区,SW_BUF表示应用使用的缓冲区。
  • 只有缓冲区冲突时才发送NAK,减少重传次数。
  • 应用软件需配合管理缓冲区状态,实现高效数据处理。

好的,以下是你提供内容的翻译和简短总结:


同步传输(Isochronous transfers)

USB标准支持需要固定且准确数据生产/消费频率的全速外设,这类流量称为“同步传输”(Isochronous)。典型例子有:音频采样、压缩视频流,以及所有对传输频率准确性有严格要求的采样数据。

当端点在枚举阶段被定义为同步类型时,主机会为该端点分配帧内所需的带宽,并且每帧会发送恰好一个IN或OUT数据包,取决于端点方向。为限制带宽需求,同步传输不支持失败事务的重传,因此同步事务没有握手机制,数据包后不期待也不发送ACK包。同时,同步传输不支持数据切换(data toggle),所有数据包都从DATA0 PID开始。

同步端点通过设置USB_EPnR寄存器中的EP_TYPE位为‘10’来选择;由于无握手阶段,STAT_RX/STAT_TX位对只能是‘00(禁用)’或‘11(有效)’,其他值不符合USB标准。

同步端点也使用双缓冲技术,利用“发送”和“接收”两个数据包内存区域管理缓冲区切换,以确保应用总有完整缓冲区可用,而USB外设填充另一个缓冲区。

当前被USB外设使用的内存缓冲区由端点方向相关的DTOG位确定(DTOG_RX或DTOG_TX,均在对应USB_EPnR寄存器中),具体对应关系见表171。

同步端点USB_EPnR寄存器被强制单向使用,若需同时启用接收和发送同步端点,需使用两个USB_EPnR寄存器。

应用软件负责初始化DTOG位,设置第一个使用的缓冲区。每次事务结束时,所对应端点USB_EPnR寄存器的CTR_RX或CTR_TX位被置位,且相关DTOG位由硬件切换,完成缓冲区交换,无需软件干预。

STAT位对不受事务完成影响,端点始终保持‘11(有效)’状态。尽管同步OUT传输中发生的CRC错误或缓冲区溢出被视为正常事务,并会触发CTR_RX事件,但CRC错误会设置USB_ISTR寄存器的ERR位,通知软件数据可能已损坏。


简短总结

  • 同步传输适用于对传输频率要求严格的音视频等实时数据。
  • 主机为同步端点分配固定带宽,每帧传输一个数据包,不支持重传和握手。
  • 不使用数据切换,数据包固定用DATA0 PID。
  • 同步端点使用双缓冲,应用和USB外设交替使用两个缓冲区。
  • DTOG位硬件自动切换缓冲区,STAT位保持有效状态。
  • CRC错误或缓冲溢出被当作正常事务,但会通知软件数据可能损坏。
  • 端点寄存器USB_EPnR为单向使用,接收和发送端点需分别使用寄存器。

当然!这里是Suspend/Resume事件的翻译和简短提炼:


Suspend/Resume事件翻译

USB标准定义了一种特殊的外设状态,称为挂起(SUSPEND),此状态下设备从USB总线吸取的平均电流不得超过2.5mA。这个要求对总线供电设备非常重要,而自供电设备则不受此限制。

挂起模式时,主机通知设备在超过3毫秒内不要在USB总线上发送任何数据。正常情况下,每毫秒会发送一个SOF包,USB设备通过检测连续缺少3个SOF包来识别挂起请求,并在USB_ISTR寄存器中将SUSP位设为1,触发中断(如果使能)。

设备进入挂起后,可通过**恢复(RESUME)**序列恢复正常操作。恢复序列可由主机或设备自身启动,但总由主机终止。设备在挂起状态下也必须能检测并响应USB复位(RESET)事件。

挂起具体操作依设备而异,通常涉及降低功耗,比如:

  1. 设置USB_CNTR寄存器的FSUSP位为1,激活USB挂起模式,关闭SOF包接收检测,避免重复挂起中断。
  2. 减少非USB模块的静态功耗。
  3. 设置USB_CNTR寄存器的LP_MODE位为1,关闭模拟USB收发器的静态功耗,同时保持其能检测恢复信号。
  4. 可选择关闭外部振荡器和PLL。

当设备挂起时出现USB事件,必须启动恢复过程恢复系统时钟和USB功能,且恢复过程必须在10毫秒内完成(若为USB复位事件)。

恢复开始或复位序列会异步清除LP_MODE位。虽然这会触发WKUP中断,但因系统时钟重启延迟较长,建议恢复过程紧跟挂起过程后立即执行以缩短响应时间。为防止误触发恢复,挂起时会启用一个约70纳秒的模拟滤波器。

恢复过程应包括:

  1. 可选地打开外部振荡器和PLL。
  2. 清除USB_CNTR寄存器的FSUSP位。
  3. 根据USB_FNR寄存器中RXDP和RXDM位的状态识别恢复事件类型(见下表)。
[RXDP, RXDM] 唤醒事件 软件动作
00 根复位
10 无(噪声) 返回挂起模式
01 根恢复
11 不允许(噪声) 返回挂起模式

设备也可以在非USB事件(如鼠标移动)时发起恢复,方法是设置USB_CNTR寄存器的RESUME位为1,持续1-15毫秒后清零,恢复序列由主机完成。

注意:必须先置FSUSP位为1(挂起模式),再使用RESUME位启动恢复。


简短提炼

  • **挂起(SUSPEND)**模式:设备限制功耗(≤2.5mA),由连续3个SOF包缺失检测启动。
  • 挂起时减少功耗,关闭部分硬件模块,保持USB收发器能检测恢复信号。
  • **恢复(RESUME)**可由主机或设备启动,但由主机终止。
  • 恢复过程必须<10ms完成,需重新开启时钟和PLL,清除挂起标志。
  • 通过USB_FNR寄存器RXDP/RXDM位识别恢复事件类型,处理噪声避免误唤醒。
  • 设备也可通过软件控制RESUME位主动唤醒,适用于非USB唤醒事件。
  • 必须先进入挂起(FSUSP=1)状态,才能启动恢复(RESUME=1)。