非常扎實的系統開發能力,一個是引擎控制程式的撰寫,當然啊,這一部分不是我天生就會的
而是從國外的量產韌體程式學到的,沒有花俏的、疊床架屋的程式架構,卻在每一段程式裡
都隱含著系統物理理論與軟體程式方法的關聯性,讓你真的從"系統開發"角度去寫程式。
第二個當然就是USB 系統開發,這一部分當然就是從IC 設計業裡,很基礎的系統晶片開發,
除錯再到SOC 的第一套範例程式生成,也延伸到後來到單晶片MCU 的系統開發,也練就了
非常實用且務實的系統開發與設計能力,包括後來在機車ABS 系統測試系統中,能夠很快的
掌握一些國外設備或測試軟硬體的核心重點,對於學習許多新玩意,都能達到事半功倍的
效果。或許,這個就一個"資深工程師"所必須歷練的心路歷程吧。)
USB DIY 講座 (二) --- USB 特質
-------------------------------------------------------------------------------------------------------------------------
接下來,我繼續先說明有關USB 的基本認知,或許,您想作的東西,跟我的內容不是
很相稱,對不起,我也不知該如何滿足您,說真的, 技術的東西,怎麼講也講不完的,
也不可能涵蓋所有的東西,但我相信這些基本的概念,至少讓我做一些相關的東西時,
卻是得心應手 ,我不是很厲害,厲害的是訂出規格的人,用這樣一個簡單的規格,
卻能讓我們玩出這麼多花樣, 才是真正厲害的人。
所以,我常建議有理想有抱負的年輕人,您若有機會出去國外走走或甚至 唸書,
請不要客氣。可別只為了貪圖眼前的股票紅利喔。
---------------------------------------------------------------------------------------------------------------------------
特質三:USB 到底可以多快? (我才不要講規格的東西,眼見為憑!)
我們是工程師,講的事事求是的精神,上圖是一個 Bulk Out 傳輸內容,兩個SOF
(見下面特質6的說明)的間隔是 1mSec ,我們傳了 17 個 Packets ,所以是:
17x64 Bytes/1mSec = 1.088 MB/Sec = 8.704 Mbps <12 Mbps,為什麼會小於 12Mbps 呢?
因為在傳輸過程中,還要塞進 PID/ACK/CRC 等這些Token ,所以,以我們要傳的資料
內容來說,是不可能達到 12 Mbps 的。
您不要看我上面的傳輸的很漂亮,連一個NAK 都沒出現。您知道嗎?
只要您 USB Device 的 MCU (如8051 不管是12 T 或 4T) 只要有任何一點遲疑的話,
我指的是像去 Movx 一個Registers 時,就會塞進好幾個 NAK ,您傳輸的速度,
當場就會被拉下來,因為USB 的Protocol 是不等您的。
這樣您就會瞭解,人家說USB 控制器內的MCU 性能是一項很重要的關鍵了。
另外一點是,像我上圖的內容來說:Bulk out 是PC將資料往外傳,
如果您 USB Device 的 Data Buffer 不夠大的話,您也勢必要先對USB 喊暫停(回NAK),
再用MCU把資料移走或處理掉,否則,您又會對USB 這條高速公路造成塞車。
明顯的,除了USB 內的控制器的MCU 執行速度的快慢會影響USB 速度外,
您USB 控制器內的Buffer 容量也是一個重要關鍵。
所以,您不真的一味的聽信說:USB 2.0 很快。如果以我上述的問題關鍵
您視而不見的話,您還是開一台破車在一條筆直的戰備道上。
同理,若您的傳輸方向的Bulk In (PC跟您的 USB Device 要資料),您USB Device 的
資料若處理來不及給USB 來抓走的話,也是一樣。PC USB來問完就走了。
因為您一定得回NAK,叫他等一等,這樣子,您覺得您可以怪USB 太慢嗎?
--------------------------------------------------------------------------------------------------------------------
特質四:An Endpoint Is an addressable FIFO
<<>> USB Specification: a source or sink of data
<<<>>> CONTROL : endpoint is bi-directional
<<<>>> Others are uni-directional
<<>> Four address bits plus a direction bit selects between 32 buffers (FIFOs)
<<>> Different USB chips support
<<<>>> Various numbers of endpoints
<<<>>> Various buffer sizes
其實,每一個endpoint 您就把他想像成一個水管(在術語上他也是稱為Pipe),然後, 他每一個都有自己的方向與所指到的資料記憶體儲存空間。然後,在第一項中所指 的CONTROL pipe ,其實,在應用上就很好用了,我再想他大概就可以取代一部份 UART的功能了。我們不是喜歡透過 RS232 來下一些命令(甚至帶參數的), 然後,再讀一些外面周邊的一些回應嗎?,這個CONTROL pipe 因為是雙向的, 所以,就已經很夠用了。講一個您看規格可能看不到的東西:您知道嗎? 一次的 Control In 或Control out 最多可以傳 4KBytes (USB 1.1) 的資料。 以傳命令來說:夠大了吧。這個現象好像是作業系統底層的關係。 您可能要問一下Microsoft ~ 他大概也不會跟您講原因吧?! 另外是,因為每一個 Endpoint 在傳輸過程中,都會指向某一個記體體空間, 所以,我是認為Endpoint 夠用就好了,否則,是很浪費空間的。 Cypress 的USB 控制晶片,好像他的Endpoint 都不少,所以,他賣得貴不是沒道理的。 |
---------------------------------------------------------------------------------------------------------------------
<<>> Bulk: "巨量? 怪怪的翻譯"
<<<>>> Guaranteed accuracy , but delivery time is variable. 作Tools 介面最好了。"高速HID 也可以"
<<<>>> Best for "bursty" data
<<>> Isochronous: 。 相對"巨量"來說,這才是巨量。只不過,用"同步"比較傳神。
<<<>>> Guaranteed delivery time, but accuracy is not guaranteed. 這就是同步:像影音資料。稍縱即逝。
<<>> Control :
<<<>>> Enumeration and device control.簡單來說,就是下命令用的。(您也可以拿來傳資料。)
<<>> Interrupt:
<<<>>> Predictable polling time.低速用的,不過您可只為了這個功能犧牲掉您USB 的Performance。
(補充說明:在高速的HID 應用下,也可以視為簡易型的Control,至是他的通訊協定較簡化,如果沒有帶
Report ID 的話,使用條件容易受限。)
對於這四種傳輸方式來說,對一般人來說,應該還是主要是Control 及Bulk ,以相對
取代RS232 或Parallel 來說,也是這兩個。但許多人,不知是為了貪便宜呢?
還是真的不是很瞭解USB ,還真的常用Interrupt 。說真的,我們都知道,
所謂HID 或為了Polling 外面周邊像按鍵來說:除非就像鍵盤,笨得只是按鍵用。
否則,一般的應用還有許多功能,您可別忘了,USB Device 是要寫程式的,所以,
對鍵盤這種東西,我們還是會以傳統方式來Debounce 來讀鍵盤,然後,再將讀到
的擲回傳給主機。您想想:Setup Control token 至少每 3mSec 就會來一次,
您覺得用主機來作比較有效率呢?還是直接用Device 的單晶片來作比較好呢?!
另外,若是Isochronous 的傳輸來說,因為您在主機上還有一個很上層的應用程式,
您若軟體的功力不足的話,就算您USB 速度夠,您寫出來的應用程式,還會有所謂
影音不同步,或是像社會新聞中,那種定格監視器拍到的東西一樣,能看嗎?!
所以,以一般來說,我還是以大眾需求為主,講Control 及Bulk 就好了。若您要問我
其他的~抱歉!沒興趣。
(補充說明:HID 不是不能用,我後來也幾乎都是用高速的HID,只是HID 的宣告真的比較
複雜一點,這一部分真的需要比較多的經驗與實戰經驗才可以駕輕就熟。
當然啊~在HOST 端(就是PC 啦),他的軟體架構也略稍微不同,這一部分也都需要花額外的
時間與精力才能完全掌握系統開發的重點。)
---------------------------------------------------------------------------------------------
特質六:USB Transfers Occur in 1ms Frames (USB 1.1)
<<>> Host Sends "SOF" (Start of Frame) token every 1mSec . 這是鐵律!
<<>> Host schedules packets inside frames. 您一定要有這個觀念。
<<>> Isochronous data FIFOS "ping-pong" every SOF. 記住,這個東西是很會搶頻寬的。
(補充說明:這張圖是告訴你:在固定的兩個SOF 之間只有 1mS,如果在傳輸過程中,
有不同的傳輸模式,就是那四種顏色示意,越往左邊的東西,是越會搶頻寬的。
就是說它的傳輸優先順序是比較高的...)
從上圖,您就會很明瞭的發現了。注意喔,USB 裝置是串接的,當同一PORT上面接了
這幾種傳輸介面時,是會搶頻寬的。就可憐的就是Bulk ,撿人家剩下的。
這是由主機決定的。但在早期還分OHCI 及UHCI 兩大陣營時,現象是有一點不太一樣,
但基本觀念是一樣的。(註:所謂OHCI 指的是主機板南橋規格:像ALI 及SIS 就是;
而UHCI指的就是INTEL及VIA 南橋晶片)據我所知,有多USB 控制晶片也有提供
所謂SOF 中斷向量,以我的經驗是,這是留給萬一USB 控制晶片有碰到一些
相容性問題時,動用的,否則,您一旦打開(Enabel,致能)這個中斷功能,
包您的Device 的單晶片,什麼事都不用作了,您想一想,就算是您的8051是4T的,
光push/pop 進進出出中斷,就可憐了,更何況您用高階C語言。
沒有留言:
張貼留言