請問我是按CH372的規(guī)格書寫的,但怎么都跟電腦通不了,是什么原因?
void CH375_WR_CMD_PORT( unsigned char cmd ) { ///* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機較快則延時 */
//-------------------creaed by hjb //---- USB_CS=0; //選通CH372 P2=0xFF; //USB_DATA_OUTPUT=0xFF; //拉高引腳 USB_A0=1; //USB_A0=USB_CMD_MODE;//命令模式 USB_WR=0;//準許寫 P2=cmd; //USB_DATA_OUTPUT=cmd;//寫數(shù)據(jù) DelayNus(2); // DelayNus(3); USB_CS=1;//不選通CH372; P2=0xFF; //USB_DATA_OUTPUT=0xFF;//拉高引腳 USB_WR=1;//禁止寫
}
void CH375_WR_DAT_PORT( unsigned char dat ) { ///* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */
USB_CS=0; //選通CH372 P2=0xFF;// USB_DATA_OUTPUT=0xFF; //拉高引腳 //covered by hjb USB_A0=0;//USB_A0=USB_DAT_MODE;//數(shù)據(jù)模式 //covered by hjb USB_WR=0;//準許寫 P2=dat; //USB_DATA_OUTPUT=dat;//寫數(shù)據(jù)
DelayNus(2);//DelayNus(3); //3uS USB_CS=1;//不選通CH372; P2=0xFF; //USB_DATA_OUTPUT=0xFF;//拉高引腳 USB_WR=1;//禁止寫 }
unsigned char CH375_RD_DAT_PORT( void ) { ///* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */
//---------------Created by hjb unsigned char dat; //unsigned int dat;
USB_CS=0; //選通CH372 P2=0xFF; //USB_DATA_INTPUT=0xFF; //拉高引腳 USB_A0=0; //hjb// USB_A0=USB_DAT_MODE;//命令模式 USB_RD=0; //準許讀 dat=P2; //dat=USB_DATA_INTPUT//讀取數(shù)據(jù)
DelayNus(2);//DelayNus(3); USB_CS=1;//不選通CH372; USB_RD=1;//禁止讀 P2=0xFF;// USB_DATA_INTPUT=0xFF;//拉高引腳 return dat; //返回讀取到的數(shù)據(jù) } //-----------------------------------------------------------------------
// CH375初始化子程序 void CH375_Init( ) { unsigned char i; // 測試CH375是否正常工作,可選操作,通常不需要 CH375_WR_CMD_PORT( CMD_CHECK_EXIST );// 測試CH375是否正常工作 0x06 CH375_WR_DAT_PORT( 0x55 ); // 寫入測試數(shù)據(jù)
i = ~ 0x55; // 返回數(shù)據(jù)應該是測試數(shù)據(jù)取反 if ( CH375_RD_DAT_PORT( ) != i ) { // CH375不正常 for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL );// 多次重復發(fā)命令,執(zhí)行硬件復位 CH375_RD_DAT_PORT( ); } CH375_WR_CMD_PORT( 0 ); Delay50ms( ); // 延時50ms }
// 設置USB工作模式, 必要操作 CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 2 );// 設置為使用內(nèi)置固件的USB設備方式 for ( i=100; i!=0; i-- ) { // 等待操作成功,通常需要等待10uS-20uS if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } // if ( i==0 ) { CH372/CH375存在硬件錯誤 }; // 下述啟用中斷,假定CH375連接在INT0 IT0 = 0; // 置外部信號為低電平觸發(fā) IE0 = 0; // /* 清中斷標志 */covered by hjb EX0 = 1; // /* 允許CH375中斷 */ // EA=1;//HJB
}
// CH375中斷服務程序,使用寄存器組1 void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char i, length; unsigned char data buffer[ 64 ];
CH375_WR_CMD_PORT( CMD_GET_STATUS ); // 獲取中斷狀態(tài)并取消中斷請求 InterruptStatus = CH375_RD_DAT_PORT( );// 獲取中斷狀態(tài)
switch ( InterruptStatus ) { // 分析中斷狀態(tài)處理 case USB_INT_EP2_OUT: { // 批量端點下傳成功 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); // 從當前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū)
length = CH375_RD_DAT_PORT( ); // 首先讀取后續(xù)數(shù)據(jù)長度 for ( i = 0; i < length; i ++ )
buffer[ i ] = CH375_RD_DAT_PORT( ); // 接收數(shù)據(jù)包
// 測試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機 CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 );// 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊
CH375_WR_DAT_PORT( length ); // 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( ~ buffer[ i ] ); // 數(shù)據(jù)取反后返回,由計算機應用程序測試數(shù)據(jù)是否正確 break; } case USB_INT_EP2_IN: { // 批量數(shù)據(jù)發(fā)送成功 CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); // 釋放當前USB緩沖區(qū) break; } default: { // 其它中斷,未用到,解鎖后退出即可 CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); // 釋放當前USB緩沖區(qū) break; } } }
main( ) { USB_A0=1; //USB_A0=USB_CMD_MODE;//命令模式 USB_WR=1; USB_CS=1;USB_RD=1;INT=1; //------------ Delay50ms( );// 延時等待CH375初始化完成,如果單片機由CH375提供復位信號則不必延時 CH375_Init( ); // 初始化CH375 EA = 1; // 允許中斷 while ( 1 ); /// 以下指令開始工作循環(huán),等待PC機命令進行操作 }