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(嵌套向量中断控制器)上的三个中断通道:
USB 低优先级中断(通道 20)
- 所有 USB 事件(如正确传输、USB 复位等)都会触发
- 需要固件进一步检查具体中断源
USB 高优先级中断(通道 19)
- 仅由等时传输或双缓冲批量传输中的正确传输事件触发
- 以实现尽可能高的传输速率
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 外设通过中断或标志通知
以下是你这段内容的完整翻译及简要解释:
系统与上电复位
在系统复位或上电复位后,应用程序软件的第一步操作是:
- 为 USB 外设提供所需的所有时钟信号
- 释放其复位信号,以便能够访问其寄存器。
整个初始化过程如下所述:
步骤 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 时:
若地址匹配某个配置并有效的端点:
- USB 外设读取对应端点缓冲描述符表中的
ADDRn_TX
和COUNTn_TX
。 - 将这些值存入内部的 16 位寄存器
ADDR
和COUNT
(软件不可访问)。 - 读取第一个待发送的字(word),根据
DTOG_TX
发送DATA0
或DATA1
的 PID。 - 第一个字节进入输出移位寄存器,经 USB 总线发送。
- 所有字节发送完后,发送 CRC。
- 若该端点无效,根据
STAT_TX
位发送NAK
或STALL
而非数据包。
- USB 外设读取对应端点缓冲描述符表中的
传输细节:
ADDR
寄存器指向当前缓冲位置。COUNT
表示剩余待传输字节数。- 每个 word 从 LSB 开始发送。
- 若字节数为奇数,最后一个 word 的高位字节被忽略。
当主机返回
ACK
:DTOG_TX
翻转。STAT_TX
设置为10 (NAK)
,端点无效。CTR_TX
位被置位。软件应:
- 读取
USB_ISTR
的EP_ID
和DIR
判断是哪一个端点中断。 - 清除
CTR_TX
位。 - 准备下一个缓冲区的数据。
- 写入
COUNTn_TX
。 - 将
STAT_TX
设置为11 (VALID)
重新启用端点。
- 读取
⚠️ 若 STAT_TX = 10 (NAK)
,则所有 IN 请求都被 NAK,应按顺序完成上述操作,否则可能错过主机立即跟随的第二个 IN
请求。
📥 OUT 与 SETUP 数据包(数据接收)
OUT 和 SETUP token 的处理方式基本一致。
接收到 OUT/SETUP:
若地址匹配有效端点:
USB 外设读取
ADDRn_RX
和COUNTn_RX
。将
ADDRn_RX
保存至内部ADDR
寄存器。COUNT
被重置。从
COUNTn_RX
中读取BL_SIZE
和NUM_BLOCK
,初始化BUF_COUNT
(内部 16 位计数器,用于检测溢出)。接收的字节按字打包(第一个字节为 LSB)写入缓冲区。
每写入一个字节:
BUF_COUNT
递减;COUNT
递增。
接收完成:
校验 CRC;
若无错误,发送 ACK。
若 CRC 错误或其他错误(位填充、帧错误等):
- 错误之前的字节仍会写入缓冲区;
- 不发送 ACK;
- 设置
USB_ISTR.ERR
; - 一般不需要软件干预,USB 外设会自动恢复。
若端点无效:
- 发送
NAK
或STALL
; - 不写入任何数据。
- 发送
数据存储:
- 从
ADDRn_RX
开始写入; - 总长度为数据包实际字节数(含 CRC),或分配的缓冲区长度(由
BL_SIZE
和NUM_BLOCK
决定),取小值; - 永远不会写出分配缓冲区外。
- 从
若数据长度超出缓冲区:
- 检测到缓冲区溢出;
- 发送
STALL
; - 不触发中断;
- 传输被视为失败。
正常完成时:
内部
COUNT
复制回COUNTn_RX
,但保留BL_SIZE
和NUM_BLOCK
;USB_EPnR
更新如下:DTOG_RX
翻转;STAT_RX = 10 (NAK)
;CTR_RX
置位。
软件响应:
- 检查
USB_ISTR
中的EP_ID
和DIR
; - 根据
USB_EPnR
的SETUP
位判断是否为 SETUP 包; - 清除
CTR_RX
; - 读取
COUNTn_RX
获得数据长度; - 处理接收到的数据;
- 设置
STAT_RX = 11 (VALID)
允许下一次接收。
⚠️ 若 STAT_RX = 10 (NAK)
,主机会重试该 OUT 请求。上述流程必须严格按顺序执行,避免漏掉紧接的 OUT 请求通知。
🔁 控制传输
控制传输由以下三个阶段组成:
- SETUP 阶段(始终为 OUT);
- 数据阶段(可选,方向相同);
- 状态阶段(零字节,方向相反)。
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)事件。
挂起具体操作依设备而异,通常涉及降低功耗,比如:
- 设置USB_CNTR寄存器的FSUSP位为1,激活USB挂起模式,关闭SOF包接收检测,避免重复挂起中断。
- 减少非USB模块的静态功耗。
- 设置USB_CNTR寄存器的LP_MODE位为1,关闭模拟USB收发器的静态功耗,同时保持其能检测恢复信号。
- 可选择关闭外部振荡器和PLL。
当设备挂起时出现USB事件,必须启动恢复过程恢复系统时钟和USB功能,且恢复过程必须在10毫秒内完成(若为USB复位事件)。
恢复开始或复位序列会异步清除LP_MODE位。虽然这会触发WKUP中断,但因系统时钟重启延迟较长,建议恢复过程紧跟挂起过程后立即执行以缩短响应时间。为防止误触发恢复,挂起时会启用一个约70纳秒的模拟滤波器。
恢复过程应包括:
- 可选地打开外部振荡器和PLL。
- 清除USB_CNTR寄存器的FSUSP位。
- 根据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)。