我設(shè)計(jì)的的電路是CH376的參考電路,只有A0接口是單片機(jī)P0.0口引出經(jīng)74LS373輸出的Q0口連到376上面,其他跟沁恒參考電路幾乎一樣,就是初始化不成功串口反饋ERR_USB_UNKNOWN
UINT8V xdata CH376_CMD_PORT _at_ 0x8001; /* 假定CH376命令端口的I/O地址 */ UINT8V xdata CH376_DAT_PORT _at_ 0x8000; /* 假定CH376數(shù)據(jù)端口的I/O地址 */
#define CH376_INT_WIRE INT0 /* 假定CH376的INT#引腳,如果未連接那么也可以通過查詢狀態(tài)端口實(shí)現(xiàn) */
void CH376_PORT_INIT( void ) /* 由于使用標(biāo)準(zhǔn)并口讀寫時(shí)序,所以無需初始化 */ { }
void mDelay0_5uS( void ) /* 至少延時(shí)0.5uS,根據(jù)單片機(jī)主頻調(diào)整 */ {
}
#define xEndCH376Cmd( ) /* 結(jié)束CH376命令,僅用于SPI接口方式 */
#define xReadCH376Status( ) ( CH376_CMD_PORT ) /* 從CH376讀狀態(tài),僅用于并口方式 */
void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376寫命令 */ { UINT8 i; CH376_CMD_PORT = mCmd; mDelay0_5uS( ); mDelay0_5uS( ); mDelay0_5uS( ); /* 延時(shí)1.5uS確保讀寫周期大于1.5uS,或者用下面幾行的狀態(tài)查詢代替 */ for ( i = 10; i != 0; -- i ) { /* 狀態(tài)查詢,等待CH376不忙,或者上面一行的延時(shí)1.5uS代替 */ if ( ( xReadCH376Status( ) & PARA_STATE_BUSY ) == 0 ) break; /* 檢查狀態(tài)端口的忙標(biāo)志位 */ } }
#ifdef FOR_LOW_SPEED_MCU /* 不需要延時(shí) */ #define xWriteCH376Data( d ) { CH376_DAT_PORT = d; } /* 向CH376寫數(shù)據(jù) */ #define xReadCH376Data( ) ( CH376_DAT_PORT ) /* 從CH376讀數(shù)據(jù) */ #else void xWriteCH376Data( UINT8 mData ) /* 向CH376寫數(shù)據(jù) */ { CH376_DAT_PORT = mData; mDelay0_5uS( ); /* 確保讀寫周期大于0.6uS */ }
UINT8 xReadCH376Data( void ) /* 從CH376讀數(shù)據(jù) */ { mDelay0_5uS( ); /* 確保讀寫周期大于0.6uS */ return( CH376_DAT_PORT ); }
#endif
/* 查詢CH376中斷(INT#低電平) */ UINT8 Query376Interrupt( void ) { #ifdef CH376_INT_WIRE return( CH376_INT_WIRE ? FALSE : TRUE ); /* 如果連接了CH376的中斷引腳則直接查詢中斷引腳 */ #else return( xReadCH376Status( ) & PARA_STATE_INTB ? FALSE : TRUE ); /* 如果未連接CH376的中斷引腳則查詢狀態(tài)端口 */ #endif }
void mInitSTDIO( void ) { SCON = 0x50; PCON = 0x80; TMOD = 0x21; TH1 = 0xf3; /* 24MHz晶振, 9600bps */ TR1 = 1; TI = 1; }
void main() {
UINT8 a; UINT8 i; for ( i = 0; i<250; i++ ); mInitSTDIO( ); printf("start\n"); for ( i = 0; i<250; i++ ); while(1) { a = mInitCH376Host( ); if(a==USB_INT_SUCCESS) { for ( i = 0; i<250; i++ ); printf("USB_INT_SUCCESS\n"); for ( i = 0; i<250; i++ ); } else if(a==ERR_USB_UNKNOWN ) { for ( i = 0; i<250; i++ ); printf("ERR_USB_UNKNOWN\n"); for ( i = 0; i<250; i++ ); } else printf("abc\n"); for ( i = 0; i<250; i++ ); while(1); } }
UINT8 mInitCH376Host( void ) /* 初始化CH376 */ { UINT8 res; CH376_PORT_INIT( ); /* 接口硬件初始化 */ xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 測試單片機(jī)與CH376之間的通訊接口 */ xWriteCH376Data( 0x65 ); res = xReadCH376Data( ); // xEndCH376Cmd( ); // 并口方式不需要 if ( res != 0x9A ) return( ERR_USB_UNKNOWN ); /* 通訊接口不正常,可能原因有:接口連接異常,其它設(shè)備影響(片選不唯一),串口波特率,一直在復(fù)位,晶振不工作 */ xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 設(shè)備USB工作模式 */ xWriteCH376Data( 0x06 ); mDelayuS( 20 ); res = xReadCH376Data( ); // xEndCH376Cmd( ); // 并口方式不需要 if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS ); else return( ERR_USB_UNKNOWN ); /* 設(shè)置模式錯(cuò)誤 */ }