Android设备使用USB的硬件接口

usb主控的一个关键特点是能为usb装置(或从设备)供电,并提供了一个非常丰富的通信协议,支持传输相对大量的数据。然而,就协议处理的复杂性来说对工程师来说总有一定的缺陷,尤其是在装置端。
主要的障碍是, 如果工程师想要实现他们自己的固件,不同的半导体供应商提供的微处理器的应用程序接口(api) 会有些变化。为解决这一问题主要有两个办法可以采用:
1. 在设备端使用有点像硬件状态机的微处理器。但是这样做需要大量的工程资源。
2. 使用usb-串行转换器,此方案可提供usb底层相关的协议,从而降低usb主控端和设备端的软件实现的复杂度。这可能对工程师们更加可行,尤其是对那些在android操作系统或android usb应用程序接口经验少或者没有经验的工程师。
在本文中, 提供了第二个方法使用usb串行转换器的例子。例子中的参考代码,是针对使用ftdi vinculum-ii (vnc2) usb主控端ic所设计,但是,它也可以用于其它控制器工作。
通过android控制
android发布了一整套api给开发者实现自己的应用并且提供usb通讯的能力。然而,目前为止只有一小部分android平板提供全面的usb主控接口连接。由于这一限制, 谷歌开发了一个api用于android通过usb设备端口与外部usb通信。这被称为android开放访问开发套件(adk)。尽管这里提到api, 意味着与运行android 的设备通信的方法,设计师仍然需要意识到一系列的关键问题:
1. 外部设备必须自己供电,并需要作为android 硬件的usb主控端。比如,android开放访问框架的一个潜在应用就是基于android的便携设备和一些健身设备之间的互动--因此用户可以将他们的心率,卡路里消耗等的数据传输到便携设备上用于分析或与以往观测的统计数据比较。显然便携设备能够给跑步机之类的东西供电。不同於以前的应用场景,当pc连接一个鼠标之类的串行设备时,此设备也必需提供电源。
2. 目前能够作为主控端的设备不是很多。尤其是,大多数智能手机模块仍然缺少usb主控连接性能。将来会有更多的智能手机使用usb otg (比如新发布的三星galaxy nexus),这将允许基于android系统控制各种家用消费电子。比如,使用智能电话当做游戏控制器或控制智能家居产品。
应用实例
便携设备时常要做的一件事情是通过android开放附件框架来控制各种形式的电子马达。并用简单的方式管理方向和速度等资料。这里将通过一个简单有趣的例子进一步理解这些原理,这个范例使用平板电脑操控玩具赛车展示android的功能。
创建一个基于android的控制系统所需要的部件如下(相应的原理框图如图1所示)。在这个例子中,提供了玩具赛车范例的具体细节(图2进一步指示)。
1. 一个能提供遥控功能应用的android平板(这同样能应用到控制任何其它硬件元件如马达,泵等)。在这个例子中,采用acer a500 android平板电脑(运行android3.2)。
2. 一个通过usb连线与平板连接的微处理器,用作usb设备。为简化固件在设备端使用usb转串行驱动器。这个例子中指定使用ftdi vinco开发板,具有双通道usb 主/从设备控制器功能。
3. 通过gpio,pwm, i2c和spi接口控制的用户硬件组件。本例中,是通过gpio接口执行无线遥控。
代码创建
控制玩具车的用户接口相当的简化。在平板电脑的触摸屏上出现两个按钮,一个用于将车子向前移动,另一个用于向后移动。通过相应旋转平板电脑实现左右移动车子。无限控制信号可以被拆成字节串行传输。比如,字节0x01用于右转,0x08是向前。同样,两个值的组合0x09使车子右转且向前。
不需要为此应用编译一个专用的android核,也不需要绕过厂商默认的登陆权限来登陆平板电脑。他们所需要的只是安装android应用程序[http://www.nexus-computing.ch/files/racer.apk],然后通过usb 接口插入vinco板。android平板和vinculum ii之间的连接,是使用新发布的android usb 主控api来维护的。android上的java软件与使用usb 批量和控制传输的微处理器交互,因此是一个软的usb 转串行驱动器。微控制器的固件被设为通过usb转串行驱动与平板电脑接口,它接收单个字节,将相应的无线摇控管脚拉低,最终控制玩具车。
下面几行的java代码用于初始化串行通信:
usbdeviceconnection conn = usbm.opendevice(dev);
conn.controltransfer(0x40, 0, 0, 0, null, 0, 0);// reset
conn.controltransfer(0x40, 0, 1, 0, null, 0, 0);// clear rx
conn.controltransfer(0x40, 0, 2, 0, null, 0, 0);// clear tx
conn.controltransfer(0x40, 0x03, 0x4138, 0, null, 0, 0);// set baudrate 9600
这些代码与libftdi函数非常类似:
int ftdi_usb_reset(struct ftdi_context *ftdi)
int ftdi_usb_purge_rx_buffer(struct ftdi_context *ftdi)
int ftdi_usb_purge_tx_buffer(struct ftdi_context *ftdi)
int ftdi_set_baudrate(struct ftdi_context *ftdi, int baudrate)
一旦连接被初始化,将通过android操作系统的usb api作类似的进一步的批量传输。
结论
本文讨论的应用范例说明,尽管存在一定的困难,还是能够通过usb 接口实现基于android的控制功能。运用android主控api结合合适的硬件和相关固件开发,只需要对android操作系统和差异之处有极少的了解,就可以创建出设想的应用。

中国在量子通信领域领先全球
超过4.19亿的Facebook用户ID电话信息被泄露,数据库已被删除
基于软件无线电技术和DSP实现基频发射机设计及CCS仿真
机器人产业飞速崛起带动底盘市场,国产企业该如何玩转市场
激光打印机系统构成
Android设备使用USB的硬件接口
电话机状态指示电路,Phone status indicators
华为王峰:IPv6+ 打造可信一张网
Ramtron推出最新铁电随机存取存储器(F-RAM) FM24C64C
谷歌新增来帮助用户验证搜索结果显示的功能
C语言头文件是做什么的
华为、宁德时代联手打造首款车型2021年推出,基于EMP2平台纯电SUV
改进微波发射器的设计
基因芯片:三大难题待解
区块链技术如何成为帮助解决环境问题的最佳助手?
从设计到生产看一颗SOC的诞生
基于ATMEGA8L单片机实现车载信息采集系统的应用方案
μModule数据采集解决方案缓解了各种精密应用的工程挑战
mems加速度计的量程是指什么
大陆面板厂发展迅速,和辉光电AMOLED面板宣布量产