新闻中心

EEPW首页 > 网络与存储 > 设计应用 > 利用Android智能手机及USB接口与1-Wire从设备通信

利用Android智能手机及USB接口与1-Wire从设备通信

作者:Wilson Tang时间:2014-05-04来源:电子产品世界收藏

  引言

本文引用地址:http://www.eepw.com.cn/article/246299.htm

  本文介绍如何利用安卓®智能手机上的USB口与从设备通信,而无需计算机系统。文中给出的例子使用手机上的USB端口通过®总线与® iButton®温度记录器通信。

  系统布局

  这种应用的关键是智能手机上的USB接口。当智能手机使用USB OTG时,那么就可利用其作USB主设备来管理其他USB从设备,例如麦克风、闪存、键盘,或者本例中的。最新版本的应用程序接口(API)支持USB在应用层为主的模式。该功能使用户能够安装与USB外设“对话”的应用程序,无需刷机(Root)或在用户的智能手机上安装特殊驱动。

  系统方框图如图1所示。Android智能手机必须使用USB OTG。一般情况下,电话连接至计算机是作为USB从设备,但USB OTG允许将其转换为USB主设备。这种角色转换要求特殊的OTG电缆提供A型USB端口,并指示USB从机已连接至智能手机。

  该应用为主/从系统,Android智能手机作为主机,数据记录器作为从机。系统采用一个USB和一个/iButton把智能手机和数据记录器桥接起来。利用网线中的一根数据线和接头作为总线。数据记录器为iButton Thermochron。

  1-Wire总线的重要角色

  1-Wire总线是单主和多从系统之间的接口。1-Wire为开漏输出,采用类似于I2C的上拉电阻工作。有些1-Wire从机可利用1-Wire总线进行寄生供电,在总线不通信时对从器件中的内部电容充电。每个1-Wire从机也具有工厂激光刻制的唯一64位编号,所以很容易识别和监测总线上的从机。

  1-Wire传输时序(图2)包括一个给从机的复位脉冲(trst)。复位脉冲通将1-Wire总线拉低预定的时间周期,将全部从机置位成已知的确定状态。接着,从机在主机释放总线后,利用将总线拉低的在位检测脉冲(tpd)对主机进行应答。

  复位后,从器件根据唯一的自身编号,可接收发送至从机的各种ROM命令。命令Match ROM将只激活编号正确匹配的某个从器件。Search ROM命令用于检测总线上所有从机的编号。因此,尽管这里我们只介绍一个从机,但可应用于具有多个兼容的1-Wire从器件。

  在我们这个Android例子中,某个ROM命令只要选定,主机即可向每个具体的从设发送该命令。将诸如Thermochron这样的温度记录器作为从设备,主机的命令可能包括读/写其暂存器、存储器、或转换温度。

  1-Wire接口没有时钟线,所以通信分为时隙(tslot),每个时隙承载一个信息位。在时隙开始,主机将总线短暂拉低,预示数据位将开始。当传输的是一个0时,主机或从机会使总线继续保持为低电平;传输是一个1时,主机或从机将释放总线。主机或从机将在主机指示时隙开始后的规定时间(tsample)读取总线。

  USB与1-Wire通信

  DS9490R为1-Wire至USB,有四个USB端点:控制、中断、批输入(epIN)和批输出(epOUT)。通常,控制端用于向1-Wire适配器发送命令,以及配置传输类型;批输入/输出用于数据传输;中断端口接收实时敏感的信息,如状态寄存器的信息和返回的消息。

  用Android作为USB主设

  此处介绍的设计已有先例。Android API从3.1版开始支持USB主模式,Manuel Di Cerbo1曾通过USB将Arduino®微控制器板与Android电话连接在一起。我们的应用在DiCerbo的设计上进行修改,将基本概念扩展至USB至1-Wire适配器,并且微控制器用1-Wire适配器和Thermochron代替。

  本项目以DiCerbo的示例代码为基础。代码首先询问用户是否允许访问连接至Android智能手记的USB设备。然后程序查询制造商和设备ID,并设置用于通信的USB端点。代码提供给conn,用于批传输和控制传输的USB设备连接;配置用于批输入的USB端点epIN及epOUT。这和所有系统中USB初始化及向从机写底层USB命令使用的基本配置没什么区别。

  现在,我们演示如何利用Android去实现让Thermochron进行温度转换,并读取温度结果。每个步骤(表1)均以1-Wire复位开始,然后利用Match ROM命令选择从机,最后为给它的执行命令。

  由USB传输控制执行1-Wire复位,Android API的控制传输函数原代码如下所示。

  // Performs a control transaction on endpoint zero for this device.

  int controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)

  传输控制用于启动1-Wire Reset、Match ROM或Block I/O。参数说明请参见数据资料。随后,我们将介绍如何使用该函数。

  批数据传输用于Match ROM以及读/写存储器。此处,端点应为epIN或epOUT,取决于我们读数据还是写数据。端点缓冲器储存要发送的数据,或者为空以储存要接收来的数据,长度为接收或发送的字节数。超时为USB的超时设置,单位为毫秒。

  // Performs a bulk transaction on the given endpoint.

  int bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)

数字通信相关文章:数字通信原理


通信相关文章:通信原理


上拉电阻相关文章:上拉电阻原理

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