如何使用NI-VISA來和USB裝置溝通


作者於LabVIEW360的ID為Ozzy,專長為LabVIEW、Bluetooth、RF measurement。目前任職於某外商電子業。

大家都知道VISA支援很多種的I/O介面 其中也包括USB, VISA支援的USB除了USB Instrument外 還支援所謂的USB Raw Mode, 也就是直接下底層的USB request到USB裝置, 而bypass了上層的USB軟體例如HID layer, mass stroage layer等, 這樣的作法可以在不需要該USB的驅動程式情形下就能與該USB裝置溝通, 缺點就是由於屬於非常底層的I/O, 因此必須非常瞭解該裝置的USB command, 當然如果你自己就是該USB裝置的韌體開發者, 一定是很瞭解這些USB command了, 我貼一些圖讓大家看一下, 如何讓NI-VISA與USB裝置溝通(以Logitech的Dual Action Gamepad為例)

上圖這是原本在裝置管理員裡看到的情形, 這隻gamepad屬於HID device


這裡可以看到這個USB device的VID(Vendor ID)與PID(Product ID), 記得抄起來, 等等會用到


VISA裡有一個工具程式 “VISA Driver Development Wizard”, 執行它

選擇USB介面

將剛剛記下來的VID和PID填上去, 至於Manufacturer Name與Model Name, 填啥都沒關係, 自己方便識別就好, 下面那個"This is a compound device…blah blah"的 是因為有的USB 裝置是包含兩個DEVICE在內, 例如Logitech的webcam很多都是包含WEBCAM與Mic的, 如果是這樣這邊應該勾起來, 不過我還沒試過這樣的裝置, 我在這隻gamepad上勾了這個選項反而會有問題, 先不勾起來

Prefix也是填自己好記就好, 填好Prefix程式會自動決定待會生出來的driver要放在那裡

就按"是"吧

直接選第一項, 程式會幫你把生出來的driver給安裝到電腦裡

安裝過後本來屬於人性化介面裝置的Gamepad不見了, 多出一個裝置類別叫做NI-VISA USB Device, 那個Outback就是Gamepad套上我們剛剛生出來的driver

經過這樣處理後, NI MAX就認得到這個USB裝置了

可以替這個裝置取個VISA Alias, 等等可以看到為何這麼做

這是VISA Test Panel的畫面, 可以看到USB devuce正確地回應Get Descriptor命令, 接下來, 要試試在LabVIEW裡該怎麼做了

先搜尋一下VISA List, 看看USB device能不能被LabVIEW找到

果然有 就是第一個 “USB0::0x046D::0xC216::NI-VISA-0::RAW” 最後三個字"RAW"代表這是一個USB RAW device

這裡就可以看到剛剛為何在MAX裡要設定VISA Alias, 這比"USB0::0x046D::0xC216::NI-VISA-0::RAW"要好記多了

記得也要把這個VISA Resource Name設定成USB Raw唷

VISA提供了與USB RAW device 溝通的專用VI, VISA USB Control In與VISA USB Control Out

來實際寫個小程式看看吧 , 先Open VISA Session, 然後下Get Descriptor的request並讀取回應, 這個程式跟剛剛VISA Test Panel做的是一樣的事情

因為這樣傳回來的事實上是HEX字串, LabVIEW會很雞婆的把它都轉成數字並且變成陣列(實在很討厭), 不過也是成功的讀取了, 接下來就是把這些數字變成ASCII或轉回HEX字串的功夫了

這樣的應用適用在測試USB裝置時, 我想也只有在生產測試才會有需要用到這些很低層的USB request, 這樣作法卻非常的powerful, 但是有個缺點, 套上NI-VISA USB的USB裝置, 就不是該DEVICE原來屬於的類別了, 以本例來說, 原本是屬於一個HID class的gamepad, 會變成一個不再是HID class的USB裝置, 在Windows控制台裡的"遊戲控制器"就看不到這個gamepad了, 所以在比較屬於End-User Function的應用上就不太適用

最後要說明的就是如何移除我們透過NI-VISA生出來的USB driver, 其實很簡單, 先在裝置管理員裡 把這個裝置移除, 然後把windows目錄下有個INF隱藏目錄裡對應的driver砍掉(在本例裡,是Outback.inf和Outback.PNF兩個檔案), 之後再把裝置插回去電腦就會把它認成它該有的樣子了, 至於在C:\VXIPNP\WINNT\目錄下的driver, 就可以留下來, 下次需要時在套上去, 不需要每次都跑VISA driver development wizard了

一點小心得 貢獻出來供大家參考