USB2.0集线器HUB
+ -

TT低全速-批量控制事务转换

2026-04-27 本文链接为:http://www.usbzh.com/article/detail-1636.html ,欢迎转载,转载请附上本文链接。

事务缓冲区

每个事务转换器必须有至少2个完全一模一样、功能对等的通用缓冲区,每一个缓冲区都独立完整走完一整条事务全流程:

  • 接收上游主机下发的Start-Split(起始拆分)
  • 缓存下发OUT数据/事务命令
  • 交给下游全速/低速总线执行事务
  • 缓存下游设备返回的握手、IN 数据、超时结果
  • 再通过 Complete-Split 上报给上游主机

双Buffer实现并行吞吐、不阻塞,提升非周期批量/控制传输效率。

因为单Buffer必须等这条事务完全结束、缓存清空,才能收下一条,效率低。而双 Buffer流水线Buffer A正在处理下游低速设备的事务、等返回结果,Buffer B可以同时接收主机新的起始拆分事务,提前排队。

事务转换规则

  • 硬件要求:TT 最少配置 2 个批量 / 控制专用缓存,单缓存对应一条全速 / 低速事务,复用存储指令、数据与事务结果。
  • 交互规则:缓存空闲即接收主机起始拆分事务;完成拆分释放缓存后可立即复用,事务顺序由缓存状态与主机调度决定。
  • 调度规范:主机无需隔离普通高速事务与拆分事务,但需区分事务类型。
  • 流程规范:批量与控制拆分事务逻辑相近,状态机仅定义交互顺序、不限制时序;单端点同一时间仅允许一条拆分事务缓存。
  • 匹配差异:批量事务校验需判断传输方向,控制事务无需校验方向

TT批量/控制事务的缓冲区匹配算法

状态
  • PENDING:TT已经将高速的START SPLIT令牌转发到下游(全速/低速)总线,正在等待下游设备的响应数据或握手信号(ACK/NAK/STALL)。此时下游端口尚未完成事务,TT会暂存后续可能收到的数据。
  • READY:TT已从下游设备接收到响应(数据或握手包),并且已经将其转换为高速事务的格式,等待主机发送COMPLETE SPLIT来取走这个结果。此时TT已经准备好交付数据或状态。
  • OLD(或称作COMPLETE后的状态):机已通过COMPLETE SPLIT将数据/状态读走。TT内部对应的缓冲区已被释放,可以用于新的SPLIT事务
标识
  • NEW_SS:新事务,用空 / 旧缓冲区
  • OLD_SS:旧事务,是重试
  • NO_SPACE:没空间
int Compare_buffs(void) 
{
    BC_buff.status = NO_SPACE;
    BC_buff.index = 0;
    for(i = 0; i < N; i++) 
    {
        // 情况1:地址/端点匹配且方向匹配(控制端点除外)
        if(addr_match && endp_match && (control_endp || bulk_endp_dir_match)) 
        {
            BC_buff.index = i;
            if(status == READY || status == PENDING) 
            {
                BC_buff.status = OLD_SS;
            } 
            else 
            {
                BC_buff.status = NEW_SS;
            }
            return BC_buff.status;
        }
        // 情况2:地址/端点不匹配,但状态是 OLD(可重用)
        else if(status == OLD) 
        {
            BC_buff.index = i;
            BC_buff.status = NEW_SS;
            return BC_buff.status;
        }
    }
    return BC_buff.status;  // NO_SPACE
}
  1. 主机发来一条新的起始拆分事务(Start-Split),TT 遍历所有缓冲区,找最合适的缓冲区来存放这条事务,并返回 3 种结果:
    默认状态 = NO_SPACE(没空间)默认索引 = 0

  2. 遍历所有缓冲区(0 ~ num_buffs-1)
    只要还没找到匹配,就继续检查下一个缓冲区。

  3. 第一优先级:匹配 同设备 + 同端点
    设备地址相同 端点号相同
    批量端点:必须方向相同
    控制端点:不检查方向
    如果匹配成功:缓冲区状态是 READY / PENDING → 标记 OLD_SS(重试)

这个缓冲区已经处于活跃/忙碌状态,不能被“新”的事务使用。但由于 token 的地址/端点又和它完全一样,合理的推测是这是一个重试(retry)——之前的事务没有完成,现在又收到同一个端点的同一个 token.标记为 OLD_SS(Old Schedule State),告诉上层:“这个缓冲区已经在用,你是在重试同一个端点”。

否则 → 标记 NEW_SS(新事务)

OLD 表示该缓冲区曾经被使用过,但现在空闲,可以被回收重用,这是一个可用的旧缓冲区,现在分配给一个新的 token 使用。

记录缓冲区编号,停止查找(因为找到了)

  1. 第二优先级:没找到匹配 → 找 OLD 状态的空闲缓冲区
    找到就标记 NEW_SS,并占用该缓冲区。

以上代码可能存在已经在2缓冲区中重试的,下次来新的又占了1,所以可能有更加合理的方法。比如将缓冲区分为2类,查找2次,第一次查找有所有状态为READY和PENDING的,第二次查找OLD的。也可以查找一次,但是缓冲区会根据状态排序。

事务流程

