具体如下:

A.等待安卓设备连接;

B.确定手机支持附属模式(配件模式 );

当安卓设备接入USB主机时,一定处于以下3种模式之一:

*a.支持附属模式,并且已经在处于这种模式中;

*b.支持附属模式,但是还没有进入该模式;

*c.不支持附属模式;

当连接初始化时,处理器需要检测安卓设备的VID(供应商ID)和PID(产品ID)。如果设备已经在附属模式(case a),VID需要匹配谷歌ID 0x18D1,PID应是0x2D00或者0x2D01。如果满足以上条件,处理器就可以和安卓设备建立数据通路,使用协议通过批量端点进行通讯。在配件模式,没有必要启动设备。

NOTE:

0x2D00用于支持配件模式的安卓设备;

0x2D01用于支持配件模式和ADB (Android Debug Bridge)协议,额外开放了2个端点的二次端口用于安卓调试,如果你可以在PC上进行模拟处理器,就可以用这2个端点进行调试。通常,不要使用这个接口除非(In general, do not use this interface unless your accessory is implementing a passthrough to ADB on the device.)。

C.如果VID和PID不符合安卓设备的配件模式,处理器就不能辨别这个安卓设备是否支持配件模式(目前不在该状态)或者(不支持该模式)。这是因为设备并不会在一开始就报告VID和PID,因此,处理器应该尝试让设备进入配件模式,以判定设备是否支持该模式。

主机尝试启动Android配件模式:

●发送一个0x33控制请求(Get Protocol),来得出设备是否支持( the Android accessory protocol),返回一个非零的数字,这个数字代表了该设备支持的协议版本号;这是一个端点0的控制请求,主要有以下特性:

requestType:    USB_DIR_IN | USB_TYPE_VENDOR(0xC0)

request:        0x33

value:          0

index:          0

data:       protocol version number (16 bits little endian sent from the device to the            accessory)

●如果设备返回合理的协议版本,处理器将向设备发送一个标识字符串,这个字符串信息将为设备找一个合适的应用(APP),如果不存在合适的应用(APP),将会提供一个URL。这些是端点0的控制请求(对于每个不同的字符串ID),有以下特性:

requestType:    USB_DIR_OUT | USB_TYPE_VENDOR(0x40)

request:        0x34

value:          0

index:          string ID

data            zero terminated UTF8 string sent from accessory to device

*以下字符串ID是被支持的,每个字符串ID最大长度不超过256B,并且一定以 `\0`结尾

manufacturer name:   0

model name:          1

description:         2

version:             3

URI:                4

serial number:      5

●当发送标识字符串时,需要设备启用配件模式,这是一个端点0的控制请求,主要有以下特性:

requestType:    USB_DIR_OUT | USB_TYPE_VENDOR(0x40)

request:        0x35

value:          0

index:          0

data:           none

在发送完最后一个控制请求后,连接的USB设备应该在配件模式下向总线重新报告自己的信息,处理器可以重新枚举该设备(进行一次复位操作);如果设备成功切换至配件模式 ,VID和PID会不同,并且符合谷歌的VID和PID,而不是制造商ID,处理器可以和安卓设备建立通讯。

如果以上任何一个步骤出错,设备都无法支持配件模式,处理器需要等待下一个设备连接。

建立通讯连接

C.如果处于accessory mode的安卓设备被插上,处理器查询设备的接口和端点描述符去获取和设备通信的批量端点。一个PID是0x2D00的安卓设备拥有一个包含2个批量端点的接口,用于数据上下传。一个PID是0x2D01的安卓设备拥有2个接口,2个批量端点分别用于2个接口的数据上下传,第一个接口是标准通信(standard communication),第二个接口主要用于ADB  communication。为了能够和接口通讯,需要找到一个批量上下传端点,使用SET_CONFIGURATION (0x09) 请求设置配置为1,然后就可以和端点通讯了。

二、硬件设计

CH559是一款兼容MCS51的增强型E8051内核单片机,79%的指令是单字节单周期指令,内置63K Code Flash,6K+256B Ram。CH559内置USB2.0全速主从模式,USB 主机模式下提供双USB口,可同时管理两个 USB 设备。支持最大 64 字节数据包,内置 FIFO,支持 DMA。

CH554是一款兼容MCS51的增强型E8051内核单片机,79%的指令是单字节单周期指令,内置1K+256B RAM,16KB iFlash-ROM。CH554提供丰富的接口资源,包括ADC模数转换、3组定时器和信号捕捉及PWM、双异步串口、SPI等。CH554提供6通道电容检测模块,互电容方式支持最多15个触摸按键,并且支持USB2.0全速主从模式。下面代码是基于CH559写的,但是理论上USB单片机都可以实现。

三、软件设计

(1)、USB主机功能开启

InitUSB_Host( );

(2)、等待USB设备连接

if ( UIF_DETECT )            // 如果有USB主机检测中断则处理

