tceic.com
學霸學習網 這下你爽了
當前位置:首頁 >> >>

CH372基本讀寫程序(51單片機)

USB 學習筆記 4:CH372 基本讀寫程序(51 單片機) 基本讀寫程序( 單片機) :
USB 學習筆記 4:CH372 基本讀寫程序(51 單片機) 基本讀寫程序( 單片機) : CH372 官網上已經給出了 CH372 的測試程序, 下面是我在官方網站的 測試程序的基礎上進行整理和梳理。CH375 支持 USB-HOST 主機方式和 USBDEVICE/SLAVE 設備方式。,而 CH375 從設備方式與 CH372 的功能程序是一 樣的,于是兩者作為從機芯片是一樣的。 CH372 內置了 USB 通訊中的底層協議,具有省事的內置固件模式和 靈活的外置固件模式。在內置固件模式下,CH372 自動處理默認端點 0 的所有 事務,本地端單片機只要負責數據交換,所以單片機程序非常簡潔。在外置固件 模式下,由外部單片機根據需要自行處理各種 USB 請求,從而可以實現符合各 種 USB 類規范的設備。為了簡單起見,一般 PC 機與單片機通信使用內置固件 模式,下面程序也是基于內置固件模式的。 #pragma NOAREGS 定要加上 #include <REG52.H> #include "CH375INC.H" //禁止編譯器使用絕對寄存器尋址,一 //51 單片機頭文件 //CH372/CH375 頭文件

/////////////////////////////////////////////// //說明: CH372 總線地址,這個是按照學習筆記 1 總線擴展方式定的 // 采用別的方式,地址另外設定 /////////////////////////////////////////////// unsigned char volatile xdata CH375_CMD_PORT _at_ 0x03F1; unsigned char volatile xdata CH375_DAT_PORT _at_ 0x03F0; /*********************延時程序********************/ /////////////////////////////////////////////// //函數:delay2us //說明:延時 2us //入口:無 //返回:無 /////////////////////////////////////////////// void { delay2us( ) unsigned char i;

for ( i = 2; i != 0; i -- ); } /////////////////////////////////////////////// //函數:delay50ms //說明:延時 50ms //入口:無 //返回:無 /////////////////////////////////////////////// void Delay50ms( ) { unsigned char i, j; for ( i="200"; i!=0; i-- ) for ( j="250"; j!=0; j-- ); } /*********************基本讀寫程序********************/ /////////////////////////////////////////////// //函數:CH375_WR_CMD_PORT //說明:寫 USB 命令 //入口:unsigned char cmd:待寫入命令 //返回:無 /////////////////////////////////////////////// void CH375_WR_CMD_PORT( unsigned char cmd ) { delay2us(); CH375_CMD_PORT=cmd; delay2us(); } /////////////////////////////////////////////// //函數:CH375_WR_DAT_PORT //說明:寫一字節 USB 數據 //入口:unsigned char dat:待寫入一字節數據 //返回:無 /////////////////////////////////////////////// void CH375_WR_DAT_PORT( unsigned char dat ) { CH375_DAT_PORT=dat;

} /////////////////////////////////////////////// //函數:CH375_RD_DAT_PORT //說明:讀一字節 USB 數據 //入口:無 //返回:從 CH372/CH375 讀一字節數據 /////////////////////////////////////////////// unsigned char CH375_RD_DAT_PORT( void ) { return( CH375_DAT_PORT ); } /*********************初始化和中斷服務程序********************/ /////////////////////////////////////////////// //函數:CH375_Init //說明:CH372/CH375 初始化 //入口:無 //返回:無 /////////////////////////////////////////////// void { CH375_Init( ) /* 設置 USB 工作模式, 必要操作 */ unsigned char i; CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); 作模式 CH375_WR_DAT_PORT( 2 ); //設置為內置固件模式 //設置 USB 工