┌─────────────────────────────────────────────────────────────────────┐
│                   正常分裂事务流程(批量 OUT 为例)                    │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  1. 主机发送 SSPLIT + OUT                                            │
│         ↓                                                           │
│  2. TT 收到并保存到本地缓冲区 ──► 响应 ACK                              │
│         ↓                                                           │
│  3. 缓冲区状态 = READY(等待全速/低速总线处理)                         │
│         ↓                                                           │
│  4. 全速/低速处理器执行实际事务                                        │
│         ↓                                                           │
│  5. 事务完成,保存握手/数据到缓冲区                                     │
│         ↓                                                           │
│  6. 主机轮询发送 COMPLETE_SPLIT                                       │
│         ↓                                                           │
│  7. TT 返回结果给主机                                                 │
│         ↓                                                           │
│  8. 缓冲区状态从 READY 更新为 OLD ←── 释放的关键!                   │
│         ↓                                                           │
│  9. 缓冲区现在可以被其他端点重用                                        │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘
场景 状态变化 是否需要软件干预 补充说明
正常事务完成 READY → OLD 不需要 硬件自动回收缓冲
下游返回 NYET(分割事务未完成) 保持 READY 不需要 主机下次周期重发CSPLIT
CSPLIT 传输错误,重试成功 READY → OLD 不需要 高速链路错误重试不影响下游
CSPLIT 重试彻底失败 永久卡死READY 需要 Clear_TT_Buffer 缓冲死锁,必须软件清TT
下游LS/FS总线EOF超时、总线挂起、无响应 滞留READY 可能需要手动清除 属于下游总线层错误,硬件无法自动回收

错误处理

当一个批量/控制事务(Split Transaction)失败,就会导致相关的 TT 事务缓冲区进入忙状态,无法被其他事务重用。这时主机就可以通过Clear_TT_Buffer 强制释放缓冲区。

OUT传输类型

093308607778

  1. 正常流程:主机发送SSPLIT + OUT令牌,若TT有缓冲区空间则返回ACK,主机随后需执行完成拆分事务。
  2. 异常处理
    • 超时或CRC错误:主机超时,视为事务错误。
    • 缓冲区满:TT返回NAK,主机稍后重试,但不增加错误计数。
  3. 错误计数机制
    • 对同一端点连续错误计数达到3次,主机将停止该端点事务(“三次失败即退出”)。
    • 正常完成或非USB总线延迟导致的问题不增加计数。
  4. ACK丢失重试:若TT已有该端点的拆分事务挂起,仍返回ACK但忽略数据,避免因之前ACK丢失导致主机重复发送。
  5. 调度灵活性:主机可以在重试某端点的开始拆分前,先处理其他端点的拆分事务。

IN传输类型

100335408985
09462616375

TT 为每个拆分事务维护以下状态之一(由下行总线上的 IN 事务结果决定):

  • pending:下行全速/低速 IN 事务尚未完成
  • ready/x:下行事务已完成,结果(x)为 NAK、ACK 或 STALL
  • old/x:该完成拆分已被处理过,TT 可复用缓冲区

对完成拆分请求的响应

TT 内部状态 TT 返回给主机的握手 含义
pending NYET 下行事务未完成,主机稍后重试完成拆分
ready/nak NAK 下行设备返回 NAK,主机应重试开始拆分
ready/ack ACK 下行事务成功完成(IN 方向数据已正确接收)
ready/stall STALL 下行设备返回 STALL,主机停止该端点
old/data DATA0/1 返回之前保存的数据(适用于 IN 传输)
无匹配状态 STALL 协议违规

主机侧行为

  • 收到 DATA0/1 且数据 toggle 正确、CRC 无误 → 记录数据,转到下一命令,错误计数归零
  • 收到 ACK → 记录结果,转到下一拆分事务

需要重试的情况

  • 收到 NYET → 稍后重试完成拆分(不增加错误计数)
  • 收到 NAK → 稍后重试开始拆分(不增加错误计数)
  • 发生传输错误(超时、CRC 错)或 toggle 不匹配
    • err_count < 3 → 立即重试完成拆分
    • err_count ≥ 3 → 端点停止处理

错误处理

  • 收到 STALL 或错误计数达到 3 → 执行端点停止处理,不再重试
  • 非 USB 总线延迟(如系统内存延迟)→ 不增加错误计数
本文链接为:http://www.usbzh.com/article/detail-1636.html ,欢迎转载,转载请附上本文链接。

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936     USB技术交流3:1031974172

0 篇笔记 写笔记

USB2.0集线器事务转换器TT
在 USB 2.0 高速总线普及后,如何兼容大量全速(12Mbps)、低速(1.5Mbps)老旧设备,成为核心技术难题。事务转换器(Transaction Translator,简称 TT) 应运而生,它是高速集线器的核心模块,如同一位精准的“翻译官”,完美衔接高速信号域与低速信号域,既保障高速总线......
USB2.0集线器的单TT和多TT
USB 2.0 集线器的 单TT(Single TT, STT) 和 多TT(Multi-TT, MTT) 核心区别在于:共享一个事务翻译器 还是 每个端口独立一个,直接决定多 FS/LS 设备并发时的带宽、延迟、稳定性。一、TT 是什么(快速回顾)TT = Transaction Transl......
TT低全速-批量控制事务转换
事务缓冲区每个事务转换器必须有至少2个完全一模一样、功能对等的通用缓冲区,每一个缓冲区都独立完整走完一整条事务全流程:接收上游主机下发的Start-Split(起始拆分)缓存下发OUT数据/事务命令交给下游全速/低速总线执行事务缓存下游设备返回的握手、IN 数据、超时结果再通过 Complete......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • USB资源
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!