[求助]CH375B并口讀寫U盤------急!

我現(xiàn)在手上沒有62256也沒有74LS373和138,單片機采用的是AT89S52,沒有用別的芯片,就是單片機直接和CH375B相連,不知道這樣行不行? 我運行測試程序的時候,總是無法初始化。 下面是程序:

#pragma NOAREGS #include #include #include "CH375INC.H" /* 頭文件,在網(wǎng)上下載的CH372或者CH375評估板資料中有 */

//unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ //unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375數(shù)據(jù)端口的I/O地址 */ sbit CH375_D0_D7 = P2; sbit CH375_A0 = P1^4; //sbit CH375_CS = P1^1; sbit CH375_WR = P3^6; sbit CH375_RD = P3^7; sbit led = P1^1; sbit LU = P1^2; sbit HONG = P1^3; /* 延時2微秒,不精確 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); /* 根據(jù)單片機的時鐘選擇初值 */ }

/* 延時1微秒,不精確,因為MCS51單片機較慢所以實際上無需延時 */ //void delay1us( ) //{ // unsigned char i; // for ( i = 1; i != 0; i -- ); //}

/* 基本操作 */

void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機較快則延時 */ delay2us(); // CH375_CMD_PORT=cmd; //* ******************** 注釋中是用普通I/O引腳模擬8位并口的時序,CH375_CS引腳是可選的,可以一直接GND強制片選 // CH375_D0_D7 = cmd; CH375_A0 = 1; //選擇CH375的命令口 CH375_D0_D7 = cmd; // 對于標準雙向I/O,請在此設置為輸出方向 CH375_RD = 1; //如果I/O默認電平是高電平,那么這是可選操作 // CH375_CS = 0; CH375_WR = 0; // CH375_CS = 0; //對于高速單片機,該指令用于延時,以便向CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖 CH375_WR = 1; // CH375_CS = 1; CH375_A0 = 0; // CH375_D0_D7 = P2; // 對于標準雙向I/O,請在此設置為輸入方向 CH375_D0_D7 = 0xFF; // 對于準雙向I/O,請在此設置輸出全高電平 /******************** */ delay2us(); }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */ // CH375_DAT_PORT=dat; //* ******************** 注釋中是用普通I/O引腳模擬8位并口的時序 CH375_D0_D7 = 0x55; // CH375_D0_D7 = P2; //對于標準雙向I/O,請在此設置為輸出方向 // CH375_CS = 0; CH375_WR = 0; // CH375_CS = 0; // 對于高速單片機,該指令用于延時,以便向CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖 CH375_WR = 1; // CH375_CS = 1; // CH375_D0_D7 = P2; // 對于標準雙向I/O,請在此設置為輸入方向 // CH375_D0_D7 = 0xFF; // 對于準雙向I/O,請在此設置輸出全高電平 /******************** */ // delay1us(); /* 因為MCS51單片機較慢所以實際上無需延時 */ }

unsigned char CH375_RD_DAT_PORT( void ) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */ // delay1us(); /* 因為MCS51單片機較慢所以實際上無需延時 */ //* ******************** 注釋中是用普通I/O引腳模擬8位并口的時序 //CH375_D0_D7_DIR = P2; // 對于標準雙向I/O,請在此設置為輸入方向 unsigned char dat; CH375_D0_D7 = 0xff; // 對于準雙向I/O,請在此設置輸出全高電平,便于輸入 // CH375_CS = 0; CH375_RD = 0; // CH375_CS = 0; //對于高速單片機,該指令用于延時,以便向CH375_RD產(chǎn)生寬度至少為80nS的低電平脈沖 dat = CH375_D0_D7; CH375_RD = 1; // CH375_CS = 1; CH375_D0_D7 = 0xFF; //對于準雙向I/O,請在此設置輸出全高電平 return( dat ); /******************** */ // return( CH375_DAT_PORT ); }

/* 延時50毫秒,不精確 */ void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }

/* CH375初始化子程序 */ void CH375_Init( ) { unsigned char i; /* 測試CH375是否正常工作,可選操作,通常不需要 */ CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測試CH375是否正常工作 */ 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( ); LU = 0; } 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; /* 清中斷標志 */ EX0 = 1; /* 允許CH375中斷 */ }

/* 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( ) { Delay50ms( ); /* 延時等待CH375初始化完成,如果單片機由CH375提供復位信號則不必延時 */ CH375_Init( ); /* 初始化CH375 */ EA = 1; /* 允許中斷 */ while ( 1 ) { HONG = 0; } /* 以下指令開始工作循環(huán),等待PC機命令進行操作 */ }

看看該怎么辦!著急?。?/p>

望高人指點! QQ:17503954


你的時序有問題,參考下面時序修改: /* 本例用I/O引腳模擬產(chǎn)生CH375的并口讀寫時序 */ /* 本例中的硬件連接方式如下(實際應用電路可以參照修改下述3個并口讀寫子程序) */ /* 單片機的引腳 CH375芯片的引腳 P3.2 INT# P1.0 A0 P1.1 CS# 如果模擬出的并口上只有CH375,那么CS#可以直接接低電平,強制片選 P1.2 WR# P1.3 RD# P0(8位端口) D7-D0 */ sbit CH375_A0 = P1^0; sbit CH375_CS = P1^1; sbit CH375_WR = P1^2; sbit CH375_RD = P1^3;

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

void CH375_PORT_INIT( ) /* 由于使用通用I/O模塊并口讀寫時序,所以進行初始化 */ { CH375_CS = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; P0 = 0xFF; /* 并口輸入 */ }

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { //*(UINT8XV *)0XBDF1 = mCmd; //return; mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時1uS */ P0 = mCmd; /* 向CH375的并口輸出數(shù)據(jù) */ CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的命令端口 */ CH375_CS = 0; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; CH375_A0 = 0; P0 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時2uS */ }

void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { //*(UINT8XV *)0XBCF0 = mData; //return; P0 = mData; /* 向CH375的并口輸出數(shù)據(jù) */ CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的數(shù)據(jù)端口 */ CH375_CS = 0; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; P0 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ mDelay1_2uS( ); /* 至少延時1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; //return( *(UINT8XV *)0XBCF0 ); mDelay1_2uS( ); /* 至少延時1.2uS */ P0 = 0xFF; /* 輸入 */ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 輸出有效寫控制信號, 讀CH375芯片的數(shù)據(jù)端口 */ CH375_CS = 0; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ mData = P0; /* 從CH375的并口輸入數(shù)據(jù) */ CH375_RD = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; return( mData ); }


先謝謝你了,我現(xiàn)在去改一下


另外還有可能是硬件的問題,測試CH375的25.26腳是不是分別為0和1 還可以用測試命令去測試一下,在初試化函數(shù)的開頭就是測試命令,你用串口來檢測返回的數(shù)據(jù)是多少.


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

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