基于AN2131QC USB固件程序設計
關 鍵 詞:EZ-USBAN2131QC;基本框架;USB接口;固件程序設計
隨著USB接口的推出,它正在逐漸成為計算機外圍設備一種主流接口,所以USB接口的開發也越來越得到關注。在其開發中,固件程序的開發是一個重要的環節,它是USB設備運行的核心,響應各種USB設備請求,完成各種數據交換工作和事件的處理,直接影響產品的數據傳輸速率。固件程序也是開發過程中的一個難點,因此本文介紹其基本框架和其基本的程序設計。
1 AN2131QC的主要特點
AN2131QC是基于USB 1.1的外設通訊控制芯片
主要特點:
(1)4時鐘周期的8051內核;
(2)2個快速存儲器到存儲器的數據發送指針;
(3)多個USB數據傳輸中斷;
(4)8 kB內部RAM,支持外部存儲器;
(5)軟配置,方便固件程序升級;
(6)32個輸入輸出管道,支持1024B的同步數據傳輸。
2 AN2131QC的數據傳輸方式
USB總線的數據傳送是通過管道來完成的,當外圍設備接到總線上時,地址是由主機隨機分配的,信息的交換通過4種方式實現。
(1)控制傳輸
主要作用是建立主機和USB外設之間的聯系管道和USB外設的狀態反映,不能用于傳輸信息數據。AN2131QC的端點O用于控制傳輸。
(2)批量傳輸
主要用于傳輸長度不大于64個字節,而且需要周期性傳輸的數據塊,具有錯誤重發功能,可以動態地利用可獲得的USB總線帶寬。
(3)中斷傳輸
對于一個規定的時間里傳輸一個中等數量的數據是很有用,因為它將保證主機在最短的延遲里響應或發送數據。
(4)同步傳輸
可以1次傳輸長度不超過1 024 B的數據塊,主要用于傳輸大批量的實時數據,例如音頻數據,不支持錯誤重發。
3 框架函數
框架函數一般都提供有交互的掛鉤,可以用來方便用戶添加完成特定的功能代碼。所謂函數掛鉤,就是應用程序之間的橋梁,就好比用鉤子在應用程序之間建立聯系。函數掛鉤非常簡單,其所能完成的功能也非常有限,但可以根據實際需要向函數中添加代碼,以實現特定的功能。框架函數分為3類:任務分配、標準設備請求和USB中斷處理。
3.1 任務分配
(1)D_Init( )
該函數可在框架初始化期間被調用。在設備重枚舉和任務調度啟用前調用該函數,可用于初始化用戶的全局狀態變量。在該函數中,用戶可設置整體狀態變量的初始值,并可規定各種端點資源的使用(包括中斷)以及配置外圍接口的輸入/輸出等。
(2)TD_Poll( )
在設備工作期間,該函數可被重復調用。它包含一個執行外設功能的狀態機。該函數在高優先級的任務處理完成后便可返回。然而,如果不能從該函數中返回,則,框架將不能響應設備請求和USB掛起事件。如果某項任務需要大量的處理時間,則應將該任務分為若干小任務,并通過對該函數的多次調用來分批處理。
本文引用地址:http://www.104case.com/article/201706/353730.htm(3)TD_Suspend( )
該函數可在框架進入掛起狀態之前被調用。函數中應該包括使設備進入低功耗狀態的程序,然后返回TRUE。當然,可以讓該函數返回FALSE,以阻止設備進入掛起狀態。
(4)TD_Resume( )
該函數可在設備被外部喚醒事件喚醒且框架程序恢復處理后被調用。此時,設備將恢復到正常的操作方式。
3.2 設備請求
設備請求函數一般具有如下形式:

該函數主要對來自主機的命令及請求進行處理(如分析描述符表),以確定新的配置接口和端點。
3.3 USB中斷
由于在固件程序中提供有中斷服務例程接口,因此,開發者只要在需要處理的中斷服務例程接口中加入自己編寫的中斷服務代碼,即可完成對相應中斷請求的服務。這些中斷服務例程接口函數的形式為:

4 固件程序
4.1 固件的定義
載有在用戶環境中不能加以改變的計算機程序及數據的器件。包含在固件中的計算機程序和數據歸類為軟件;載有計算機程序和數據的電路歸類為硬件。固件程序就是硬件中的軟件部分,通過執行該軟件可以實現特定的硬件功能。通常的固件程序是將一段程序存儲在ROM上,設備啟動之后自動引導配置特定的芯片,使之完成特定的功能。
4.2 固件程序設計
Cypress公司提供EZ-USB固件程序框架,用于加速開發基于EZ-USB芯片的外設。固件程序采用Keil C編寫,主要包括2個文件,一個是任務調度和設備請求分析程序fw.c,其中包含了固件執行的入口,一般不用修改;一個是USB外設功能程序periph.c,包括用戶初始化函數、標準設備請求函數、完成外設功能的USB中斷處理函數。用戶只需提供設備描述符表并鏈接進來,再編寫完成外設功能的代碼,就可以開發出一個功能完善的USB外設。例如要使用AN2131QC的塊輸入端點2完成快速讀操作,其固件編寫步驟如下:
(1)按照USB描述符表樣例Dser.a51中的格式,按順序依次修改設備描述符、配置描述符、接口描述符、端點描述符、字符串描述符。
(2)修改periph.c程序中初始化函數TD_Init(),進行端點使能與中斷允許設置。
void TD_Init(void)
{
IN2VAL=bmEP2; // 使輸入端點2有效
IN2IEN=bmEP2; ///使能端點中斷
USBBAV=bmAVEN; //使能自動向量
EA=1; //使能8051中斷
Rwuen=TRUE; //使能遠程喚醒
}
(3)修改periph.c中的塊輸入端點2的中斷函數ISR_Ep2 in(),填加用戶功能代碼,完成塊讀傳輸。


在KeilμVision2下調試,即可生成bulk.HEX。
5 結 語
當前,USB設備的開發已成為熱點,縮短研發周期、提高開發效率是開發者追求的目標。選擇EZ-USB芯片,利用EZ-USB程序框架,可以大大加快USB設備固件程序的開發過程。
評論