io讀寫下ch376初始化不成功,沒反應(yīng)

#include #include #include //#include //#include sbit CS=P2^1; sbit A0=P2^0; //sbit WR=P3^6; //sbit RD=P3^7; sbit INT=P3^2; /* 為printf和getkey輸入輸出初始化串口 */ void mInitSTDIO( void ) { SCON = 0x50; PCON = 0x00; TMOD = 0x20; TH1 = 0xfd; /* 11.0592MHz晶振, 9600bps */ TL1 = 0xfd; TR1 = 1; TI = 1; } void delay(unsigned int z) { unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void CH376_Write_Cmd(unsigned char cmd)//io 寫命令 { CS=0; A0=1; P0=cmd; WR=0; WR=1; CS=1; A0=1; } void CH376_Write_Dat(unsigned char dat)//io 寫數(shù)據(jù) { CS=0; A0=0; P0=dat; WR=0; WR=1; CS=1; A0=1; } unsigned char CH376_Read_Dat()//io讀數(shù)據(jù) { unsigned char temp; CS=0; A0=0; RD=0; P0=0xff; temp=P0; RD=1; CS=1; A0=1; return temp; } unsigned char CH376_Wait_Int()//等待中斷 { INT=1; while(INT); CH376_Write_Cmd(CMD01_GET_STATUS); return CH376_Read_Dat(); } unsigned char CH376_InitDisk() //初始化U盤 { unsigned char status; printf( "初始化U盤: \n" ); printf( "請插入U盤: \n" ); status=CH376_Wait_Int(); if(status==USB_INT_CONNECT) {printf( "U盤已插入 \n" );} else {printf( "U盤插入錯誤 \n" );} CH376_Write_Cmd(CMD0H_DISK_INIT); status=CH376_Wait_Int(); if(status!=USB_INT_SUCCESS) { printf( "U盤初始化失敗 \n" ); return(status); } printf( "初始化U盤成功 \n" ); printf( "\n" ); return(0); } void main() { unsigned char s; mInitSTDIO(); s=CH376_InitDisk(); }

不知道為什么,上電后用超級終端看串口返回的信息只看到"初始化U盤:"和"請插入U盤:"這兩句,然后插入U盤就沒下文了,請各位幫忙看看?UploadImages/20104162225817.rar

我把上面 unsigned char改成unsigned long int也不行。


unsigned char CH376_Read_Dat()//io讀數(shù)據(jù) { unsigned char temp; P0=0xff; CS=0; A0=0; RD=0; temp=P0; RD=1; CS=1; A0=1; return temp; } 這個地方時序需要修改一下。 你先做測試命令,然后看看讀寫函數(shù)是否成功。建議參考我們提供的代碼去寫。你的寫法很多不規(guī)范的地方。 INT=1;應(yīng)該是在初始化IO的時候做的,每次查詢中斷的時候都拉為1,做法感覺欠妥。


看了上傳的程序,估計樓主對CH376的用法還不太清楚,程序中CH376沒有被初始化,怎么能監(jiān)測到U盤呢! 建議下載CH376EVT.ZIP,先不要自己編寫程序,直接移植例程,僅需要根據(jù)實際的硬件連接修改PRAA_SW.C文件即可


悲劇了,謝謝scm和紅桃六,我參照了PRAA_SW.C文件,根據(jù)實際的硬件連接修改PRAA_SW.C文件,但是這次一個字都沒出來,怎么辦啊? /* CH376芯片 軟件模擬8位并口連接的硬件抽象層 V1.0 */ /* 提供I/O接口子程序 */ //#include #include #include "HAL.H"

/* 本例中的硬件連接方式如下(實際應(yīng)用電路可以參照修改下述定義及子程序) */ /* 單片機的引腳 CH376芯片的引腳 P2.0 A0 P2.6 CS# 如果模擬出的并口上只有CH376,那么CS#可以直接接低電平,強制片選 P3.6 WR# P3.7 RD# P0(8位端口) D7-D0 */ sbit CH376_A0 = P2^0; sbit CH376_CS = P2^1; sbit CH376_WR = P3^6; sbit CH376_RD = P3^7; #define CH376_DATA_DAT_OUT( d ) { P0 = d; } /* 向并口輸出數(shù)據(jù) */ #define CH376_DATA_DAT_IN( ) ( P0 ) /* 從并口輸入數(shù)據(jù) */ #define CH376_DATA_DIR_OUT( ) /* 設(shè)置并口方向為輸出 */ #define CH376_DATA_DIR_IN( ) { P0 = 0xFF; } /* 設(shè)置并口方向為輸入 */

