NCM传输头-NTH16
2025-07-07
0
0
根据USB2.0和USB3.0,NTC传输头分为NTH16和NTH32.
NTH16(NCM Transfer Header for 16-bit NTB)
NTH16 结构定义(总长度:12字节)
偏移量 | 字段名 | 大小 | 值/格式 | 说明 |
---|---|---|---|---|
0 | dwSignature |
4字节 | 0x484D434E (小端序:NCMH ) |
NTB16标识签名: - 固定魔数,用于标识这是一个NTB-16结构。 - 小端序实际传输为 0x4E,0x43,0x4D,0x48 (ASCII字符 “NCMH”)。 |
4 | wHeaderLength |
2字节 | 0x000C (小端序) |
NTH16头部长度: - 固定为12字节(0x0C),表示NTH16自身的长度。 |
6 | wSequence |
2字节 | 递增数字(小端序) | 序列号: - 功能:每次”功能复位”后从0开始递增,用于调试和错误检测。 - 约束: - 发送方必须在复位后重置为0,后续NTB递增。 - 接收方可选择是否校验序列号(规范未强制要求)。 - 用途:帮助诊断丢包或乱序问题(如USB传输错误)。 |
8 | wBlockLength |
2字节 | NTB总字节数(小端序) | NTB块总长度: - 关键规则: - 必须 ≤ dwNtbInMaxSize (输入)或 dwNtbOutMaxSize (输出)。- 特殊值 0x0000 :表示通过短包(Short Packet)终止传输,需谨慎使用(见下方注意事项)。- 对齐要求:若NTB大小等于 wMaxPacketSize 的整数倍,且无剩余数据,则不发送ZLP(Zero Length Packet)。 |
10 | wNdpIndex |
2字节 | NDP16偏移量(小端序) | 第一个NDP16的偏移量: - 约束: - 必须 ≥ 0x000C (即跳过NTH16头部)。- 必须是4的倍数(32位对齐)。 - 作用:指向NTB中第一个NDP16结构的位置,用于定位封装的以太网帧。 |
关键注意事项
wBlockLength = 0x0000
的特殊处理- 用途:动态调整NTB大小以减少延迟(如发送方发现数据不足时提前终止)。
- 风险:可能导致主机与设备状态不同步,需严格测试。
- 示例:
- 设备开始发送一个预分配的大NTB,但实际数据较少时,可通过短包提前结束传输。
对齐与边界条件
- NDP对齐:
wNdpIndex
必须4字节对齐(如0x0C, 0x10, 0x14…)。 - ZLP规则:若NTB大小正好为端点
wMaxPacketSize
的整数倍,禁止发送ZLP(与常规USB批量传输不同)。
- NDP对齐:
调试支持
wSequence
字段虽非强制校验,但建议在开发阶段启用,以检测传输异常(如丢包、乱序)。
示例数据流(小端序)
假设一个NTB-16的NTH16头部如下(十六进制):
4E 43 4D 48 0C 00 01 00 00 10 0C 00
- 解析:
dwSignature
=0x4E434D48
(“NCMH”)wHeaderLength
=0x000C
(12字节)wSequence
=0x0001
(序列号1)wBlockLength
=0x1000
(NTB总长4096字节)wNdpIndex
=0x000C
(第一个NDP16紧接NTH16之后)
关联规范参考
- NTB大小限制:参见规范第6章(Table 6-3)的
dwNtbInMaxSize
/dwNtbOutMaxSize
。 - NDP16结构:需结合后续的
NDP16
定义(含以太网帧偏移量和长度)。 - 错误处理:若
wBlockLength
或wNdpIndex
非法,接收端应丢弃NTB并报告错误。
此设计确保了NCM在USB 2.0环境下的高效性和可靠性,同时为调试提供了灵活性。