91精品一区二区三区久久久久久_欧美一级特黄大片色_欧美一区二区人人喊爽_精品一区二区三区av

位置:51電子網 » 技術資料 » 集成電路

USB數據通信接□模塊的程序設計

發布時間:2008/11/25 0:00:00 訪問次數:769

  本文主要介紹pdiusbd12的固件編程問題。

  usb通信固件設計的目標為使pdiusbd12在usb上達到最大的傳輸速率。

  1.總體規劃

  cpu忙于處理許多設備控制和數據處理等任務。通信固件設計成完全的中斷驅動方式,當cpu處理前臺任務 時,usb的傳輸可在后臺進行,這就確保了最佳的傳輸速率和更好的軟件結構,同時簡化了編程和調試。

  后臺中斷服務程序和前臺主程序循環之間的數據交換通過事件標志和數據緩沖區來實現,例如,pdiusbd12 的批量輸出端點可使用循環的數據緩沖區,當diusbd12從usb收到一個數據包時,就對cpu產生一個中斷請求 ,cpu立即響應中斷。

  在中斷服務程序中固件將數據包從pdiusbd12內部緩沖區移到循環數據緩沖區,并在隨后清除diusbd12的內 部緩沖區,以使其能接收新的數據包,cpu可以繼續它當前的前臺任務直到完成。

  然后返回到主循環,檢查循環緩沖區內是否有新的數據,若有就對其進行處理,否則開始其他的前臺任務 。中斷服務程序與前臺主循環通過事件標志eppflags和數據緩沖區conrol xfer進行通信,eppflags的定義 如下:

  usb通信固件采用層次結構,如圖1所示


圖1 usb通信模塊層次圖

  2 分別介紹各層子模塊的設計

  (1)底層函數。

  最底層為兩個面向硬件電路的函數:outpodb(uchar addr, uchar dm)和inpofib(uchar addr) 用以 完成cpu和d12之間的數據傳輸,這是所li其他函數的基礎,具體代碼如下:

  (2)命令接口.

  在d12的數據手冊中定義了一套壓縮了所有訪問pdiusbd12功能的命令集,命令接口部分就是將各命令用函 數的形式加以實現,對應的函數主要有:

  以ushort readlnterruptregister(void)函數為例,代碼如下:


  3 中斷服務程序

  這部分代碼處理由pdiusbdl2產生的中斷,它將數據從pdiusbdi2的內部fifo取回到cpu存儲器,并建立正 確的事件標志以通知主循環程序進行處理。在isr函數的入口固件使用readlntemjptregister()來決定中 斷源,根據中斷源進入相應的子程序進行處理。

  中斷服務處理函數代碼如下


  4.主端點操作

  這部分代碼較多,包括各個端口的發送/接收函數,端點1和主端點(端點2)的收發函數相對較簡單。

  

  (2)主端點接收函數。

  5.程序說明

  在端點0的發送函數中,mcu首先需要通過讀di2的最后處理狀態寄存器,清0control_in中斷標志位,接著 mcu在確認di2處于傳輸模式后進行數據所的發送。由于d12的控件端點只有16bit,如果傳輸的長度大于 16bit,mcu在傳輸階段就必須控制數據的數量,其流程如圖2所示。mcu必須檢查要發送到主機的當前和剩余 的數據大小,如果剩下的字節數大于16,mcu將先發送16字節并減去參考長度(要求的長度)16。

  當下一個control_in標志來時,mcu將確定剩余的字節是否為0,如果已經沒有數據要發送,mcu需要發送一 個空的包以指示主機數據已發送完畢。


圖2 控制點發送函數流程

  · 如果是一個有效的請求,mcu必須向控制輸出端點發送應答建立命令,以重新使能下一個建立階段。接 下來,mcu需要證實控制傳輸是控制讀還是寫,這可以通過讀建立包中bmrequesttype的第8位來實現。

  · 如果控制傳輸是一個控制讀類型,那就是說器件需要在下一個數據階段向主機發回數據包。mcu需要設 置一個標志以指示usb設備現在正處于傳輸模式,即準備在主機發送請求時發送數據。建立階段結束之后, 主機會執行數據階段,d12等待接收control in包。

  · 如果建立包為setesdescriptor()請求,那么建立包中的控制傳輸將指示此包為控制寫類型。在執行 完setpescnptor請求過程后,mcu等待數據階段主機發送一個controlout標志,mcu從d12緩沖區中減去數據 。流程現在處于controleout處理程序的右端,mcu首先確認d12是否處于usb receive模式,然后mcu

  本文主要介紹pdiusbd12的固件編程問題。

  usb通信固件設計的目標為使pdiusbd12在usb上達到最大的傳輸速率。

  1.總體規劃

  cpu忙于處理許多設備控制和數據處理等任務。通信固件設計成完全的中斷驅動方式,當cpu處理前臺任務 時,usb的傳輸可在后臺進行,這就確保了最佳的傳輸速率和更好的軟件結構,同時簡化了編程和調試。

  后臺中斷服務程序和前臺主程序循環之間的數據交換通過事件標志和數據緩沖區來實現,例如,pdiusbd12 的批量輸出端點可使用循環的數據緩沖區,當diusbd12從usb收到一個數據包時,就對cpu產生一個中斷請求 ,cpu立即響應中斷。

  在中斷服務程序中固件將數據包從pdiusbd12內部緩沖區移到循環數據緩沖區,并在隨后清除diusbd12的內 部緩沖區,以使其能接收新的數據包,cpu可以繼續它當前的前臺任務直到完成。

  然后返回到主循環,檢查循環緩沖區內是否有新的數據,若有就對其進行處理,否則開始其他的前臺任務 。中斷服務程序與前臺主循環通過事件標志eppflags和數據緩沖區conrol xfer進行通信,eppflags的定義 如下:

  usb通信固件采用層次結構,如圖1所示