#define CH376_INT_WIRE INT0 /* 假定CH376的INT#引腳,如果未連接那么也可以通過查詢狀態(tài)端口實現(xiàn) */ /* 為printf和getkey輸入輸出初始化串口 */ void mInitSTDIO( void ) { SCON = 0x50; PCON = 0x00; TMOD = 0x20; TH1 = 0xfd; /* 11.0592MHz晶振, 9600bps */ TL1 = 0xfd; TR1 = 1; TI = 1; } void CH376_PORT_INIT( void ) /* 由于使用通用I/O模擬并口讀寫時序,所以進行初始化 */ { CH376_CS = 1; CH376_WR = 1; CH376_RD = 1; CH376_A0 = 0; CH376_DATA_DIR_IN( ); /* 設(shè)置并口輸入 */ }

//void mDelay0_5uS( void ) /* 至少延時0.5uS,根據(jù)單片機主頻調(diào)整 */ //{ //}

#define xEndCH376Cmd( ) /* 結(jié)束CH376命令,僅用于SPI接口方式 */

UINT8 xReadCH376Status( void ) /* 從CH376讀狀態(tài),僅用于并口方式 */ { UINT8 mData; CH376_DATA_DIR_IN( ); /* 設(shè)置并口方向為輸入 */ 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( ); /* 設(shè)置并口方向為輸出 */ 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( ); /* 設(shè)置并口方向為輸出 */ 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( ); /* 設(shè)置并口方向為輸入 */ 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 ); }

