程序如下,我是用mega128芯片做的,采用并口,芯片用的是官方的376模塊,但是初始化總是通不過,返回值res為0xFF,出錯的原因是什么地方呢? unsigned char mInitCH376Host( void ) /* 初始化CH376 */ { unsigned char res=0; CH376_PORT_INIT( ); /* 接口硬件初始化 */ xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 測試單片機與CH376之間的通訊接口 */ xWriteCH376Data( 0x55 ); res = xReadCH376Data( ); //------------------------------ PORTC=res; //------------------------------ if ( res != 0xAA ) return (ERR_USB_UNKNOWN); /* 通訊接口不正常,可能原因有:接口連接異常,其它設備影響(片選不唯一),串口波特率,一直在復位,晶振不工作 */ xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 設備USB工作模式 */ xWriteCH376Data( 0x06 ); mDelayuS( 20 ); res = xReadCH376Data( ); if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS ); else return (ERR_USB_UNKNOWN); /* 設置模式錯誤ERR_USB_UNKNOWN */ }
檢查并口時序,用示波器看下輸出的電平對不對,以及時序有沒有問題。其次檢查硬件,按照我們手冊上給硬件
硬件沒有查出錯誤。程序都是按照376編程指南上寫的,麻煩幫看下讀寫程序是否有不妥,實在是找不到錯誤了,崩潰掉?。。。。。。。。。。。?! void xWriteCH376Cmd( unsigned char mData ) /* 向CH376寫命令 */ { CH376_DATA_PORT=mData; CH376_DATA_DDR=0xFF; //設置端口為輸出 CH376_A0_H; CH376_PCS_L; CH376_RD_H; CH376_WR_L; //寫控制信號 CH376_DATA_DDR=0x00; mDelayuS(2);//延時應大于1.5us CH376_WR_H; } unsigned char xReadCH376Data(void)//從376讀取數(shù)據(jù) { unsigned char mData; CH376_DATA_DDR=0x00; //端口為輸入 CH376_DATA_PORT=0xFF;//上拉端口電阻 CH376_PCS_L; CH376_A0_L; CH376_WR_H; CH376_RD_L; asm("nop"); mData=CH376_DATA_PIN;//讀取數(shù)據(jù) mDelayuS(1); CH376_RD_H; return(mData); }
應該是單片機速度的原因,我單步執(zhí)行是可以的,一旦全速運行就不行了,376編程指南上說向CH376 寫命令周期大于1.5uS,是整個寫周期大于1.5uS還是每個指令周期要大于1.5uS?
看了你的時序,你片選拉低之后怎么沒有再拉高?還有需要你做下測試命令,看下測試命令給你返回的數(shù)據(jù)是多少?同時用萬用表去測下芯片的25腳,正常芯片復位之后25腳電壓為高。還有上電之后需要做50MS以上的延時之后在做芯片初始化或者測試命令。
因為并口就376一個芯片所以直接片選拉低了,現(xiàn)在測試數(shù)據(jù)單步運行總是返回0x00,全速運行總返回0xFF(已經(jīng)加延時了),昨天測試時,24腳變低了好使,現(xiàn)在24腳一直高,不知道怎么回事,另外復位時25腳變高了,然后再RSTI低電平25腳就變低了,復位后25腳為低對吧?
對。你寫命令函數(shù)不對WR拉低后,此時數(shù)據(jù)要保持,不能把CH376_DATA_DDR=0x00;
初始化調通了,寫命令下面寫的就能通過,居然要是100mS!??!但是確實是通過了,說明書不是大于1.5uS就行了嗎,感覺差別也太大了! void xWriteCH376Cmd( unsigned char mData ) /* 向CH376寫命令 */ { CH376_DATA_DDR=0xFF; //端口為輸出 CH376_DATA_PORT=mData; CH376_A0_H;; mDelaymS(100);//延時 CH376_WR_L; //寫控制信號 mDelaymS(100);//延時應大于1.5us CH376_WR_H; }
懷疑延時程序不準,測試下延時時間沒問題,做了PORTD.0口延時1ms循環(huán),示波器顯示周期是3mS,所以事實是確實376需要延時幾十毫秒 while(1) { PORTD |=0x01; mDelaymS(1);// PORTD &=0xFE; mDelaymS(1);// }
而且我試了試376寫程序需要延時40mS左右才行,低于40就返回不了正確數(shù)據(jù)。My God.
UINT8 xReadCH376Status( void ) /* 從CH376讀狀態(tài),僅用于并口方式 */ { UINT8 mData; CH376_DATA_DIR_IN( ); /* 設置并口方向為輸入 */ CH376_A0 = 1; CH376_CS = 0; CH376_RD = 0; /* 輸出有效讀控制信號, 讀CH376芯片的狀態(tài)端口 */ CH376_CS = 0; /* 該操作無意義,僅作延時,CH376要求讀寫脈沖寬度大于40nS,強烈建議此處執(zhí)行一條空指令延時以確保并口有足夠時間輸入數(shù)據(jù) */ mData = CH376_DATA_DAT_IN( ); /* 從CH376的并口輸入數(shù)據(jù) */ CH376_RD = 1; /* 輸出無效的控制信號, 完成操作CH376芯片 */ CH376_CS = 1; CH376_A0 = 0; return( mData ); }
void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376寫命令 */ { CH376_DATA_DAT_OUT( mCmd ); /* 向CH376的并口輸出數(shù)據(jù) */ CH376_DATA_DIR_OUT( ); /* 設置并口方向為輸出 */ CH376_A0 = 1; CH376_CS = 0; CH376_WR = 0; /* 輸出有效寫控制信號, 寫CH376芯片的命令端口 */ // CH376_CS = 0; /* 該操作無意義,僅作延時,CH376要求讀寫脈沖寬度大于40nS */ CH376_WR = 1; /* 輸出無效的控制信號, 完成操作CH376芯片 */ CH376_CS = 1; CH376_A0 = 0; CH376_DATA_DIR_IN( ); /* 禁止數(shù)據(jù)輸出 */ /* mDelay0_5uS( ); mDelay0_5uS( ); mDelay0_5uS( );*/ /* 延時1.5uS確保讀寫周期大于1.5uS,或者用狀態(tài)查詢代替 */ }
void xWriteCH376Data( UINT8 mData ) /* 向CH376寫數(shù)據(jù) */ { CH376_DATA_DAT_OUT( mData ); /* 向CH376的并口輸出數(shù)據(jù) */ CH376_DATA_DIR_OUT( ); /* 設置并口方向為輸出 */ CH376_A0 = 0; CH376_CS = 0; CH376_WR = 0; /* 輸出有效寫控制信號, 寫CH376芯片的數(shù)據(jù)端口 */ // CH376_CS = 0; /* 該操作無意義,僅作延時,CH376要求讀寫脈沖寬度大于40nS */ CH376_WR = 1; /* 輸出無效的控制信號, 完成操作CH376芯片 */ CH376_CS = 1; CH376_DATA_DIR_IN( ); /* 禁止數(shù)據(jù)輸出 */ // mDelay0_5uS( ); /* 確保讀寫周期大于0.6uS */ }
UINT8 xReadCH376Data( void ) /* 從CH376讀數(shù)據(jù) */ { UINT8 mData; // mDelay0_5uS( ); /* 確保讀寫周期大于0.6uS */ CH376_DATA_DIR_IN( ); /* 設置并口方向為輸入 */ CH376_A0 = 0; CH376_CS = 0; CH376_RD = 0; /* 輸出有效讀控制信號, 讀CH376芯片的數(shù)據(jù)端口 */ CH376_CS = 0; /* 該操作無意義,僅作延時,CH376要求讀寫脈沖寬度大于40nS,強烈建議此處執(zhí)行一條空指令延時以確保并口有足夠時間輸入數(shù)據(jù) */ mData = CH376_DATA_DAT_IN( ); /* 從CH376的并口輸入數(shù)據(jù) */ CH376_RD = 1; /* 輸出無效的控制信號, 完成操作CH376芯片 */ CH376_CS = 1; return( mData ); } 按照這個思路修改你AVR的IO