ercircle 发表于 2025-8-1 12:19:13

STC-USB键盘之挂起/恢复中断响应及唤醒睡眠电脑的应用 - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯人工智能技术交流网站 - AI32位8051交流社区

关于STC8H8K64U的USB主动挂起 - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯人工智能技术交流网站 - AI32位8051交流社区

参考这两个帖子试了下,键盘范例可以触发挂起(外部供电,拔出USB,或电脑系统休眠),而U盘不行....,感觉和设备类型有关系
基于擎天柱开发板测试:



ercircle 发表于 2025-8-31 21:21:03



关于有效序列号iSerialNumber的判断标准:


USB设备的序列号是通过主机向USB设备获取USB设备的字符串描述符获取的,字符串的的索引存储在USB设备管理器中的iSerialNumber字段中,该字段的长度为一个字节,大小为0-255。
USB 设备描述符的 iSerialNumber 字段指示设备是否具有序列号以及该数字的存储位置,如下所示
    iSerialNumber == 0x00:USB 设备没有序列号。
    iSerialNumber!= 0x00:USB 设备具有序列号。 分配给 iSerialNumber 的值是序列号的字符串索引。
如果设备具有序列号,则序列号必须唯一标识同一设备的每个实例。
例如,如果两个设备描述符的“idVendor”idProduct”和“bcdDevice”字段的值相同,则 iSerialNumber字段必须不同,以便将一台设备与另一台设备区分开来。


Windows即插即用管理器要求 USB 序列号中的每个字节都有效。如果单个字节无效,Windows 会丢弃序列号,并将设备视为不具有序列号。 对于 USB 序列号,以下字节值无效:
·0x2C.(说明,该值的ASSIIC为逗号)
·小于0x20 的值。(说明,0x20该值的ASSIIC为空格)
·大于0x7F 的值。(说明,0x7f该值的ASSIIC为DEL)
必须为可见有有效字符。



https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=19874&pid=184371

ercircle 发表于 2025-10-23 09:37:15

大于255字节的FIFO内容读取应使用OUTCOUNT2:OUTCOUNT1双字节:



ercircle 发表于 2026-1-6 18:55:38


usb remote wakeup 是Device发起,层层传递,HOST接手的传递行为~


截自usb2.0文档。

ercircle 发表于 2026-1-12 15:41:53

关于USB OTG SRP行为:
1.HOST和DEVICE,会话结束,皆处于挂起状态,VBUS掉电
2.DEVICE解除D+上拉,总线进入SE0状态至少1s
3.DEVICE主动发起SRP
4.The VBUS pulsing method of SRP defined in previous revisions of the supplement is no longer supported.



《usb_20.pdf》






《USB_OTG_and_EH_2-0-version 1_1a.pdf》

ercircle 发表于 2026-1-12 15:51:47

关于USB HNP行为:
1.总线挂起
2.释放B设备D+上拉,发起HNP
3.A设备检测到DISCON,但是SESS保持,拉起D+响应HNP
4.B设备HNP请求结束,清除RESET,开始枚举A设备




《USB_OTG_and_EH_2-0-version 1_1a.pdf》


ercircle 发表于 2026-1-12 17:22:45

<p>HNP时序图注释:</p>
<table>
<thead>
<tr>
<th><strong>参数</strong></th>
<th><strong>全称/含义</strong></th>
<th><strong>对应阶段</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>X1: TA_AIDL_BDIS</td>
<td>A-device Idle to B-device Disconnect(A型设备空闲到B型设备断开上拉的时间)</td>
<td>B型设备发起HNP请求阶段</td>
</tr>
<tr>
<td>X2: TA_BDIS_ACON</td>
<td>B-device Disconnect to A-device Connect(B型设备断开上拉到A型设备响应的时间)</td>
<td>A型设备响应HNP请求阶段</td>
</tr>
<tr>
<td>X3: TA_BIDL_ADIS</td>
<td>B-device Idle to A-device Disconnect(B型设备空闲到A型设备断开下拉的时间)</td>
<td>角色切换(B型→新主机)阶段</td>
</tr>
<tr>
<td>X4: TLDIS_DSCHG</td>
<td>Line Disconnect to Discharge(总线断开到电平放电稳定的时间)</td>
<td>总线状态过渡阶段</td>
</tr>
<tr>
<td>X5: TA_BCON_SDB_WIN</td>
<td>A-device B-connect to SDB Window(A型设备切换为外设后,新主机的SDB窗口时间)</td>
<td>新主机初始化通信阶段</td>
</tr>
<tr>
<td>X6: TA_BCON_SDB</td>
<td>A-device B-connect to SDB(A型设备切换为外设后,新主机的SDB信号时长)</td>
<td>新主机初始化通信阶段</td>
</tr>
<tr>
<td>X7: TA_BCON_ARST</td>
<td>A-device B-connect to Auto Reset(A型设备切换为外设后,新主机的自动复位时长)</td>
<td>新主机枚举阶段</td>
</tr>
<tr>
<td>X8: TB_AIDL_BDIS</td>
<td>B-device A-idle to B-device Disconnect(B型设备检测到A型设备空闲后,断开上拉的时间)</td>
<td>B型设备发起HNP请求阶段</td>
</tr>
<tr>
<td>X9: TB_ACON_DBNC</td>
<td>B-device A-connect to Debounce(B型设备检测到A型设备响应后,去抖动的时间)</td>
<td>A型设备响应HNP请求阶段</td>
</tr>
<tr>
<td>X10: TB_ACON_BSEO</td>
<td>B-device A-connect to B-SE0(B型设备检测到A型设备响应后,强制总线进入SE0的时间)</td>
<td>B型设备发起HNP请求阶段</td>
</tr>
</tbody>
</table>

ercircle 发表于 2026-1-21 19:41:19

ISO端点wMaxPacketSize设置512B以上,USB枚举失败:电脑资源不足导致

ercircle 发表于 2026-1-27 08:56:52

关于CDC printf发大包异常问题,需要自行建立缓冲区分包发送:


https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=21685&pid=200153

wx85105157 发表于 2026-3-13 21:26:05

是不是可以通过设置特殊的波特率,然后设置dtr引脚的形式来重启进boot?就不用在串口的数据流里面出现握手数据。
页: 1 2 [3] 4
查看完整版本: 一些奇奇怪怪的USB问题记录