{

UIF_DETECT = 0;          // 清中断标志

AccessoryModeOpenSuc = 0;//清除模式设置标志位

s = AnalyzeRootHub( );   // 分析ROOT-HUB状态

if ( s == ERR_USB_CONNECT )

{

FoundNewDev = 1;

}

}

(3)、设置Android配件模式

s = InitRootDevice( );  // 初始化USB设备,Accessory mode预设置

s = InitRootDevice( );  // 设置Android配件模式

获取批量传输端点

(4)获取AOA协议版本、关联URL、启动配件模式

AOAModeInit();          // AOA初始化函数

(5)、批量数据通讯

android aoa 串口,51单片机安卓AOA协议和Android设备USB通讯实例相关推荐

  1. 51单片机函数加了reentrant,设备就不动了

    51单片机函数加了reentrant,设备就不动了,删掉之后又可以工作了. 加reentrant是为了解决下面的警告,又在中断用又在main()函数用的函数 *** WARNING L15: MULT ...

  2. 51lcd显示光传感器c语言程序,基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例...

    基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例,系统由GY-30数字光照传感器.51单片机最小系统.1602液晶显示屏组成,电路简单,附件中的程序是实物验证过了的.1 ...

  3. 串口发数据到android数据错误,51单片机通过蓝牙串口模块发送JSON数据给安卓手机故障解决办法...

    原标题:51单片机通过蓝牙串口模块发送JSON数据给安卓手机故障解决办法 JSON(Java Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMA (欧洲计 ...

  4. 测试软件为什么不能识别串口,COM口识别,状态正常,设备无法通讯的解决方法...

    COM口识别,状态正常,设备无法通讯的解决方法 打开注册表HKEY_LOCAL_MACHINE//SYSTEM//CurrentControlSet//Control//COM Name Arbite ...

  5. android接收串口发送字符,安卓串口通讯发送指令代码详解

    最近好多做安卓端跟硬件交互的,比如一些智能家居,贩卖机的. 而这些不管是485也好,232的板子也好,都会用到串口通讯,去往下位机发送指令操控.下面是我个人的一些理解,发送串口指令的方法都是一样的,各 ...

  6. android 4.4官方下载,安卓系统电脑版-android x86 4.4 iso下载官方最新版【pc版】-西西软件下载...

    Android-X86是由Beyounn和Cwhuang主持设计的.提供了一套完整的可行源代码树,配套文档以及Live CD与Live USB.Android系统主要应用在智能手机以及平板电脑设备上. ...

  7. android 开发桌面应用程序,安卓开发基础教程-Android多界面应用程序开发

    开篇 本文阅读需10分钟,简单易上手,属于安卓开发教程的基础部分. 建议精读,深刻理解大意.多做实践.多写代码. 本文章由做全栈攻城狮原创首发. 同名公众号已开启,官网www.8z5.net. 本套教 ...

  8. android rtsp协议转http协议_Http协议和Https协议

    序言 Http和Https属于计算机网络范畴,但作为开发人员,不管是后台开发或是前台开发,都很有必要掌握它们. 在学习Http和Https的过程中,主要是参考了阮一峰老师的博客<阮一峰:HTTP ...

  9. MODBUS通讯协议和RS232以及RS485通讯协议有什么区别

    转载粘贴其他人的分析:

最新文章

  1. 入职阿里啦!java面试技巧之不要给自己挖坑实战干货
  2. Roman to Integer - LeetCode
  3. 工厂模式-CaffeNet训练
  4. BCB6代码格式化外挂
  5. a标签以post方式提交
  6. C++子类和父类,引用类和被引用类之间的顺序关系
  7. Oracle SQL查询,日期过滤条件要注意的一点
  8. Python深度学习入门笔记(一):使用Pandas从CSV格式的文件读取数据
  9. 在Unity中使用.Net Remoting实现双向通信
  10. python爬虫源码大全_python爬虫(附源码)
  11. python在线问卷调查系统_GitHub - imze/surveySystem: 问卷调查系统
  12. 跳一跳小游戏刷分解读
  13. 前度构建工具gulp
  14. 三维点云处理-chap1
  15. numpy.core._exceptions.UFuncTypeError: ufunc ‘add‘ did not contain a loop with signature matching ty
  16. 如何用arcgis修改栅格文件的波段数?
  17. 《人工智能》机器学习 - 第6章感知机模型(一 理论讲解)
  18. NSPredicate 模糊、精确、查询
  19. Socaverse正在推动体育文化成为Web3发展的新驱动力
  20. ubuntu日志文件管理

热门文章

  1. java.lang.Class:是反射的源头
  2. 程序员学英语:口语999句之(667-999句)
  3. 上大学究竟是来干什么的 为什么会这样
  4. 数据异动类问题分析-GMV下降
  5. java软件工程师简历项目经验pdf_java软件工程师简历中项目经验怎么写?
  6. 计算机软件的英文翻译,软件的英文翻译
  7. 北京理工大学计算机学院乔磊,余月_北京理工大学计算机学院
  8. 循环神经网络:LSTM
  9. 分析三大移动应用的发展趋势
  10. 【小组作业】电影院管理系统