USB開發速成-我最真實的經驗!(轉)

mrhaozi發表於2011-02-23
今天給大家介紹一種我嘗試過的自認為比較簡便的開發USB介面的方式,這是我個人的親身經歷。發表在這裡不是要顯得自己多牛(事實上這裡很多網友的水平都比我高)而是想介紹給那些迫於老闆壓力需要在短時間內開發出USB介面的工程師們。畢竟,好東西應該和大家分享:)

前段時間接了一個專案,基於機頂盒做一個USB主控介面(平臺是ST5105,作業系統為OS2.0.)。這是我第一次接觸USB的開發,而且專案時間很緊,要求1個月之內實現隨身碟讀寫的基本功能。我先了解了一些USB的基本理論:比如什麼是USB主/從,USB2.0和1.1協議的基本概念,USB驅動分為哪幾部分等。接下來就開始晶片選型。我當時的要求很明確:就是要軟體簡單,開發工作量小。另外,原廠的支援應該要比較好,至少可以在電話中幫我解答疑難問題。最開始考慮的是CYPRESS811和 NXP1760. 匆忙搜了一下資料發現參考程式碼很複雜,除錯起來工作量不小。這時候我沒有匆忙地立即著手研發,而是繼續不懈地在網路上搜尋,並多方打聽。我堅信“磨刀不誤砍柴工”很快我發現了愛普生的72U16。從愛普生USB晶片中文網()下載下來產品簡介和SPEC.,發現這顆晶片以FIRMWARE的形式內嵌了USB底層驅動以及MASS STORAGE等類協議,並且自帶MCU來負責這些FIRMWARE的執行。也就是說處理器這邊不用再寫USB協議和類驅動的程式了。當時覺得心跳都加快了 呵呵 有點懷疑介紹的真實性,畢竟這年頭大忽悠太多了。於是打電話給愛普生的800,後來七轉八轉到了愛普生原廠FAE那裡,確認了一些技術細節,OK,和介紹資料吻合。瞭解到處理器這邊只需要一個CF驅動即可(72U16內部有一個CF驅動到USB驅動的轉換),於是基本定下來了。當時選擇72U16還有一個原因,接電話的FAE比較有耐心,解答也比較專業,而且在北京有OFFICE。這點我一直認為很重要。申請了兩片樣片,就開工了。這時候時間已經過去了半個多月。下面我把開發過程和除錯心得貼出來,共享給大家。


一.硬體設計
首先是原理圖的設計。72U16與MCU的介面有IDE和並行匯流排兩種方式,據說如果按照IDE匯流排連線方式,傳輸速度會更快一些,但是可惜ST5105沒有IDE匯流排,只好選擇並行匯流排的方式了。
1) 與CPU的連線
地址線說明:
U16內部暫存器是按16位對映的,所以如果MCU的地址匯流排是8位定址的, 地址線連線時要按照CPU A[4]-A[1]對應U16 CA[3]-CA[0]的方式。
訊號邏輯說明:
U16以‘x’作為字首的訊號是負邏輯訊號(低電平或下降沿有效)。

圖1 U16與CPU的連線示意圖

2) 72U16的USB介面參考電路

圖2 U16的USB介面參考電路圖
圖中虛線部分為參考設計的高速USB傳輸的訊號保護電路,我在PCB上加了這一部分,但是除錯過程中沒有焊上,感覺也可以,並沒發現有影響。但要注意的就是usb的兩根資料線D+ 和D-要儘量短直,太長或彎可能會影響訊號傳輸質量。

3) 72U16的時鐘參考電路

圖3 U16的時鐘參考電路圖
時鐘這塊電路本來很簡單不用寫的,但是就是它讓我浪費了不少時間。除錯開始階段發現暫存器訪問不到,以為是晶片問題,後來打電話問了愛普生的技術支援,才發現原來是自己板子上的晶振沒有起振。原因是晶振的匹配電容配的不對,調整了匹配電容的值就好了。
二.軟體結構
硬體沒問題後接下來就是軟體除錯了。S1R72U16是內嵌USB協議軟體的,對採用上述的硬體連線MAIN CPU而言,S1R72U16相當於一個CF卡介面晶片。如果自己有標準的CF卡驅動,可以直接使用。也可以參考愛普生提供的參考程式碼。我就是用的參考程式碼,其軟體結構如下圖所示。其中CF卡驅動將以原始碼的形式提供,比較簡單。檔案系統愛普生不開放原始碼,是以庫的形式提供的,好在檔案系統與CF卡驅動的介面比較簡單,就是扇區讀寫的兩個函式,檔案系統給應用提供的API也比較標準,如FSOpen ,FSRead FSWrite之類。另外有一個demo程式,包括軟體初始化流程,以及呼叫參考檔案系統API的測試程式碼。

圖4 72U16參考程式碼結構
.
三、CF驅動的移植要點
1. 基地址的改變
修改72U16對應mainCPU地址空間的基地址U16_BASE_ADDR。
2. GPIO的設定及中斷註冊
72U16使用了幾個GPIO,在系統初始化的時候需要根據具體要求配置。
XHRESET對應的GPIO設定為輸出口,初始化時設定為高;
PORT10 對應的GPIO 設定為輸入口,並註冊成一個低電平觸發的系統中斷;
PORT11 對應的GPIO 設定為輸入口;
PORT12 對應的GPIO 設定為輸入口;
3. 裝置插入拔出檢測
裝置在插入拔出時會透過PORT10口會產生一個低電平的脈衝,如果PORT10對應的GPIO已經註冊成一個低電平觸發的系統中斷,則會進入該系統中斷的處理函式。在處理函式中讀取PORT11對應GPIO口的電平,低電平表示有USB裝置插入,高電平表示USB裝置拔出。
參考程式碼初始化流程。系統檢測到有裝置插入後就可以進行CF卡和檔案系統的初始化,流程如下圖所示。

圖5 初始化流程圖

四、除錯要點
1) CPU 讀寫時序的配置
在進行移植工作之前,需要對照MAIN CPU的時序,以確定是否與72U16的時序匹配。
72U16 CPU介面的時序如下圖所示。

圖6 CPU介面模式下72U16的讀寫時序


2) 時序不正常時可能出現的現象
Busy Check超時,或一直在while中死迴圈
資料讀取寫入不正確
3) 對隨身碟的要求
如果使用參考檔案系統,由於參考檔案系統目前支援FAT12 FAT16 FAT32格式,所以隨身碟需要格式化為FAT或FAT32格式。

五、測試結果
驅動除錯完成後,進行了一下測試,總共試了十種常用的隨身碟和行動硬碟,都能識別,速度表現不一樣。讀寫平均速度為隨身碟3MB/s, 行動硬碟 6MB/s,錄製TS流應該是夠了,如果提高一下匯流排的速度,應該能再快一些。另外還連續10小時不間斷大資料量反覆讀寫來測試穩定性。

結語:整個過程除去做PCB板的時間,軟體除錯只花了一個多星期。雖然最終比客戶要求的時間拖了一點,不過作為USB菜鳥能以這樣的速度完成開發,我還是得到了老闆的表揚。其實我想說的是:現在是一個專業化分工很細的社會,對於我們工程師也是如此。我認為原廠應該從使用者的角度出發,多做一些類似72U16這樣的晶片。期待著更多“傻瓜”晶片的誕生。

本文引用通告地址:[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16396910/viewspace-1046383/,如需轉載,請註明出處,否則將追究法律責任。

相關文章