USB设备开发中常见的问题总结
在开发 USB 设备时,开发人员经常会遇到可能导致 USB 通信错误的总线问题。虽然某些错误会导致系统故障,但其他问题可能仍允许系统运行,但行为可能会不稳定。以下是可能发生的一些 USB 总线问题的示例:
USB 数据包数据和数据排序不正确
USB 数据包包含错误检查机制,包括确保数据有效性的 CRC 位和确保数据正确排序的 PID 数据包中的切换位。有时在 USB 数据传输过程中,如果此机制出现错误,这些机制也会受到影响,导致单个 USB 事务丢失或吞吐量降低。
例如,如果数据包损坏且 CRC 无效,接收器将向收发器发送 NAK 位,告知数据包错误。收发器随后将多次重新发送数据,但这反过来会导致数据包丢失,因为接收器可能认为这是重复数据。
错误序列的一个例子包括错误数据位切换。在正常的数据交易中,数据 PID 将在 DATA0 和 DATA1 之间连续切换,但是,如果出现问题,则可能会发生数据重新传输,其中切换位无法正确更新,从而导致重复相同的切换位。在这些情况下,连续的 DATA0 或 Data1 不会传递给应用程序,因为接收器将忽略重复的数据包。这将导致数据无法传递给应用程序。
USB 传输/重新传输
在正常的 USB 事务中,主机和外设发送和接收数据,确认 (ACK) 或拒绝 ( NAK ) 某些事务,从而实现有效通信。在有效 USB 传输的一个示例中,主机将向外设发送 IN 令牌,外设将使用数据包进行响应。主机将确认此情况并使用 ACK 数据包进行响应,这将让设备知道它已正确接收数据并准备好发送另一项事务。
但是,有时传输可能会出错。如果数据包损坏,主机可能会丢弃此数据包而不会发送 ACK。然后外设将收到另一个 IN 令牌,但由于没有 ACK,它将重新发送相同的数据。这可以归类为重新传输。
一些数据重传是可以的,但是如果总线上重传溢出,则会导致性能下降和/或数据包丢失。
电源/VBUS 相关问题
另一个常见的 USB 总线错误与电源和 VBUS 问题有关。VBUS 是 USB 连接器内的一条线,用于为设备供电。主机和外围设备对电流补充或消耗有特定的上限,因此如果检测到设备电流过量,系统可能会在测试或操作时关闭。
系统还可能因未正确连接或枚举而对电流过度消耗做出反应。如果主机或设备检测到高电流水平,则其中一方可能会断开连接,枚举将无法完全完成。
枚举问题
USB 系统中的枚举是主机检测设备存在并确定所连接设备类型和通信速度的过程。此时会生成握手令牌,因为两个设备都在了解彼此的功能。
枚举后,主机将重置设备以读取其描述符并识别它。但是,如果设备描述符不正确,例如它不是正确的位长度,这可能会导致枚举错误,从而导致设备之间的连接不正确。
高速协商问题
由于 USB 2.0 向后兼容以前的规范,因此高速设备还可以支持低速和全速信号。首次连接设备时,最初使用全速功能,直到可以从任一设备确认高速功能。为了让 USB 2.0 设备执行高速协商,需要执行一种称为 Chirping 的协议。
USB 在此阶段定义了两种数据总线状态,即 J 和 K 序列码。当高速 USB 主机连接到另一台设备时,主机将重置设备并等待 K 序列码作为回应,这将表示该设备具有高速功能。如果它没有以 K 序列码作为回应,高速主机设备将终止握手。但是,如果设备确实返回了 K 序列码,主机将以交替的 序列码 K 和 序列码 J 对进行响应,以告知设备它具有高速功能。一旦识别出此事务,便会建立高速连接。
速度协商问题可能会导致设备之间的信号问题,从而导致设备无法正常运行。例如,如果全速设备最终错误地响应 K chirp,主机会认为它能够处理高速。这可能会导致数据包损坏,因为设备不理解高速。
重置、暂停和恢复事件
某些类型的低级总线事件(包括重置、暂停和恢复事件)对于两个高速设备之间的成功通信至关重要,这些事件期间的任何中断都可能导致 USB 设备出现异常行为。
当主机想要开始与设备通信时,会发生重置事件。这将允许设备重置为默认的未配置状态,以实现无缝通信。如果此事件未正确发生,设备可能无法有效枚举或正确交换 USB 数据。
USB 设备在不使用时能够断电,这是通过挂起事件实现的。在此期间,挂起的设备必须识别恢复信号和重置信号。如果主机想要唤醒设备,它可以发出恢复信号。如果发送或接收这些信号存在问题,USB 设备可能无法正确唤醒,并且在这些事件发生期间或之后可能无响应。