本應(yīng)用筆記詳細介紹了如何連接DS9490R、溫度記錄儀iButton器件和Android的USB On-the-Go(OTG)。審查每個部分之間的通信協(xié)議。我們回顧數(shù)據(jù)手冊信息以及如何將其應(yīng)用于終端系統(tǒng)。演示示例代碼的示例 Android 應(yīng)用程序也可供下載。
介紹
睤。智能手機無處不在。智能手機不僅僅是一部電話,而是一臺功能強大的計算機,可以放在口袋里。由于智能手機中可用的計算能力和傳感器不斷增加,現(xiàn)在使用該手機作為其他設(shè)備的接口是切實可行的。本文介紹如何使用 Android 智能手機上的 USB 端口與沒有計算機系統(tǒng)的從屬設(shè)備進行通信。此處的示例使用1-Wire總線通過USB從Android到Thermochron iButton溫度記錄器進行通信。????
系統(tǒng)布局
此應(yīng)用程序的關(guān)鍵是智能手機上的USB端口。當智能手機使用USB移動(OTG)收發(fā)器時,USB主機功能可以通過其他從設(shè)備實現(xiàn),例如鼠標,閃存驅(qū)動器,鍵盤或此處的Thermochron。最新版本的 Android 應(yīng)用程序編程接口 (API) 在應(yīng)用程序級別支持 USB 主機模式。此功能允許最終用戶安裝與 USB 外圍設(shè)備“對話”的應(yīng)用程序,而無需在用戶的智能手機上生根或安裝特殊驅(qū)動程序。
系統(tǒng)框圖如圖1所示。安卓智能手機必須使用 USB OTG 收發(fā)器。通常,手機連接到計算機并充當USB從站,但USB OTG收發(fā)器允許將手機轉(zhuǎn)換為USB主站。這種角色轉(zhuǎn)換需要一根特殊的OTG電纜來提供USB A型端口,并發(fā)出USB從站連接到智能手機的信號。
此應(yīng)用程序是一個主從系統(tǒng),以Android智能手機為主,Thermochron數(shù)據(jù)記錄器作為從機。系統(tǒng)使用USB轉(zhuǎn)1線/iButton(DS9490R)適配器將智能手機與數(shù)據(jù)記錄器橋接。使用網(wǎng)絡(luò)電纜/插座DS1402D-DR8作為1-Wire總線,只需要一條數(shù)據(jù)線。數(shù)據(jù)記錄器是iButton溫度記錄器(DS1921G)。
圖1.系統(tǒng)框圖使用DS9490R 1-Wire適配器作為智能手機和應(yīng)用器件之間的接口;DS1402D-DR8總線電纜連接到應(yīng)用器件,此處為DS1921G溫度時線iButton。
1-Wire總線的重要作用
1-Wire總線是單主系統(tǒng)與多從系統(tǒng)之間的接口。1-Wire輸出為漏極開路,采用類似于I2C. 一些1-Wire從機可以由1-Wire總線寄生供電,當不發(fā)生通信時,該總線為從器件中的內(nèi)部電容器充電。每個1-Wire從器件還具有一個工廠光刻的、唯一的64位注冊號,因此每個從器件都可以在總線上輕松識別和監(jiān)控。
1-Wire交易序列(圖2)由復(fù)位脈沖(trst) 發(fā)送給奴隸。復(fù)位脈沖通過按住1-Wire總線預(yù)定的時間段,使所有從機進入已知狀態(tài)。接下來,從機通過存在檢測脈沖(tPD),在主站釋放總線后將其拉下。
圖2.1線時序圖。
復(fù)位后,從設(shè)備可以接受針對每個從設(shè)備的各種ROM命令,這些命令由其注冊號標識。匹配ROM的命令僅激活具有正確標識注冊的單個從設(shè)備。搜索ROM用于發(fā)現(xiàn)總線上所有從站的注冊號。因此,盡管我們在這里只顯示一個從器件,但該應(yīng)用可以有多個1-Wire兼容的從器件。
一旦選擇了特定的ROM命令,那么設(shè)備特定的命令就可以由主節(jié)點發(fā)出,在我們的例子中是Android。使用像Thermochron這樣的溫度記錄器作為從站,主機的命令可能涉及寫入或讀取其暫存器或存儲器,或轉(zhuǎn)換溫度。
1-Wire接口沒有時鐘線,因此通信被分成多個時隙(t槽),每個都攜帶一點信息。在時隙開始時,主站會短暫地拉下總線以指示位的開始。傳輸零點時,主站或從站繼續(xù)保持總線低電平。傳輸一個時,主站或從站釋放總線。主站或從站按規(guī)定的時間讀取總線(t樣本) 之后,母版指示時隙的開始。
與1線適配器的USB通信
DS9490R是1線轉(zhuǎn)USB適配器,具有四個USB端點:控制、中斷、批量輸入()和批量輸出()。通常,控制端點用于向1-Wire適配器發(fā)送命令并設(shè)置傳輸類型。批量輸入/輸出用于數(shù)據(jù)傳輸,中斷終結(jié)點用于接收狀態(tài)寄存器和返回消息等時間敏感信息。epINepOUT
使用安卓作為 USB 主機
這里提出的設(shè)計是有先例的。Android API 從版本 3.1 開始,支持 USB 主機模式。曼努埃爾·迪·塞爾博1通過USB將Arduino微控制器板與Android手機連接。我們的應(yīng)用修改了DiCerbo的工作,將基本概念擴展到DS9490R USB轉(zhuǎn)1-Wire適配器,并將1-Wire適配器與Thermochron配合使用,而不是微控制器。
DiCerbo示例代碼是該項目的基礎(chǔ)。該代碼首先請求用戶允許訪問連接到Android智能手機的USB設(shè)備。然后,程序搜索供應(yīng)商和設(shè)備 ID,并設(shè)置 USB 終結(jié)點以進行通信。該代碼提供 ,用于執(zhí)行批量和控制傳輸?shù)?USB 設(shè)備連接;它為批量輸入和 .這與所有系統(tǒng)用于初始化USB并將低級USB命令寫入從站的基本設(shè)置相同。
現(xiàn)在我們將演示如何使用Android在溫度上執(zhí)行溫度轉(zhuǎn)換并讀取溫度結(jié)果。每個事務(wù)步驟(表 1)都以 開頭,后跟選擇從設(shè)備,然后是最終特定于設(shè)備的命令。
表 1.1-Wire主機對溫度數(shù)據(jù)記錄器執(zhí)行的命令
1線復(fù)位 | 匹配光盤 | 轉(zhuǎn)換溫度 |
1線復(fù)位 | 匹配光盤 | 讀存儲器/寄存器 |
1-Wire復(fù)位通過USB控制傳輸執(zhí)行,Android API的控制傳遞函數(shù)原型如下所示。
// 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)
控制傳輸用于啟動 、 或 。參數(shù)在數(shù)據(jù)手冊中描述。稍后,我們將說明如何使用此函數(shù)。
批量傳輸用于讀/寫內(nèi)存。這里的端點將是 或 ,取決于我們是讀取數(shù)據(jù)還是寫入數(shù)據(jù)。終結(jié)點緩沖區(qū)存儲要發(fā)送的數(shù)據(jù),或者為空以存儲接收的數(shù)據(jù)。長度是接收或發(fā)送的字節(jié)數(shù)。超時是以毫秒為單位的 USB 超時設(shè)置。
// Performs a bulk transaction on the given endpoint. int bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)
此處顯示了將轉(zhuǎn)換溫度命令 (0x44) 發(fā)送到溫度時線的代碼。如前所述,第一行1-Wire復(fù)位通過控制傳輸發(fā)送(表1)。這是 、 ,它轉(zhuǎn)換溫度序列。
// 1-Wire Reset 1 conn.controlTransfer(0x40, 0x01, 0x0C4B, 0x0001, null, 0x0000, 0); // Match ROM, where romid is the iButton'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行中,匹配訪問控制傳輸在0-Wire總線上發(fā)送一個、55x1、匹配訪問ROM命令,后跟所需從站的ROM注冊號。1-Wire Reset2索引參數(shù)設(shè)置為 0x55。match 訪問命令要求用戶將注冊號預(yù)加載到 ,如代碼的第 2 行和第 3 行所示。功能參數(shù)在DS2490數(shù)據(jù)資料中描述。
溫度小時管的數(shù)據(jù)表將0x44標識為開始溫度轉(zhuǎn)換的代碼。(表2)。轉(zhuǎn)換溫度命令通過使用塊 I/O 操作寫入0x44來執(zhí)行。對于塊 I/O 操作,將輸出數(shù)據(jù)寫入,如上面的第 6 行所示。然后,第 7 行中的控制傳輸執(zhí)行塊 I/O 命令。epOUT
表 2.溫度存儲器和控制命令(使用批量 I/O)
內(nèi)存/控制命令 | 命令代碼 | 描述 |
---|---|---|
讀內(nèi)存 | 0xF0 | 從內(nèi)部寄存器讀取數(shù)據(jù)。按照寄存器地址的命令進行操作,首先使用 LSb。繼續(xù)為每個字節(jié)讀取0xff虛擬數(shù)據(jù)。 |
轉(zhuǎn)換溫度 | 0x44 | 開始溫度轉(zhuǎn)換。 |
下面的代碼顯示了通過USB批量I/O傳輸讀取溫度寄存器數(shù)據(jù)的順序。溫度時線的讀取存儲器命令代碼0xF0(請參閱表 2)。接下來是 0x0211 的目標寄存器地址 (TA),該地址具有只讀訪問權(quán)限,并分為兩個字節(jié)(第 8 行)。在1-Wire總線上寫入和發(fā)送的數(shù)據(jù)全部環(huán)回主機,因為總線僅由一根線組成。然后,主站需要將虛擬數(shù)據(jù)(0xff)寫入總線。從機響應(yīng)并覆蓋0xff數(shù)據(jù),因為如前所述,1-Wire是一條漏極開路總線。凈效應(yīng)是數(shù)據(jù)與0xff的 AND。
這一系列命令被放到1-Wire總線(第9行和第10行)上,控制傳輸通過發(fā)送命令來執(zhí)行命令?;刈x數(shù)據(jù)位于 USB 終結(jié)點 中。這是在第 12 行的批量傳輸命令復(fù)制到的。然后將生成的原始溫度代碼轉(zhuǎn)換為第 13 行的相應(yīng)溫度值。epOUTepINtempdata
// 1-Wire Reset and Match ROM // (omitted) ... // Read Temperature Register/Memory Command // Read Memory, TA2, TA1, dummy data 8 command = new byte[] {(byte)0xf0, 0x11, 0x02, (byte)0xff, (byte)0xff}; 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 temperature = (int)(tempdata[4] & 0xff)/2.0 – 40;
我們的安卓應(yīng)用程序示例
示例 Android 應(yīng)用程序如圖 3 所示。當用戶運行程序并按“枚舉”按鈕時,將顯示一個屏幕,詢問訪問 USB 設(shè)備的權(quán)限。用戶點擊確定后,應(yīng)用程序?qū)?zhí)行搜索并在下拉菜單中列出所有從站的64位注冊號。當用戶選擇特定的注冊號時,應(yīng)用程序?qū)?zhí)行上述例程,并顯示來自溫度時線的實時溫度。枚舉按鈕和注冊號的選擇連接到生成一個 .這些任務(wù)是完成請求的操作并在完成后更新用戶界面 (UI) 的線程。這些任務(wù)不會在 UI 線程中執(zhí)行,以防止它在等待 iButton 響應(yīng)時凍結(jié)。
在最終應(yīng)用中,代碼被抽象為一般的1-Wire操作,如、、、、和。此外,這些命令一起可以進一步抽象為 iButton 函數(shù),例如 和 。這允許調(diào)用正確的函數(shù)。
圖3.Android 應(yīng)用程序,USB 權(quán)限(左)。特定溫度時線iButton的溫度測量由其注冊號(右)標識。
示例應(yīng)用包含用于將用戶交互(如按下按鈕)鏈接到1-Wire從機執(zhí)行命令的UI代碼。除DS1921G溫度時線外,該應(yīng)用還支持iButton溫度記錄儀(DS1922L/DS1922T)和iButton濕度記錄器(DS1923)。如圖3所示,每個器件的注冊號分為三個字段:家族代碼、序列號和循環(huán)冗余校驗(CRC)??梢詮拿總€注冊號讀取家族代碼,以確定確切的設(shè)備型號。
結(jié)論
此示例應(yīng)用程序的代碼是使用 Eclipse 編程的,可供下載。訪問整個項目文件后,可以輕松瀏覽和修改源代碼。項目代碼使用抽象函數(shù)間接使用低級 USB 命令。本文末尾的一般參考資料有助于理解Android USB API和1-Wire命令。這些資源廣泛用于開發(fā)此示例應(yīng)用程序。可能的修改可能會改變應(yīng)用,使其可與其他5V 1-Wire從器件(如存儲器)配合使用,或啟用其他iButton功能??啥ㄖ频倪x項很多,最終結(jié)果取決于設(shè)計人員的系統(tǒng)要求。
審核編輯:郭婷
-
智能手機
+關(guān)注
關(guān)注
66文章
18477瀏覽量
180107 -
usb
+關(guān)注
關(guān)注
60文章
7936瀏覽量
264474 -
適配器
+關(guān)注
關(guān)注
8文章
1951瀏覽量
67997
發(fā)布評論請先 登錄
相關(guān)推薦
評論