for ( i="100"; i!=0; i-- ) { /* 等待操作成功,通常需要等待 10uS-20uS */ if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } /* 下面啟用 USB 中斷,CH372/CH375 的 INT#引腳可以連接到單片機的中斷引 腳,中斷為低電平有效或者下降沿有效,如果不使用中斷,那么也可以用查詢方式, 由單片機程序查詢 CH372/CH375 的 INT#引腳為低電平 */ IT0 = 0; IE0 = 0; /* 置外部信號為低電平觸發 */ /* 清中斷標志 */

EX0 = 1; 的 INT0 */ }

/* 允許 CH372 中斷,假定 CH372 的 INT#引腳連接到單片機

/////////////////////////////////////////////// //函數:mCh375Interrupt //說明:CH372/CH375 中斷程序 //入口:無 //返回:無 /////////////////////////////////////////////// void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char i, length; unsigned char data buffer[64]; unsigned char InterruptStatus; CH375_WR_CMD_PORT( CMD_GET_STATUS );

//獲取中斷狀態并

取消中斷請求 InterruptStatus = CH375_RD_DAT_PORT( ); //獲取中斷狀態 //采用邊沿觸發的外部中斷請求,CPU 在相應中斷后,自動清除中斷標志 switch ( InterruptStatus ) { case USB_INT_BUS_RESET1: { break; } case USB_INT_BUS_RESET2: { break; } case USB_INT_BUS_RESET3: { break; } case USB_INT_BUS_RESET4: { break; } //USB 總線復位 //USB 總線復位 //USB 總線復位

//USB 總線復位

case USB_INT_EP0_SETUP: { //端點 0 的接收器接收到數據, SETUP 事務成功, 內部固件模式 時不需要處理 break; } case USB_INT_EP0_OUT: { //端點 0 的接收器接收到數據,OUT 事務成功,內部固件模式時 不需要處理 break; } case USB_INT_EP0_IN: { //端點 0 的發送器發送完數據,IN 事務成功,內部固件模式時不 需要處理 break; } case USB_INT_EP2_OUT: //批量端點/端點 2 接收到數

據,OUT 成功 { //從當前 USB 中斷的端點緩沖區讀取數據塊,并釋放緩沖區 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); length = CH375_RD_DAT_PORT( ); /* 首先讀取后續數據長度 */ ORT( ); for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_P //接收數據包 /* -----------測試數據正確性,將接收到的命令包數據返回給 PC 機---------- */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向 USB 端點 2 的發送緩沖區寫入數據塊 */ CH375_WR_DAT_PORT( length ); /* 首先寫入后續數據長度,回傳剛接收到的數據長度 */ for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( buffer [ i ] ); /* 數據返回,由計算機應用程序測試數據是否正確 */ /* ----------------------------------------------------------------------------------------------------- */ break; }

case USB_INT_EP2_IN: IN 成功 {

//批量端點/端點 2 發送完數據,

CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); 當前 USB 緩沖區 break; } default: { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); break; } } } /////////////////////////////////////////////// //函數:main //說明:主程序。對 CH372 初始化,對 USB 進行讀寫及其他程序 //入口:無 //返回:無 /////////////////////////////////////////////// main( ) { Delay50ms( ); CH375_Init( ); EA = 1; while(1); } //對 CH375/CH372 初始化 //允許中斷

//釋放

下面是中斷狀態的分析說明。在內置固件模式的 USB 設備方式下,單片機 只需要處理表中標注為灰色的中斷狀態,CH372 內部自動處理了其它中斷狀態。 所以可以看到中斷服務程序中對端點 0 的 SETUP、 OUT 和 IN 還有 USB 總線復 位都不做處理。


網站首頁 | 網站地圖 | 學霸百科 | 新詞新語
All rights reserved Powered by 學霸學習網 www.962919.tw
copyright ©right 2010-2021。
文檔資料庫內容來自網絡,如有侵犯請聯系客服。[email protected]
广西快乐十分有何技巧