USB ID信号

本文深入探讨了USB On-The-Go(OTG)技术,解释了如何通过新增的ID检测脚实现在没有计算机介入的情况下,两个设备之间的直接通信。USB-OTG克服了USB2.0仅支持PC作为主机的限制,允许设备间直接互连,定义了A-设备(默认主机)和B-设备(默认外围设备)的概念,并详细说明了ID脚的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

USB ID信号

为了实现两个设备无需使用计算机主机完成通信链接,USB协会为此增加了其附属协议来解决现在这个问题,而引入了一个新的引脚:ID检测脚。

USB-OTG

USB-On The Go(OTG)。
USB 2.0规范定义了主机/外设关系,PC始终是主机,插入它的设备是外围设备。
随着PDA,数码相机和各种其他便携式设备的技术进步,需要直接互连这些设备而无需增加计算机。USB 2.0不支持此功能。

因此,为了克服这一限制,USB-OTG被发布。
USB-OTG是USB 2.0设备的附录,定义一类新的设备。这些设备旨在增加外围设备的功能,以包括有限的主机功能。

OTG特性

意味着只能使用USB-OTG连接两个设备。在USB-OTG下,用户插入两个设备以建立链接。
主机/外围设备协商由设备完成,无需用户提供任何输入以使体验舒适。
USB-OTG定义了两种类型的设备。

  • 默认为主机的A-设备
  • B-设备默认为外围设备。

OTG增加引脚-ID
USB标准的引脚,一共五个信号线。
在这里插入图片描述
(1)Vbus:电源引脚。
(2)D+:数据线+。
(3)D-:数据线-。
(4)GND:地参考。
(5)ID脚:Identification,检测的意思。ID线—以用于识别不同的电缆端点,mini-A插头(即A外设)中的ID引脚接地,mini-B插头(即B外设)中的ID引脚浮空。

当OTG设备检测到接地的ID引脚时,表示默认的是A设备(主机),而检测到ID引脚浮空的设备则认为是B设备(外设)。

支持USB OTG的设备(即可以做USB Host有可以做Slave的设备),USB_ID信号才有意义。
当设备检测到USB_ID信号为低时,表该设备应作为Host(主机,也称A设备)用。
当设备检测到USB_ID信号为高时,表示该设备作为Slave(外设,也称B设备)用。

实际的USB连接线中,是没有USB_ID这根线的。都是在接口部分直接确定上拉的,比如U盘。

  • 对于Host端,只需将连接线的USB_ID pin和地短接即可,
  • 对于Slave端,USB连接线的USB_ID pin是悬空的。(设备内部上拉)。
Reference

https://www.nxp.com/docs/en/brochure/75016113.pdf
http://apachetechnology.in/KC/Multimedia/USB/USB_Specs_OTG.pdf

2019-07-26人吃土一辈子,土吃人一回

在C++中处理USB输入信号可以通过调用Windows平台提供的API函数来实现。其中,使用WinUSB API是处理USB输入信号的一种常见方式。以下是一个简单的例子,演示如何使用WinUSB API在C++中读取USB输入信号: ```cpp #include <Windows.h> #include <winusb.h> #define USB_VID 0x1234 #define USB_PID 0x5678 int main() { // 打开WinUSB设备 HANDLE hDev = NULL; hDev = CreateFile(L"\\\\.\\WinUSBInterface1", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if (hDev == INVALID_HANDLE_VALUE) { printf("Failed to open device!\n"); return 1; } // 初始化WinUSB上下文 WINUSB_INTERFACE_HANDLE hWinUSB = NULL; BOOL bResult = WinUsb_Initialize(hDev, &hWinUSB); if (!bResult) { printf("Failed to initialize WinUSB context!\n"); return 1; } // 读取USB输入信号 UCHAR buffer[64] = { 0 }; ULONG length = 0; bResult = WinUsb_ReadPipe(hWinUSB, 0x81, buffer, sizeof(buffer), &length, NULL); if (!bResult) { printf("Failed to read USB input signal!\n"); return 1; } // 输出读取到的数据 printf("Read %d bytes from USB input signal: ", length); for (ULONG i = 0; i < length; i++) { printf("%02X ", buffer[i]); } printf("\n"); // 关闭WinUSB设备 WinUsb_Free(hWinUSB); CloseHandle(hDev); return 0; } ``` 需要注意的是,在使用WinUSB API进行USB输入信号处理时,需要先获取设备的句柄,然后通过WinUsb_Initialize函数初始化WinUSB上下文,最后使用WinUsb_ReadPipe函数读取USB输入信号。此外,还需要根据USB设备的厂商ID和产品ID来打开正确的设备。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值