上回我們有提到關於PC based 的邏輯分析儀的一些觀念,
(http://chamberplus.blogspot.com/2007/09/usb-controller.html)
這個想法就是來自人家的一本書,當然,在該書中所提到的介面,還是用傳統的RS232。
而對認識版主的人來說:當然不可能還在用這種傳統介面,我們要講的就是USB 啊。
上回我也有提到:在使用USB當傳輸介面時,雖然速度會比傳統的RS232來的快。
但是,在先天上,USB介面會碰到一個比較「棘手」的問題是:
您不知道您所使用的USB Port 上還會不會有人跟您搶傳輸頻寬?!
這對於一些要號稱取樣率很高的PC based 儀器設備來說:可能是另一種挑戰。
我們今天就來作個簡單的實驗。來看一下實際的情形。
首先我們找來一台國產很平價的PC Based 的邏輯分析儀(LA, Logic analyzer)。
至於是哪一家品牌的?我想各位看倌,如果您有用過的,應該就會有印象吧。
這台LA 是屬於16 channels 的邏輯分析儀....規格上的取樣率是:200MHz~100Hz 。
(關於這一部份我上回有提過:就算您有很高的取樣率,但若您USB 頻寬搶不到的話...
您可能會有取樣結果的資料傳不出去的危險!)
在實驗上,我們就讓這一台LA隨時一直在抓資料,我們來攔截USB Bus的資料來分析結果。
而在所有的取樣Channel 上,我們就設定:Channel 0 & 1及 Channel 15 為High !
我們來看結果如何?!
下圖我們從該PC 端的應用軟體來看:果然是如我們所預料。
當然,我們若用一般八位元的資料來看的話,他們就分別為0x03及0x80 的值。
--------
在看USB BUS上的資料之前,我們先來分析一下:若您要用USB 來抓這種即時資料時,
您該如何去控制USB BUS的開開關關呢?!因為其實USB BUS 對於上層的應用程式到驅動程式,
往往是:一發不可收拾啊,資料您沒收完,您的底層的驅動程式是很難放開的,讓您的應用程式
去處理資料的...這是USB在設計上為了取得高效能的傳輸因素。...
而對於這種儀器設備來說:又好像資料不能流失(Miss) !所以,人家會比較容易想到的方法
就是:Bulk 傳輸方式。但是Bulk 的傳輸方式,在傳輸的Handshake上是要講明每一筆傳輸資料的大小的!
所以,每一次的BULK的傳輸之前就必須利用Control Token 來下達傳輸命令的。
(當然,您也可以利用類似Mass Storage Device Class 的那種BOT(Bulk Only Transfer)的方式來處理命令)
但相對來說:USB Device 端的韌體就比較難處理,利用Control + Bulk 還是一般人比較容易處理的!)
所以,我們先得到一個基本USB 傳輸觀念了,我們再來看實際的傳輸情況:
首先,我們發現果然不出我們所料:就是利用Control Token 中的Vendor Control 命令來下達傳輸啟動介面。
所以啊,名義上雖然是即時(也就是無時無刻)的抓資料,但我們發現:其實,在USB的頻寬上是塞入一些Control Token 的,所以,一定會每隔一陣子,USB BUS上就會停下來一下下的。
至少,在這一個Control Token 的SOF 之間是一筆也沒傳出來。
(再跟各位複習一下:這一組抓到的資料就是OHCI的USB 南橋資料!所以,可以在一個SOF之間完成所有Control Token)。
從BULK的資料內容,我們也的確看到了 0x80這一組熟悉的數據內容。...
(或許您是有很好的工程Sense的人,您應該會開始有一些疑問了吧?!)
我們再來看另一組資料內容:
還是利用Control Token 來控制BULK的傳輸啟動機制。還是一樣會犧牲一點USB的頻寬。
我們也發現0x03 這個我們一開始所設定的測試條件之數據資料。
喔,原來,他們在所謂的 16 Channels 之MSB 與LSB的資料是分開分別傳給PC端的。
但我們不能說人家的機器是分別取樣的喔。否則鐵定會發生MSB 與LSB 不同步取樣的問題。
因為人家的機器裡是有Embedded 一些記憶體Buffer的。所以,USB Bus只不過是從這些記憶體的BUFFER中,把資料傳出而已吧了!
這一部份我們就先不追究,我們此次實驗的目的就要探討USB Bus 頻寬的問題。
好,我們接下來看:我們都知道:一般PC 南橋的USB是兩個PORT是共用一組南橋介面。
(好像這樣說有點不太對?!我們一般可以在下圖中發現一般PC主機板是有兩組ControlSet 的,
當您把USB 裝置插到另一組USB port時,可能會碰到另一個ControlSet,而此時作業系統會再跟您要驅動程式的!
所以,這一部份是南橋硬體與作業系統之間的設定,如果您們有很好的名詞解釋的話,
也歡迎回應說明!謝謝!)
當我們把一支簡單的滑鼠插在另一個USB 共用的PORT時,我們在USB Bus 上就發現了這個低速裝置的Handshake了。
如下圖所示:
這一個毫不起眼的低速裝置的差入會造成USB Bus 上怎樣的變化呢?!
沒錯,他就是會搶USB Bus 上傳輸的頻寬!而且很討厭的是:他不知道什麼時候會插入,
而且您的USB 裝置還不知道這件事哩!!
我們把整個SOF之間的資料列出來分析:(就在"2" 與 "3"之間插進這一個低速裝置PID)
而當沒有插入此一低速裝置的Handshake 時,又是如何?!
我們發現:這樣一個小小稀疏平常的低速裝置的資料,
竟然使得兩個SOF 之間的Bulk 傳輸量從 18 組變成了17 組。當場就少了一組。
一組就是64 Bytes ...就是64 個取樣數據資料被擠到下一個SOF才能再傳。神奇吧。
這也代表著這64 組取樣數據要多留在記憶體Buffer 中多待一下子...如果您前端的取樣數據一直進來的話,
就有可能會發生Overflow的問題風險。....
------
好了,若是您在USB PORT上面不是插入低速裝置,而是像大量資料的隨身碟時,
那個結果我想大家都可以想像的到了吧!所以,這種機器當然在訴求上就要強調他們記憶體Buffer 的深度啊。
不過,就我之前提過的:再深的記憶體終究還是可能面臨Overflow的可能性。
因為您永遠不知道您的客戶在使用USB介面時,他們會不會在USB Bus 上插入什麼USB 裝置?
---
從以上一個小小的實驗,我們大家可以體會得到:為什麼這種算是窮人版的LA為何比一般稍微專業一點LA便宜那麼多?!
因為在他們的使用上是有一些限制的。我可沒有說:這種機器是不能買的...
因為畢竟他在售價上是有很大的價差空間的...對於一些人來說:或許這樣的功能已經可以符合他多數的應用。
PS:我們只是純粹分析USB Bus上的傳輸頻寬而已,還沒考慮到上層應用程式端所有造成資料LAG的問題呢。
或許改用ISO Token 會比較好一點,但相對來說:也會有相對ISO Token的問題產生...
而相對來說 USB Controller 所扮演的USB 資料流控管來說,就相對很重要了...
當然,您不是什麼有名的儀器大廠,所以,人家的USB Controller 也不會為您量身訂作的...
更何況要幫您從韌體到驅動程式再到應用程式端...一路把任都二脈打通是很難的...
像這一家的這一台機器就是用國內某USB廠的Controller ...人家也是隨便從另一個產品線,
拿一個覺得大概可以給您用的一棵USB Controller 給您用的...巧的是:另一家相仿的公司也是用同一家的...
到底是誰抄誰的...我也不想去釐清...好玩的是:我剛好有認識這家USB Control廠的人員...
他們說:他們給這兩家的USB Controller 的確也都沒花什麼心思幫他們解決USB的問題...
結果,這兩家公司還可以在市場上殺得您死我活的呢!.....厲害吧...
----
後話:我看了全華的那本「基礎邏輯分析儀設計」以及這台市售的LA之後,我發現用我常用的那顆USB COntroller,要作這樣一台陽春型或學生版的LA 好像也不難喔...因為,我直接利用8051 對於外部Memory bus 的Access 信號來當作取樣Timing ...然後,讓USB Bus直接 Access 這些數據傳輸至PC 端...好像就完成了...
然後,我還有三組A/D...還可以當混合型的LA+示波器...看來還蠻好玩的!...
我看我來作一台實驗機來試試...因為最近Survey 了幾家大廠的混合型LA+示波器,價碼都不低...(Aglient..Lecroy..Tektronix..)
雖然我不需要很高的取樣率,但他們機器的起跳都是200~300 MHZ 的...然後價格也都不貲...都至少20 萬台幣起跳的!..
您說一般人,或是學生哪玩得起啊...
看來有空的時候,可以DIY的東西還蠻多的嘛!...就敬請期待吧...還是有興趣一起研究啊?!
可以跟版主聯絡啊...大家可以交個朋友....也謝謝您們的指教。