【嵌入式】第2讲:USB CDC 从“插上电脑”到“出现 COM 口”,枚举过程到底发生了什么
好进入第 2 讲。第2讲USB CDC 从“插上电脑”到“出现 COM 口”枚举过程到底发生了什么后面调试时最常见的问题不是“代码编译不过”而是插上电脑没反应设备管理器里看不到东西有未知设备但没 COM 口有设备名但打不开有 COM 口但发不回去这些问题本质上都和枚举过程有关。所以这一讲要学会两件事电脑插上板子后双方在干什么调试时怎么根据现象判断卡在哪一步一、先讲一句最核心的话“出现 COM 口”不是 USB 一插上就天然有的而是电脑先成功识别了你的设备是 CDC然后操作系统才把它呈现成 COM 口。也就是说插上USB - 电脑检测到设备接入 - 电脑开始枚举 - 设备返回描述符 - 电脑确认这是 CDC 设备 - 系统加载对应驱动 - 设备管理器里出现 COM 口如果这条链中间任何一步出问题COM 口都可能不会出现。二、什么叫“枚举”可以先把“枚举”理解成电脑在给新插入的 USB 设备做身份核验和能力确认。电脑要确认这些问题你是不是一个合法 USB 设备你是什么设备你支持什么功能你有几个接口你有哪些端点该给你配什么驱动设备必须按 USB 规范回答。如果回答对了电脑就继续。如果回答错了电脑就会识别失败变成 Unknown Device或者根本不出 COM 口三、从物理插入开始到 COM 口出现大概经历哪些步骤下面按顺序讲。第 1 步物理接入主机检测到设备存在把 USB 线插上后主机侧首先会感知“有一个 USB 设备接进来了。”为什么能感知因为 USB 设备端会在数据线上表现出“我在这”的电气特征。在板子上这和DPDMUSB_SLAVE板上的相关上拉控制电路有关。原理图能看到USB_SLAVE和DP存在关联链路这就是设备接入识别相关电路的一部分。这一阶段如果有问题常见现象是插上电脑完全没反应设备管理器没有任何刷新甚至供电灯都不对这通常先查USB 线供电D / D- 硬件设备是否真的在跑程序第 2 步主机复位设备准备开始问话电脑发现设备后不会立刻给你 COM 口。它会先做一个“初始化动作”把设备拉到统一起点然后开始问问题。你可以把它想成“先让你站好再开始查身份证。”设备此时必须正确响应 USB 基本协议。如果这一步都没过后面描述符都轮不到。第 3 步主机读取 Device Descriptor设备描述符这是第一份关键身份证。它会告诉主机一些非常基础的信息比如USB 版本厂商 IDVID产品 IDPID设备类别设备版本字符串索引等现阶段不用背字段值但要知道Device Descriptor 是主机认识你的第一步。如果这一步有问题常见现象设备显示为 Unknown USB Device设备描述符请求失败根本继续不下去第 4 步主机给设备分配地址刚插上时USB 设备并不是正式“有身份”的。主机读完第一轮基础信息后会给它分一个 USB 地址。这个地址就像“点名时给你编号”。后面主机再和你通信就按这个地址找你。如果这一步出问题也会导致枚举中断。第 5 步主机继续读取更完整的描述符这里就进入关键阶段了。主机会继续读Configuration DescriptorInterface DescriptorEndpoint DescriptorString Descriptor可以先这样理解它们1. Configuration Descriptor告诉主机我有一种怎样的工作配置里面总共有多少接口总长度是多少2. Interface Descriptor告诉主机我有哪些功能接口每个接口属于什么类别对于 CDC 来说通常会涉及通信控制接口数据接口3. Endpoint Descriptor告诉主机我的数据通道怎么分配哪些端点用来收哪些端点用来发哪些端点是中断/批量等类型4. String Descriptor告诉主机厂商名产品名序列号等字符串信息四、为什么读完这些描述符后电脑才可能出 COM 口因为主机必须先搞清楚“是不是 CDC 设备”只有当主机从描述符中确认这个设备的接口组织方式符合 CDC类别信息正确端点安排合理操作系统才会说“哦这是个虚拟串口设备我给它挂成 COM 口。”所以必须记住COM 口不是某个 GPIO 决定的而是“USB 枚举 CDC 描述符 驱动匹配”的结果。五、为什么有的设备被识别了但就是不出 COM 口这是新手非常容易混淆的点。“被电脑识别”不等于“一定有 COM 口”。可能出现几种情况情况 1设备被识别成别的 USB 类例如HIDMSC自定义类这种情况下设备可能完全正常但就是不会出 COM 口。因为它不是 CDC。情况 2描述符不完整或不符合 CDC 规范这时可能出现设备能被看见但驱动不匹配或者只显示异常设备没有虚拟串口情况 3驱动问题有些系统环境下即便设备本身枚举得差不多如果驱动没匹配好也可能没有 COM 口有感叹号无法打开情况 4枚举中途失败前面几步走了一半但后面某一步失败也可能表现成设备一闪而过反复重连设备管理器刷新但不稳定最终没有 COM 口六、把整个枚举过程类比成“入职登记”把 USB 设备想成“新员工”电脑想成“公司前台”。第一步你进门前台看到“有人来了”。第二步让你站好确认你是一个正常来访者。第三步看身份证读取 Device Descriptor。第四步给你工号给设备分配地址。第五步看你的岗位说明读取 Configuration / Interface / Endpoint Descriptor。第六步安排你进哪个部门如果看出来你是 CDC就把你安排成“串口设备”这个角色。第七步系统里给你开账号最终在 Windows 里变成一个COMx。所以COM 口 电脑完成一整套识别流程后的“岗位分配结果”不是一插上就天然存在。七、结合目标最应该关注哪几个“观察点”后面调试时不要一上来就盯代码。先盯现象。观察点 1插上后设备管理器有没有刷新如果完全没刷新先怀疑USB 线坏板子没供电板子程序没跑USB 硬件链路问题D / D- 没建立有效接入状态观察点 2有没有出现“未知设备”如果出现 Unknown Device说明主机感知到了设备接入但枚举没成功这时候重点查描述符时钟USB 初始化底层驱动观察点 3有没有出现某个 USB 设备但不是 COM 口这说明设备可能部分枚举成功了但没被识别为 CDC重点查CDC 类注册CDC 描述符类/接口/端点配置驱动匹配观察点 4有没有出现 COM 口如果已经出现 COM 口说明前面最困难的那部分其实已经过了USB 设备存在枚举基本成功CDC 类基本成立驱动基本匹配八、为什么 USB 时钟错误会严重影响枚举要提前建立意识。USB 比 UART 更挑时钟。因为 USB 设备和主机之间的数据时序要求更严格。如果 USB 时钟不稳定或不正确常见现象是枚举失败描述符读不完整设备反复断开重连有时认得出有时认不出COM 口时有时无所以以后遇到“奇怪的 USB 问题”时钟一定是重点怀疑对象之一。九、要知道“端点”是什么端点不是物理引脚。可以先把它理解成USB 设备内部的数据通道编号。对于 CDC 设备通常会有控制相关端点数据接收端点数据发送端点主机之所以能和你的“虚拟串口”通信不是靠 原理图上引脚而是靠这些 USB 端点在工作。你现在只要先知道“端点存在且很重要”即可。十、未来会遇到的故障按枚举阶段分类阶段 A物理接入失败现象插上没任何反应查USB 线电源板子程序是否运行D/D- 硬件链路阶段 B早期枚举失败现象设备管理器有反应但显示未知设备或报错查Device DescriptorUSB Core 初始化时钟中断阶段 C类识别失败现象设备被识别了但没有 COM 口查CDC 类注册Interface / Endpoint Descriptor驱动匹配阶段 D应用层失败现象有 COM 口串口助手能打开但发什么都没回查CDC 接收回调缓冲区发送接口忙状态处理十一、这一讲该记住的结论是COM 口不是插上就有是枚举成功后的结果。电脑先读描述符再判断你是不是 CDC。只有被识别成 CDCWindows 才会给你 COM 口。“设备被识别”不等于“一定有 COM 口”。调 USB 问题时要先判断卡在枚举哪一层。十二、当前阶段的理解题自己在脑子里答一遍1. 为什么 USB 设备插上后不一定有 COM 口因为主机要先完成枚举并确认它是 CDC 设备才会表现成 COM 口。2. 为什么描述符很关键因为主机靠它判断设备身份、功能接口和端点组织。3. 如果设备管理器出现 Unknown Device说明什么说明主机已经感知到设备但枚举过程中某一步失败了。4. 如果设备被识别了但没有 COM 口优先怀疑什么优先怀疑 CDC 类配置、描述符、接口和端点组织、驱动匹配。十三、下一讲该讲什么第3讲做 USB CDC 虚拟串口最小工程到底要具备哪些条件这一讲会讲工程必须有哪些基础文件时钟要满足什么中断要满足什么USB 初始化链最小应该有哪些步骤如何判断“现在这个工程具不具备出 COM 口的资格”
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2478431.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!