/* 查詢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 }

UINT8 mInitCH376Host( void ) /* 初始化CH376 */ { UINT8 res; CH376_PORT_INIT( ); /* 接口硬件初始化 */ xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 測試單片機與CH376之間的通訊接口 */ xWriteCH376Data( 0x65 ); res = xReadCH376Data( ); // xEndCH376Cmd( ); // 并口方式不需要 if ( res != 0x9A ) { return( ERR_USB_UNKNOWN ); printf( "通訊接口不正常 \n" ); } /* 通訊接口不正常,可能原因有:接口連接異常,其它設(shè)備影響(片選不唯一),串口波特率,一直在復(fù)位,晶振不工作 */ printf( "通訊接口正常 \n" ); xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 設(shè)備USB工作模式 */ xWriteCH376Data( 0x06 ); mDelayuS( 20 ); res = xReadCH376Data( ); // xEndCH376Cmd( ); // 并口方式不需要 if ( res == CMD_RET_SUCCESS ) {return( USB_INT_SUCCESS ); printf( "設(shè)置模式成功 \n" );} else { return( ERR_USB_UNKNOWN ); printf( "設(shè)置模式錯誤 \n" );}/* 設(shè)置模式錯誤 */ } /*UINT8 CH376_InitDisk(void) //初始化U盤 { UINT8 status; printf( "初始化U盤: \n" ); printf( "請插入U盤: \n" ); status=CH376_Wait_Int(); if(status==USB_INT_CONNECT) {printf( "U盤已插入 \n" );} else {printf( "U盤插入錯誤 \n" );} CH376_Write_Cmd(CMD0H_DISK_INIT); status=CH376_Wait_Int(); if(status!=USB_INT_SUCCESS) { printf( "U盤初始化失敗 \n" ); return(status); } printf( "初始化U盤成功 \n" ); printf( "\n" ); return(0); } */ void main() { unsigned char s; mInitSTDIO(); s=mInitCH376Host(); }


1、普通51單片機的P0做I/O口使用時,需要外接上拉電阻 2、并口不可能讀不到數(shù)據(jù),大不了數(shù)據(jù)出錯


呵呵,謝謝SCM,不好意思,接電路的時候不小心把并口接到P1口了,但是新的問題出現(xiàn)了,我用的單片機是STC89c52,程序編譯后雖然可以看到串口信息,但是反饋回來的都是些亂碼,如"通訊接口粘? ㄑ督涌謖常 ㄑ督涌謖常 ㄑ督涌謖常" 麻煩再給看看程序. #include #include "HAL.H" sbit CH376_A0 = P2^0; sbit CH376_CS = P2^1; sbit CH376_WR = P3^6; sbit CH376_RD = P3^7; #define CH376_INT_WIRE INT0 /* 假定CH376的INT#引腳,如果未連接那么也可以通過查詢狀態(tài)端口實現(xiàn) */ /* 為printf和getkey輸入輸出初始化串口 */ void mInitSTDIO( void ) { SCON = 0x50; PCON = 0x00; TMOD = 0x20; TH1 = 0xfd; /* 11.0592MHz晶振, 9600bps */ TL1 = 0xfd; TR1 = 1; TI = 1; } void CH376_PORT_INIT( void ) /* 由于使用通用I/O模擬并口讀寫時序,所以進行初始化 */ { CH376_CS = 1; CH376_WR = 1; CH376_RD = 1; CH376_A0 = 0; } void mDelay0_5uS( void ) /* 至少延時0.5uS,根據(jù)單片機主頻調(diào)整 */ { ; } UINT8 xReadCH376Status( void ) /* 從CH376讀狀態(tài),僅用于并口方式 */ { UINT8 mData; CH376_A0 = 1; CH376_CS = 0; CH376_RD = 0; /* 輸出有效讀控制信號, 讀CH376芯片的狀態(tài)端口 */ CH376_CS = 0; /* 該操作無意義,僅作延時,CH376要求讀寫脈沖寬度大于40nS,強烈建議此處執(zhí)行一條空指令延時以確保并口有足夠時間輸入數(shù)據(jù) */ mData = P1; /* 從CH376的并口輸入數(shù)據(jù) */ CH376_RD = 1; /* 輸出無效的控制信號, 完成操作CH376芯片 */ CH376_CS = 1; CH376_A0 = 0; return( mData ); } void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376寫命令 */ { P1=mCmd; /* 向CH376的并口輸出數(shù)據(jù) */ 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; mDelay0_5uS( ); mDelay0_5uS( ); mDelay0_5uS( ); /* 延時1.5uS確保讀寫周期大于1.5uS,或者用狀態(tài)查詢代替 */ } void xWriteCH376Data( UINT8 mData ) /* 向CH376寫數(shù)據(jù) */ { P1= mData ; /* 向CH376的并口輸出數(shù)據(jù) */ CH376_A0 = 0; CH376_CS = 0; CH376_WR = 0; /* 輸出有效寫控制信號, 寫CH376芯片的數(shù)據(jù)端口 */ CH376_CS = 0; /* 該操作無意義,僅作延時,CH376要求讀寫脈沖寬度大于40nS */ CH376_WR = 1; /* 輸出無效的控制信號, 完成操作CH376芯片 */ CH376_CS = 1; mDelay0_5uS( ); /* 確保讀寫周期大于0.6uS */ }

UINT8 xReadCH376Data( void ) /* 從CH376讀數(shù)據(jù) */ { UINT8 mData; mDelay0_5uS( ); /* 確保讀寫周期大于0.6uS */ CH376_A0 = 0; CH376_CS = 0; CH376_RD = 0; /* 輸出有效讀控制信號, 讀CH376芯片的數(shù)據(jù)端口 */ CH376_CS = 0; /* 該操作無意義,僅作延時,CH376要求讀寫脈沖寬度大于40nS,強烈建議此處執(zhí)行一條空指令延時以確保并口有足夠時間輸入數(shù)據(jù) */ mData = P1; /* 從CH376的并口輸入數(shù)據(jù) */ CH376_RD = 1; /* 輸出無效的控制信號, 完成操作CH376芯片 */ CH376_CS = 1; return( mData ); }

/* 查詢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 }

UINT8 mInitCH376Host( void ) /* 初始化CH376 */ { UINT8 res; CH376_PORT_INIT( ); /* 接口硬件初始化 */ xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 測試單片機與CH376之間的通訊接口 */ xWriteCH376Data( 0x65 ); res = xReadCH376Data( ); if ( res != 0x9A ) { return( ERR_USB_UNKNOWN ); printf( "通訊接口不正常 \n" ); } /* 通訊接口不正常,可能原因有:接口連接異常,其它設(shè)備影響(片選不唯一),串口波特率,一直在復(fù)位,晶振不工作 */ printf( "通訊接口正常 \n" ); xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 設(shè)備USB工作模式 */ xWriteCH376Data( 0x06 ); mDelayuS( 20 ); res = xReadCH376Data( ); if ( res == CMD_RET_SUCCESS ) {return( USB_INT_SUCCESS ); printf( "設(shè)置模式成功 \n" );} else { return( ERR_USB_UNKNOWN ); printf( "設(shè)置模式錯誤 \n" );}/* 設(shè)置模式錯誤 */ } void main() { unsigned char s; mInitSTDIO(); s=mInitCH376Host(); }


你的程序有很多問題。 void main() { unsigned char s; mInitSTDIO(); s=mInitCH376Host(); } 這種寫法會導(dǎo)致MCU跑飛 void main() { unsigned char s; mInitSTDIO(); s=mInitCH376Host(); while(1); } 為什么加while(1);需要你仔細了解MCU原理。 你可以測試一下是什么問題導(dǎo)致亂碼。波特率是否正確,打印數(shù)據(jù)的時候是否被打斷等等都可能導(dǎo)致亂碼


能告訴我為什么嗎?


如果不加的話 執(zhí)行完 s=mInitCH376Host(); 單片機怎么往下運行?PC(程序計數(shù)器)的值是多少?很可能導(dǎo)致真?zhèn)€main函數(shù)死循環(huán)運行 以后寫程序務(wù)必注意這點


