2019年9月27日 星期五

Hinet 網頁系列 --- USB DIY 系列(四)---USB DIY 講座 (二)

(補充說明:其實在我系統開發的經驗累積中,有兩個很重要的產品開發讓我從裡面建立了

非常扎實的系統開發能力,一個是引擎控制程式的撰寫,當然啊,這一部分不是我天生就會的

而是從國外的量產韌體程式學到的,沒有花俏的、疊床架屋的程式架構,卻在每一段程式裡

都隱含著系統物理理論與軟體程式方法的關聯性,讓你真的從"系統開發"角度去寫程式。

第二個當然就是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 都不少,所以,他賣得貴不是沒道理的。
---------------------------------------------------------------------------------------------------------------------

特質五:USB Supports Four Transfer Types

<<>>    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語言。

沒有留言:

張貼留言