usb通訊學習心得(1)

2021-06-13 06:15:41 字數 1617 閱讀 4963

作為乙個初學者,我也是最近兩周多才接觸usb通訊的,在usb通訊協議中最難理解的可能就是usb列舉過程。雖然網上也有這usb列舉過程的詳細說明,

但是沒有結合具體的程式或函式進行分析,對初學者來說還是比較難懂的。尤其是usb列舉過程時間有限,一旦超過規定時間,電腦將識別不到usb裝置,因此除錯usb列舉過程非常麻煩,你不可能在ide中通過單步除錯一步步觀察上面網頁中所述的步驟。如果你在同乙個平台直接移植usb韌體,當然不用擔心這樣的問題,因為usb列舉問題可能不會出現。這樣你也省去學習usb列舉過程的麻煩,直接搞懂usb讀寫過程就行了。話雖如此但是我們還是有必要來學習一下它的列舉過程好麼!以下是我將430微控制器上的usb韌體移植到c51上學習體會,usb晶元是d12.

1).首先在usb裝置未插入電腦前,d12晶元int_n引腳為低電平,c51外部中斷標誌ie0初始也為0,

2). 當usb裝置插入電腦,d12晶元將檢測到d+和d-兩根線的電平變化,int_n復位拉高,同時d12中斷暫存器的將產生新值,c51將讀取這個中斷暫存器的值 int_sta=read_inr();   int_sta的值等於suspend,即掛起狀態,表示晶元可工作。

3).d12掛起之後將進入第一次中斷,c51轉向外部中斷服務程式,繼續讀取最新的中斷暫存器的值

int_sta=read_inr();  這時候

int_sta等於

int_busreset和

int_endp0out,將進入ep0_rxdone()函式,控制端點0接收資料,然後再次讀取

中斷暫存器的值,

將進入ep0_txdone()函式,控制端點0傳送資料,這兩步其實就是d12晶元讓c51使用

預設位址0進行收發資料。因為位址0通常用來處理setup包的。

4).有了預設位址0,

pc會通過

傳送get_devicedescriptor請求,微控制器根據req型別將執行get_descriptor函式使pc獲得裝置描述符,如果微控制器從d12讀取的到的裝置描述符正常將執行code_trans()函式從索引端點傳送給pc,(這裡使用端點0,索引端點即是0),請求pc應答,如果pc沒有應答則失敗,pc會在有限時間內繼續傳送請求。

5).如果有應答,d12晶元將知道pc有反應,d12

會通知微控制器收到setup包,即setup=1.同時知道是什麼setup請求型別(req,此次是分配位址請求),根據req,微控制器將執行control_handle(req),這個函式會指向set_addr函式。說了這麼多,其實就是微控制器再重新分配乙個新位址(1)和pc通訊。

6).有了新位址(埠1),pc會再次通過

傳送get_devicedescriptor請求,微控制器又重新執行get_descriptor

函式讓pc獲得裝置描述符,了解裝置的所有資訊比如支援的傳輸資料長度,

電流負荷多少,支援那個usb版本等等。同樣的,如果pc應答失敗,pc會在有限時間內重**送。

7)pc向d12迴圈傳送get_device_configuration請求,要求usb裝置應答,以讀取全部配置資訊。微控制器根據req執行get_config函式,步驟類似5)啦

8)最後pc傳送get_device_string命令,獲得字符集描述,比如產商、產品描述、型號等等。

到此為止,列舉結束列舉結束,pc將彈出視窗,發現新硬體。至此你已經成功一大半了!

USB匯流排學習心得及資料

看了一下usb協議資料,對usb原理有了乙個簡單的了解。usb匯流排和pci匯流排一樣,匯流排的作用都是提供通道,各種裝置利用匯流排通道來實現自己的功能。超高速superspeed 5gbps 約500mb s 5000 mbit s usb 2.0 高速hi speed 480mbps 約60mb...

USB匯流排學習心得及資料

看了一下usb協議資料,對usb原理有了乙個簡單的了解。usb匯流排和pci匯流排一樣,匯流排的作用都是提供通道,各種裝置利用匯流排通道來實現自己的功能。超高速superspeed 5gbps 約500mb s 5000 mbit s usb 2.0 高速hi speed 480mbps 約60mb...

oracle學習心得 1

oracle 使用心得 剛開始使用oracle,把今天的學習心得小結一下。oracle 預裝之後會有一些預設的帳戶供使用,具有管理員許可權的可用 system manager 接下來熟悉了一下oracle基本命令 1 建表 舉例 sql create table mytable name chara...