圖1 usb通信模塊層次圖

  2 分別介紹各層子模塊的設計

  (1)底層函數。

  最底層為兩個面向硬件電路的函數:outpodb(uchar addr, uchar dm)和inpofib(uchar addr) 用以 完成cpu和d12之間的數據傳輸,這是所li其他函數的基礎,具體代碼如下:

  (2)命令接口.

  在d12的數據手冊中定義了一套壓縮了所有訪問pdiusbd12功能的命令集,命令接口部分就是將各命令用函 數的形式加以實現,對應的函數主要有:

  以ushort readlnterruptregister(void)函數為例,代碼如下:


  3 中斷服務程序

  這部分代碼處理由pdiusbdl2產生的中斷,它將數據從pdiusbdi2的內部fifo取回到cpu存儲器,并建立正 確的事件標志以通知主循環程序進行處理。在isr函數的入口固件使用readlntemjptregister()來決定中 斷源,根據中斷源進入相應的子程序進行處理。

  中斷服務處理函數代碼如下


  4.主端點操作

  這部分代碼較多,包括各個端口的發送/接收函數,端點1和主端點(端點2)的收發函數相對較簡單。

  

  (2)主端點接收函數。

  5.程序說明

  在端點0的發送函數中,mcu首先需要通過讀di2的最后處理狀態寄存器,清0control_in中斷標志位,接著 mcu在確認di2處于傳輸模式后進行數據所的發送。由于d12的控件端點只有16bit,如果傳輸的長度大于 16bit,mcu在傳輸階段就必須控制數據的數量,其流程如圖2所示。mcu必須檢查要發送到主機的當前和剩余 的數據大小,如果剩下的字節數大于16,mcu將先發送16字節并減去參考長度(要求的長度)16。

  當下一個control_in標志來時,mcu將確定剩余的字節是否為0,如果已經沒有數據要發送,mcu需要發送一 個空的包以指示主機數據已發送完畢。


圖2 控制點發送函數流程

  · 如果是一個有效的請求,mcu必須向控制輸出端點發送應答建立命令,以重新使能下一個建立階段。接 下來,mcu需要證實控制傳輸是控制讀還是寫,這可以通過讀建立包中bmrequesttype的第8位來實現。

  · 如果控制傳輸是一個控制讀類型,那就是說器件需要在下一個數據階段向主機發回數據包。mcu需要設 置一個標志以指示usb設備現在正處于傳輸模式,即準備在主機發送請求時發送數據。建立階段結束之后, 主機會執行數據階段,d12等待接收control in包。

  · 如果建立包為setesdescriptor()請求,那么建立包中的控制傳輸將指示此包為控制寫類型。在執行 完setpescnptor請求過程后,mcu等待數據階段主機發送一個controlout標志,mcu從d12緩沖區中減去數據 。流程現在處于controleout處理程序的右端,mcu首先確認d12是否處于usb receive模式,然后mcu

相關IC型號

熱門點擊

 

推薦技術資料

DS2202型示波器試用
    說起數字示波器,普源算是國內的老牌子了,FQP8N60... [詳細]
版權所有:51dzw.COM
深圳服務熱線:13751165337  13692101218
粵ICP備09112631號-6(miitbeian.gov.cn)
公網安備44030402000607
深圳市碧威特網絡技術有限公司
付款方式


 復制成功!
天全县| 石泉县| 龙胜| 西峡县| 巴青县| 黄大仙区| 扬州市| 肇州县| 馆陶县| 汤原县| 舒兰市| 永宁县| 广汉市| 广宁县| 锡林郭勒盟| 霍林郭勒市| 高平市| 志丹县| 阜南县| 思南县| 江西省| 双柏县| 鸡西市| 寻乌县| 甘泉县| 深水埗区| 昔阳县| 富裕县| 苏尼特右旗| 潍坊市| 广州市| 荥阳市| 洛川县| 佛山市| 津市市| 嘉禾县| 宁海县| 西丰县| 岳普湖县| 监利县| 葫芦岛市|