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