USB学习系列之二——USB设备的插入检测

1.USB的插入检测机制:USB端口的D+和D-均用一个15k的电阻接地,当无设备接入时,均处于低电平;在设备端在D+(表示高速设备或者全速设备)或者D-(表示低速设备)接了一个1.5k的上拉电阻到+3.3v,一旦将设备接入,USB端口的D+或者D-其中一个被拉高为3v,系统识别到外部设备接入。

注意:高速设备首先会被识别为全速设备,然后再通过集线器和设备二者的确认最后切换到高速模式下。

在高速模式下,采用的是电流传输模式,这个时候上拉电阻需要从D+上断开。

2.当设备没有枚举成功时(可以通过一个10K的电阻将USB的电源端和D+或者D-连接起来,电脑会发现一个无法识别的设备,这个设备的PID和VID都是0,根据每个特性可以简单的判定设备的枚举是否成功。

3.一个具体的USB实现什么功能,USB主机并不知道。USB主机通过读取USB的设备描述符来获取设备的类型、厂商的ID和产品的ID(通常依靠它们来加载对应的驱动程序)、端点情况、版本号等众多信息。

4.USB1.1协议定义的标准描述符有设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端点描述符(Endpoint Descriptor)和字符串描述符(String Descriptor)。

USB2.0相比于USB1.1新增加的两个描述符:限定符描述符(Qualifier Descriptor)和其他速度配置描述符(Other Speed Configuration Descriptor)。

5.一个USB设备只有一个设备描述符。

设备描述符里面决定了该设备有多少种配置,每种配置都有一个配置描述符;

而在每个配置描述符中又定义了该配置有多少个接口,每个接口都有一个接口描述符;

在接口描述符里面又定义了该接口有多少个端点,每个端点都有一个端点描述符,端点描述符定了端点的大小、类型等。

如果有类特殊描述符,它跟在相应的接口描述符之后。

注意:USB主机获取描述符时,从上到下逐层获取。对于字符串描述符,USB主机是单独获取的,主机通过发送获取字符串中描述符的请求以及描述符的索引号、语言ID来获取对应的字符串描述符。

6.设备描述符:设备所使用的USB协议版本号、设备类型、端点0的最大包大小、厂商ID(VID)和产品ID(PID)、设备版本号、厂商字符串索引、产品字符串索引、设备序列号索引、可能的配置数等。

配置描述符:记录配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电流需求量等。

接口描述符:记录接口的编号、接口的端点数、接口所使用的类、子类、协议等。

端点描述符:端点号及方向、端点的传输类型、最大包长度、查询时间间隔等。

字符串描述符:提供一些方便人们阅读的信息,它不是必需的。

7.与USB设备进行通信时需要的地址:设备的地址和端点的地址。配置和接口是为了更加方便的管理端点抽象出来的概念。一个设备可以有多个配置,但是一个时刻只能有一个配置有效;每个配置下又可以有多个接口,一个接口下面可以有多个端点。

8.具有多个接口,并由接口来实现功能的设备叫做USB复合设备。例如一个USB音频设备,它具有一个音频控制接口,另外还有一个到多个音频流或者MIDI流接口。在主机端会把USB复合设备的每个接口当做一个功能设备来看待,常见的USB鼠标,U盘等通常是单一的设备,即一个设备下只有一个配置描述符、一个接口描述符。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 设备与电脑之间进行数据传输时,我们通常使用 USB 接口。如果我们想要在 Android 应用中进行 USB 开发,我们需要了解一些基本的概念和步骤。 1. 获取 USB 权限 在 Android 应用中,如果要使用 USB 接口,需要获取 USB 权限。我们可以在 AndroidManifest.xml 文件中添加如下代码: ``` <uses-feature android:name="android.hardware.usb.host" /> <uses-permission android:name="android.permission.USB_PERMISSION" /> ``` 此外,我们还需要注册 USB 广播接收器,以便在设备插入或移除时接收通知。在 AndroidManifest.xml 文件中添加如下代码: ``` <receiver android:name=".UsbBroadcastReceiver"> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" /> </intent-filter> </receiver> ``` 2. 搜索 USB 设备USB 开发中,首先需要搜索可用的 USB 设备。我们可以使用 UsbManager 类来获取当前连接的 USB 设备列表。例如: ``` UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList(); ``` 其中,deviceList 就是当前连接的 USB 设备列表。我们可以遍历这个列表,找到我们需要的设备。 3. 打开和关闭 USB 设备 找到需要的 USB 设备后,我们需要打开它。在 Android 中,我们可以使用 UsbDeviceConnection 类来打开 USB 设备。例如: ``` UsbDeviceConnection connection = usbManager.openDevice(device); ``` 在使用完 USB 设备后,我们需要关闭它。我们可以使用 UsbDeviceConnection 类的 close() 方法来关闭 USB 设备。例如: ``` connection.close(); ``` 4. 进行读写操作 在打开 USB 设备后,我们可以进行读写操作。在 Android 中,我们可以使用 UsbDeviceConnection 类的 bulkTransfer() 方法进行读写操作。例如: ``` byte[] buffer = new byte[1024]; int count = connection.bulkTransfer(endpoint, buffer, buffer.length, TIMEOUT); ``` 其中,endpoint 是 USB 端口,buffer 是数据缓冲区,TIMEOUT 是超时时间。bulkTransfer() 方法返回的是读取的字节数。 以上就是 Android USB 开发的基本步骤。需要注意的是,在进行 USB 开发时,我们需要根据具体的设备和需求来设置参数和操作方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值