1、P1口有方向問題,讀數(shù)據(jù)時,需要P1 = 0xFF以切換方向為輸入 2、串口亂碼可能與串口軟件有關(guān),最好打印英文 3、至于死機,單片機程序要求是一個閉環(huán),否則程序會跑飛


我剛買了CH376評估板開發(fā)模塊,單片機用的也是STC89c52,想把采集的數(shù)據(jù)存到u盤,希望高手指點,我qq 451229240.


謝謝紅桃六,SCM,這幾天有事耽擱了,我用的是普通的51單片機,P1口是雙向且有上拉電阻的,我發(fā)現(xiàn)開超級終端連接后一上電就是一直顯示"通訊接口正常",接上U盤后也是一直在顯示這句話.好像后面設(shè)置USB工作模式都不成功,這是為什么啊?


加一點串口調(diào)試,監(jiān)控一下程序到底停在哪一步了


嗯,是加了串口調(diào)試,監(jiān)控程序一直停在" UINT8 mInitCH376Host( void ) /* 初始化CH376 */ { UINT8 res; CH376_PORT_INIT( ); /* 接口硬件初始化 */ xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 測試單片機與CH376之間的通訊接口 */ xWriteCH376Data( 0x65 ); res = xReadCH376Data( ); if ( res != 0x9A ) { return( ERR_USB_UNKNOWN ); printf( "通訊接口不正常 \n" ); } /* 通訊接口不正常,可能原因有:接口連接異常,其它設(shè)備影響(片選不唯一),串口波特率,一直在復(fù)位,晶振不工作 */ printf( "通訊接口正常 \n" ); xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 設(shè)備USB工作模式 */ xWriteCH376Data( 0x06 ); mDelayuS( 20 ); res = xReadCH376Data( ); if ( res == CMD_RET_SUCCESS ) {return( USB_INT_SUCCESS ); printf( "設(shè)置模式成功 \n" );} else { return( ERR_USB_UNKNOWN ); printf( "設(shè)置模式錯誤 \n" );}/* 設(shè)置模式錯誤 */ } "中的" printf( "通訊接口正常 \n" ); ",超級終端一直不停的往下顯示通訊接口正常 .SCM,麻煩你看看我前面6樓發(fā)的程序,非常感謝!


“一直不停的往下顯示通訊接口正常”?像是單片機在不停的復(fù)位,mDelayuS( 20 )是怎么做的,屏蔽掉試試


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频