论文部分内容阅读
引言
本文介绍如何利用安卓Android?智能手机上的USB口与从设备通信,而无需计算机系统。文中给出的例子使用Android手机上的USB端口通过1-Wire?总线与Thermochron? iButton?温度记录器通信。
系统布局
这种应用的关键是智能手机上的USB接口。当智能手机使用USB OTG收发器时,那么就可利用其作USB主设备来管理其他USB从设备,例如麦克风、闪存、键盘,或者本例中的Thermochron。最新版本的Android应用程序接口(API)支持USB在应用层为主的模式。该功能使用户能够安装与USB外设“对话”的应用程序,无需刷机(Root)或在用户的智能手机上安装特殊驱动。
系统方框图如图1所示。Android智能手机必须使用USB OTG收发器。一般情况下,电话连接至计算机是作为USB从设备,但USB OTG收发器允许将其转换为USB主设备。这种角色转换要求特殊的OTG电缆提供A型USB端口,并指示USB从机已连接至智能手机。
该应用为主/从系统,Android智能手机作为主机,Thermochron数据记录器作为从机。系统采用一个USB和一个1-Wire/iButton适配器把智能手机和数据记录器桥接起来。利用网线中的一根数据线和接头作为1-Wire总线。数据记录器为iButton Termochron。
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适配器和Termochron代替。
本项目以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[] bufer, 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)
以下为发送至Thermochron的转换温度命令(0x44)。在第1行中,如上所述(表1),首先由控制传输发送1-Wire复位。这是1-Wire Reset、Match ROM及转换温度序列。
// 1-Wire Reset
1 conn.controlTransfer(0x40, 0x01, 0x0C4B, 0x0001, null, 0x0000, 0);
// Match ROM, where romid is the iButon’s registration number
2 romid = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
3 conn.bulkTransfer(epOUT, romid, 8, 0);
4 conn.controlTransfer(0x40, 0x01, 0x0065, 0x55, null, 0, 0);
// Convert Temperature for DS1921G
5 data = new byte[]{0x44};
6 conn.bulkTransfer(epOUT, data, data.length, 0);
7 conn.controlTransfer(0x40, 0x01, 0x1075, data.length, null, 0, 0);
上面第4行中,匹配访问传输控制发送一个1-Wire Reset,0x55,匹配访问ROM命令在1-Wire总线上,接着是相应从机的ROM编号2。检索参数设置为0x55。这个匹配访问命令希望用户把编号预装载至epOUT,如第2行和第3行代码所示。函数参数的说明请参考DS2490数据资料。
Termochron的数据资料将0x44作为开始温度转换的代码。表2. 温度转换命令0x44的写通过I/O块操作来执行。I/O块功能是向epOUT写输出数据,如上面第6行代码所示。然后第7行为控制传输为执行I/O块命令。
以下代码为利用USB的 I/O模块读取温度寄存器数据的步骤。Thermochron读存储器的命令码为0xF0(见表2)。在此之后为目标寄存器地址(TA) 为0x0211,只读,分为两个字节(第8行)。由于1-Wire总线只有单根数据线,所以总线上写及发送的数据将全部环回到主机。然后主机需要向总线写假数据(0xf)。如之前所述,由于1-Wire为开漏总线,所以从机将对0xff进行响应并修改该数据。最终效果就是数据和0xf的“与”的结果。
这些命令被送至epOUT,传输控制函数将执行发送至1-Wire总线的命令 (第9行和第10行)。读回的数据将位于USB端点epIN,利用第12行的批传输命令复制到tempdata。然后在第13行中,将最终的原始温度编码转换为对应的温度值。
// 1-Wire Reset and Match ROM
// (omited) ...
// Read Temperature Register/ Memory Command
// Read Memory, TA2, TA1, dummy data
8 command = new byte[]{(byte)0xf0, 0x11, 0x02, (byte)0xff,(byte)0xf};
9 conn.bulkTransfer(epOUT, command, command.length, 0);
10 conn.controlTransfer(0x40, 0x01, 0x1075, command.length, null, 0, 0);
// Return Data from input endpoint
11 byte[] tempdata = new byte[5];
12 conn.bulkTransfer(epIN, tempdata, 5, 0);
// Temperature calculation
13 t e m p e r a t u r e = ( i n t )(tempdata[4] & 0xf)/2.0 – 40;
结论
本示例的应用程序代码采用Eclipse编写,可供下载。提供所有的文件,源代码查看和修改容易。这个程序的代码利用抽象函数间接使用底层的USB命令。本文最后的一般性参考有助于理解Android USB API和1-Wire命令。这些资源开发类似的产品广泛使用。经过适当的修改,可使该应用程序支持其它5V 1-Wire从设,例如存储器,或支持附加iButton特性。可定制的选项很多,最终取决于设计者的系统要求。
参考文献:
[1]Android API, Package Index, http://developer.android.com/ reference/packages.html
[2]Using Android in Industrial Automation, Android USB Host+ Arduino, http://android.serverbox.ch/?p=549.
[3]Maxim Integrated iButton:1-Wire Public Domain Kit, http:// www.maximintegrated.com/products/ibutton/software/1wire/ wirekit.cfm.
[4]Maxim Integrated应用笔记187:《1-Wire Search Algorithm》,http://www.maximintegrated.com/an187。
[5]DS2490 USB至1-Wire桥接芯片的数据资料:http://www. maximintegrated.com/ds2490。
[6]DS9490R USB至1-Wire/iButton适配器的数据资料:http:// www.maximintegrated.com/ds9490r。
[7]DS1921G Thermochron iButton的数据资料:http://www. maximintegrated.com/ds1921g。
Android是Google Inc的注册商标。
Arduino是Arduino, LLC的注册商标。
1-Wire、iButton和Thermochron是Maxim Integrated Products, Inc的注册商标,Hygrochron是Maxim Integrated Products, Inc的商标。
本文介绍如何利用安卓Android?智能手机上的USB口与从设备通信,而无需计算机系统。文中给出的例子使用Android手机上的USB端口通过1-Wire?总线与Thermochron? iButton?温度记录器通信。
系统布局
这种应用的关键是智能手机上的USB接口。当智能手机使用USB OTG收发器时,那么就可利用其作USB主设备来管理其他USB从设备,例如麦克风、闪存、键盘,或者本例中的Thermochron。最新版本的Android应用程序接口(API)支持USB在应用层为主的模式。该功能使用户能够安装与USB外设“对话”的应用程序,无需刷机(Root)或在用户的智能手机上安装特殊驱动。
系统方框图如图1所示。Android智能手机必须使用USB OTG收发器。一般情况下,电话连接至计算机是作为USB从设备,但USB OTG收发器允许将其转换为USB主设备。这种角色转换要求特殊的OTG电缆提供A型USB端口,并指示USB从机已连接至智能手机。
该应用为主/从系统,Android智能手机作为主机,Thermochron数据记录器作为从机。系统采用一个USB和一个1-Wire/iButton适配器把智能手机和数据记录器桥接起来。利用网线中的一根数据线和接头作为1-Wire总线。数据记录器为iButton Termochron。
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适配器和Termochron代替。
本项目以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[] bufer, 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)
以下为发送至Thermochron的转换温度命令(0x44)。在第1行中,如上所述(表1),首先由控制传输发送1-Wire复位。这是1-Wire Reset、Match ROM及转换温度序列。
// 1-Wire Reset
1 conn.controlTransfer(0x40, 0x01, 0x0C4B, 0x0001, null, 0x0000, 0);
// Match ROM, where romid is the iButon’s registration number
2 romid = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
3 conn.bulkTransfer(epOUT, romid, 8, 0);
4 conn.controlTransfer(0x40, 0x01, 0x0065, 0x55, null, 0, 0);
// Convert Temperature for DS1921G
5 data = new byte[]{0x44};
6 conn.bulkTransfer(epOUT, data, data.length, 0);
7 conn.controlTransfer(0x40, 0x01, 0x1075, data.length, null, 0, 0);
上面第4行中,匹配访问传输控制发送一个1-Wire Reset,0x55,匹配访问ROM命令在1-Wire总线上,接着是相应从机的ROM编号2。检索参数设置为0x55。这个匹配访问命令希望用户把编号预装载至epOUT,如第2行和第3行代码所示。函数参数的说明请参考DS2490数据资料。
Termochron的数据资料将0x44作为开始温度转换的代码。表2. 温度转换命令0x44的写通过I/O块操作来执行。I/O块功能是向epOUT写输出数据,如上面第6行代码所示。然后第7行为控制传输为执行I/O块命令。
以下代码为利用USB的 I/O模块读取温度寄存器数据的步骤。Thermochron读存储器的命令码为0xF0(见表2)。在此之后为目标寄存器地址(TA) 为0x0211,只读,分为两个字节(第8行)。由于1-Wire总线只有单根数据线,所以总线上写及发送的数据将全部环回到主机。然后主机需要向总线写假数据(0xf)。如之前所述,由于1-Wire为开漏总线,所以从机将对0xff进行响应并修改该数据。最终效果就是数据和0xf的“与”的结果。
这些命令被送至epOUT,传输控制函数将执行发送至1-Wire总线的命令 (第9行和第10行)。读回的数据将位于USB端点epIN,利用第12行的批传输命令复制到tempdata。然后在第13行中,将最终的原始温度编码转换为对应的温度值。
// 1-Wire Reset and Match ROM
// (omited) ...
// Read Temperature Register/ Memory Command
// Read Memory, TA2, TA1, dummy data
8 command = new byte[]{(byte)0xf0, 0x11, 0x02, (byte)0xff,(byte)0xf};
9 conn.bulkTransfer(epOUT, command, command.length, 0);
10 conn.controlTransfer(0x40, 0x01, 0x1075, command.length, null, 0, 0);
// Return Data from input endpoint
11 byte[] tempdata = new byte[5];
12 conn.bulkTransfer(epIN, tempdata, 5, 0);
// Temperature calculation
13 t e m p e r a t u r e = ( i n t )(tempdata[4] & 0xf)/2.0 – 40;
结论
本示例的应用程序代码采用Eclipse编写,可供下载。提供所有的文件,源代码查看和修改容易。这个程序的代码利用抽象函数间接使用底层的USB命令。本文最后的一般性参考有助于理解Android USB API和1-Wire命令。这些资源开发类似的产品广泛使用。经过适当的修改,可使该应用程序支持其它5V 1-Wire从设,例如存储器,或支持附加iButton特性。可定制的选项很多,最终取决于设计者的系统要求。
参考文献:
[1]Android API, Package Index, http://developer.android.com/ reference/packages.html
[2]Using Android in Industrial Automation, Android USB Host+ Arduino, http://android.serverbox.ch/?p=549.
[3]Maxim Integrated iButton:1-Wire Public Domain Kit, http:// www.maximintegrated.com/products/ibutton/software/1wire/ wirekit.cfm.
[4]Maxim Integrated应用笔记187:《1-Wire Search Algorithm》,http://www.maximintegrated.com/an187。
[5]DS2490 USB至1-Wire桥接芯片的数据资料:http://www. maximintegrated.com/ds2490。
[6]DS9490R USB至1-Wire/iButton适配器的数据资料:http:// www.maximintegrated.com/ds9490r。
[7]DS1921G Thermochron iButton的数据资料:http://www. maximintegrated.com/ds1921g。
Android是Google Inc的注册商标。
Arduino是Arduino, LLC的注册商标。
1-Wire、iButton和Thermochron是Maxim Integrated Products, Inc的注册商标,Hygrochron是Maxim Integrated Products, Inc的商标。