請問誰有這方面的經(jīng)驗(yàn)?zāi)芊窒硐聗
如果單片機(jī)與CH375是串口連接,主要是把原來并口的讀寫子程序用串口方式來寫,其他基本類似,可以參考下面的子程序: void CH375_PORT_INIT( ) { SCON = 0xD0; // 設(shè)置串口為9位數(shù)據(jù) PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; // 24MHz晶振, 9600bps TR1 = 1; TI = 1; // RI = 0; //設(shè)置波特率和其它串口參數(shù) }
void xWriteCH375Cmd( UINT8 mCmd ) { TI = 0; TB8 = 1; SBUF = mCmd; while ( TI == 0 ); }
void xWriteCH375Data( UINT8 mData ) { TI = 0; TB8 = 0; SBUF = mData; while ( TI == 0 ); }
UINT8 xReadCH375Data( void ) { while ( RI == 0 ); RI = 0; return( SBUF ); }
發(fā)命令還是數(shù)據(jù)是通過TB8位來辨別的嗎? 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地址 */ 就可以不用了是吧
TB8是數(shù)據(jù)的第9位,為1時前8位被作為命令碼寫入CH375芯片中,為0時前8位的數(shù)據(jù)被寫入CH375芯片中。 下面兩個并口地址不需要了去掉就行。
void CH375_PORT_INT() //1200bps@18.432MHz { S2CON = 0xd0; //9位數(shù)據(jù),可變波特率 BRT = -(FOSC/32/BAUD); //設(shè)定獨(dú)立波特率發(fā)生器重裝值 AUXR &= 0xfb; //獨(dú)立波特率發(fā)生器時鐘為Fosc/12,即12T AUXR |= 0x10; //啟動獨(dú)立波特率發(fā)生器 S2CON |=0x02; //S2TI=1 IE2=0x01; EA=1; } void CH375_Write_Cmd(uchar cmd) { S2CON &=0xfd; //S2TI=0 S2CON |=0x08; //S2TB8 = 1; S2BUF = cmd; while (!(S2CON & S2TI)); S2CON&=~S2TI; //S2TI=0; }
void CH375_Write_Dat(uchar dat) { S2CON &=0xfd; //S2TI=0 S2CON &=0xf7; // S2TB8 = 0; S2BUF = dat; while ( S2TI == 0 ); }
uchar CH375_Read_Dat() { while (!(S2CON&S2RI)); S2CON&=~S2RI; // S2RI = 0; return( S2BUF ); }
void Uart2() interrupt 8 using 1 { if(S2CON&S2RI) { S2CON&=~S2RI; //清除S2RI位 } if(S2CON&S2TI) { S2CON&=~S2TI; //清除S2TI位 } } uchar CH375_Wait_Init()//等待中斷信號,回復(fù)高電平 { INT=1; while(INT); CH375_Write_Cmd(CMD_GET_STATUS); return CH375_Read_Dat(); } void main() { CH375_PORT_INT(); CH375_InitDisk(); while(1); }
uchar CH375_InitDisk() { uchar status; UART_Send_Str("初始化U盤:\n"); UART_Send_Str("請插入U盤\n"); status=CH375_Wait_Init(); //等待U盤插入時產(chǎn)生中斷,INT回復(fù)高電平 if(status==USB_INT_CONNECT) //如果狀態(tài)碼表明U盤已連接 { UART_Send_Str("U盤已插入\n"); } else { UART_Send_Str("U盤插入錯誤\n"); } CH375_Write_Cmd(CMD_DISK_INIT); status=CH375_Wait_Init(); if(status!=USB_INT_SUCCESS) { UART_Send_Str("U盤初始化失敗\n"); return(status); } UART_Send_Str("初始化U盤成功n"); UART_Send_Str("\n"); return(0); //U盤已經(jīng)成功初始化 } 麻煩幫我看看,我用串口2來驅(qū)動CH375卻不能實(shí)現(xiàn)初始化,看看我哪里配置的不對?
在檢測U盤連接之前需要設(shè)置模式,另外在設(shè)置模式之前你可以做一下測試命令確保串口通訊沒有問題。
您好,我的串口配置好了,U盤模式也設(shè)置了,還是不能初始化CH375,下面這個函數(shù)沒有執(zhí)行。 uchar CH375_Wait_Init()//等待中斷信號,回復(fù)高電平 { INT=1; while(INT); CH375_Write_Send(CMD_GET_STATUS); return CH375_Read_Dat(); } 這里CMD_GET_STATUS怎么處理? 因?yàn)樵赾h375hf4.h頭文件中如果如果把 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地址 */ 去掉的話,
while ( CH375_CMD_PORT & 0x80 ); /* 查詢CH375B的命令端口的位7為1說明中斷引腳輸出高電平則等待 */ #endif CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取當(dāng)前中斷狀態(tài) */ CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; /* 操作無意義,用于至少延時2uS */ CH375IntStatus = CH375_DAT_PORT; /* 獲取中斷狀態(tài) */ 應(yīng)該怎么處理呢?麻煩你了,我很困惑!
你中斷那塊配置有點(diǎn)問題,CMD_GET_STATUS是產(chǎn)生中斷的時候獲取中斷狀態(tài)的命令。你可以先檢查一下INT引腳插上U盤有沒有低電平產(chǎn)生?然后用單片機(jī)的IO口來檢測即可。
您好,查出來,確實(shí)是INT引腳在插上U盤之后沒有低電平產(chǎn)生。重新修改了中斷處理,麻煩您幫忙分析下~ void CH375_PORT_INT() //1200bps@18.432MHz { S2CON = 0xd0; //9位數(shù)據(jù),可變波特率 BRT = -(FOSC/32/BAUD); //設(shè)定獨(dú)立波特率發(fā)生器重裝值 AUXR = 0x14; //獨(dú)立波特率發(fā)生器時鐘為Fosc/12,即12T IE2=0x01; EA=1; } void CH375_Write_Cmd(uchar cmd) { while(busy); ACC = cmd; S2CON |=S2TB8; busy=1; S2BUF = ACC; } void Uart2() interrupt 8 using 1 { if(S2CON&S2RI) { S2CON&=~S2RI; //清除S2RI位 } if(S2CON&S2TI) { S2CON&=~S2TI; //清除S2TI位 busy = 0; } } void CH375_Write_Dat(uchar dat) { while(busy); ACC = dat; S2CON &=~S2TB8; busy = 1; S2BUF = ACC; } uchar CH375_Read_Dat() { while (!(S2CON&S2RI)); S2CON&=~S2RI; // S2RI = 0; return( S2BUF ); } uchar CH375_Wait_Init()//等待中斷信號,回復(fù)高電平 { INT=1; while(INT); CH375_Write_Cmd(CMD_GET_STATUS); return CH375_Read_Dat(); } //U盤初始化 uchar CH375_InitDisk() { uchar status; // RESULT = CH375LibInit( ); //初始化CH375程序庫和CH375芯片,操作成功返回0 status=CH375_Wait_Init(); //等待U盤插入時產(chǎn)生中斷,INT回復(fù)高電平 if(status==USB_INT_CONNECT) //如果狀態(tài)碼表明U盤已連接 { UART_Send_Str("U盤已插入\n"); } else { UART_Send_Str("U盤插入錯誤\n"); } CH375_Write_Cmd(CMD_DISK_INIT); status=CH375_Wait_Init(); } void main() { CH375_PORT_INT(); do { CH375_Write_Cmd(CMD_SET_USB_MODE);//U盤配置 CH375_Write_Cmd(6); CH375_InitDisk();//U盤初始化 } }
正常的話,你設(shè)置模式成功,我們CH375芯片的INT引腳會在插上U盤的時候拉低。這樣的話與你后面的檢測中斷函數(shù)無關(guān),需要你檢測一下我們芯片有沒有正常工作?復(fù)位有沒有完成?設(shè)置模式是否成功(返回0x51)? 另一種情況,如果你產(chǎn)生了低電平,檢測U盤連接不能通過的話,肯定是你的中斷檢測函數(shù)有問題。
檢查了復(fù)位部分,進(jìn)行了RSTI=0;處理后, 發(fā)現(xiàn)插上U盤后,INT有低電平輸出,ACT指示燈也亮了,但是RESULT = CH375LibInit( ); 返回的值是0x81, #define ERR_CH375_ERROR 0x81 /* CH375硬件錯誤,可能需要復(fù)位CH375 */ 請問這個怎么判定哪里有問題呢?
單片機(jī)上電之后需要加50MS以上的延時之后在初始化芯片,或者調(diào)用CH375LibInit();函數(shù)。在調(diào)用之前可以發(fā)送0X06命令測試下硬件。
上電后加了延時,然后調(diào)用CH375LibInit();函數(shù)。有個現(xiàn)象是,我如果不調(diào)用CH375LibInit();調(diào)用初始化芯片函數(shù),執(zhí)行下面這個函數(shù)時,程序會卡死!應(yīng)該還是初始化失敗了! uchar CH375_Wait_Init()//等待中斷信號,回復(fù)高電平 { INT=1; while(INT); CH375_Write_Cmd(CMD_GET_STATUS); return CH375_Read_Dat(); } 求高手 有沒有別的可能性幫忙分析下~
補(bǔ)充上述:也即返回來的是0x5f,不是0x51, #define CMD_RET_SUCCESS 0x51 /* 命令操作成功 */ #define CMD_RET_ABORT 0x5F /* 命令操作失敗 */ 請問這個是硬件問題,還是程序的故障呢?
你應(yīng)該測試命令(0x06)都沒有通過,這一般都是硬件問題。你可以直接用電腦的串口調(diào)試助手軟件調(diào)試一下,如果不行說明硬件有問題。
現(xiàn)在測試通過了,設(shè)置了波特率 CH375_Write_Cmd(CMD_SET_BAUDRATE); 之后,返回值為0x51;