我是用的ATMEGA2561 串口方式連接的CH376,可以連上U盤,可以建立文件.但文件不能寫入數(shù)據(jù).中斷發(fā)現(xiàn)返回值為0x14; 相關(guān)程序如下;
/**************************************************************************** 函數(shù)功能:uart0初始化 入口參數(shù):c 出口參數(shù): ****************************************************************************/
void uart0_init() { int baud; baud=9600; UCSR0B=0x00; UCSR0A=0x00; UCSR0C=0x06; //0000 0110,UCSZ01=1,UCSZ00=1;8位字符,1位停止位 UBRR0L=(fosc/16/baud-1)%256; UBRR0H=(fosc/16/baud-1)/256; //波特率設(shè)置 UCSR0B=(1<<3)|(1<<4); //接受,發(fā)送使能;接受中斷使能 }
/**************************************************************************** 函數(shù)功能:向CH376 寫數(shù)據(jù) 入口參數(shù):mData 出口參數(shù): **************************************************************************/
void xWriteCH376Data(uchar mData) { while(!(UCSR0A&(1<<5))); UDR0=mData; } /**************************************************************************** 函數(shù)功能:從CH376 讀數(shù)據(jù) 入口參數(shù): 出口參數(shù): ****************************************************************************/
uchar xReadCH376Data(void) { uchar Rdata; uint i; delay_us(2); while(!(UCSR0A&(1<<7))); Rdata=UDR0; return Rdata; }
/**************************************************************************** 函數(shù)功能:向CH376 寫命令 入口參數(shù): 出口參數(shù): ****************************************************************************/ void xWriteCH376Cmd(uchar mCmd) { xWriteCH376Data(0x57); xWriteCH376Data(0xAB); xWriteCH376Data(mCmd); }
/**************************************************************************** 函數(shù)功能:等待CH376中斷(INT#低電平) 入口參數(shù): 出口參數(shù):中斷狀態(tài)碼,超時則返回ERR_USB_UNKNOWN ****************************************************************************/
uchar Wait376Interrupt( void ) /* 等待CH376中斷(INT#低電平),返回中斷狀態(tài)碼, 超時則返回ERR_USB_UNKNOWN */ { uint32 i; for ( i = 0; i < 5000000; i ++ ) { /* 計(jì)數(shù)防止超時,默認(rèn)的超時時間,與單片機(jī)主頻有關(guān) */ if ( Query376Interrupt( ) ) return( CH376GetIntStatus( ) ); /* 檢測到中斷 */ /* 在等待CH376中斷的過程中,可以做些需要及時處理的其它事情 */ } return( ERR_USB_UNKNOWN ); /* 不應(yīng)該發(fā)生的情況 */ }
uchar Query376Interrupt( void ) { delay_us(1); if(!(UCSR0A&(1<<7))) return(FALSE); else { return(TRUE); } }
/**************************************************************************** 函數(shù)功能:獲取中斷狀態(tài)并取消中斷請求 入口參數(shù): 出口參數(shù): ****************************************************************************/
uchar CH376GetIntStatus( void ) /* 獲取中斷狀態(tài)并取消中斷請求 */ { uchar s; xWriteCH376Cmd( CMD_GET_STATUS ); s = xReadCH376Data( ); //delay_us(10); return( s ); }
uchar CH376SendCmdWaitInt( uchar mCmd ) /* 發(fā)出命令碼后,等待中斷 */ { xWriteCH376Cmd( mCmd ); return( Wait376Interrupt( ) ); }
/**************************************************************************** 函數(shù)功能:以字節(jié)為單位向當(dāng)前位置寫入數(shù)據(jù)塊 入口參數(shù): 出口參數(shù): ****************************************************************************/
UINT8 CH376ByteWrite( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ) /* 以字節(jié)為單位向當(dāng)前位置寫入數(shù)據(jù)塊 */ { uchar s,l; xWriteCH376Cmd( CMD2H_BYTE_WRITE ); xWriteCH376Data( (UINT8)ReqCount ); xWriteCH376Data( (UINT8)(ReqCount>>8) ); if ( RealCount ) *RealCount = 0; (//l = Wait376Interrupt( ); //l = Wait376Interrupt( );) 加入這兩行,可以寫數(shù)據(jù),但只能寫30個字節(jié),超過30出現(xiàn)亂碼;
while ( 1 ) { s = Wait376Interrupt( ); if ( s == USB_INT_DISK_WRITE ) { l = CH376WriteReqBlock( buf ); /* 向內(nèi)部指定緩沖區(qū)寫入請求的數(shù)據(jù)塊,返回長度 */ xWriteCH376Cmd( CMD0H_BYTE_WR_GO ); buf += l; if ( RealCount ) *RealCount += l; } else return( s ); /* 錯誤 */ } }
/**************************************************************************** 函數(shù)功能:向內(nèi)部指定緩沖區(qū)寫入請求的數(shù)據(jù)塊 入口參數(shù): 出口參數(shù):返回長度 ****************************************************************************/
UINT8 CH376WriteReqBlock( PUINT8 buf ) /* 向內(nèi)部指定緩沖區(qū)寫入請求的數(shù)據(jù)塊,返回長度 */ { UINT8 s, l; xWriteCH376Cmd( CMD01_WR_REQ_DATA ); l=s=xReadCH376Data( ); /* 長度 */ if ( l ) { do { xWriteCH376Data( *buf ); buf ++; } while ( -- l ); } nop(); return( s ); }
/**************************************************************************** 函數(shù)功能:保存表格抬頭顯示 入口參數(shù): 出口參數(shù): ****************************************************************************/
uchar Excel_Display_CH376() { uchar Dbuf[45]; uchar iSet,i;
/*產(chǎn)品編號*/ Dbuf[0]=0xb2; Dbuf[1]=0xfa; Dbuf[2]=0xc6; Dbuf[3]=0xb7; Dbuf[4]=0xb1; Dbuf[5]=0xe0; Dbuf[6]=0xba; Dbuf[7]=0xc5; Dbuf[8]=0x09;
/*測試參數(shù)*/ Dbuf[9]=0xb2; Dbuf[10]=0xe2; Dbuf[11]=0xca; Dbuf[12]=0xd4; Dbuf[13]=0xb2; Dbuf[14]=0xce; Dbuf[15]=0xca; Dbuf[16]=0xfd; Dbuf[17]=0x09;
/*實(shí)測電壓*/ Dbuf[18]=0xca; Dbuf[19]=0xb5; Dbuf[20]=0xb2; Dbuf[21]=0xe2; Dbuf[22]=0xb5; Dbuf[23]=0xe7; Dbuf[24]=0xd1; Dbuf[25]=0xb9; Dbuf[26]=0x09;
/*實(shí)測電流(阻)*/ Dbuf[27]=0xca; Dbuf[28]=0xb5; Dbuf[29]=0xb2; Dbuf[30]=0xe2; Dbuf[31]=0xb5; Dbuf[32]=0xe7; Dbuf[33]=0xc1; Dbuf[34]=0xf7; Dbuf[35]=0x28; Dbuf[36]=0xd7; Dbuf[37]=0xe8; Dbuf[38]=0x29; Dbuf[39]=0x09;
/*分選*/ Dbuf[40]=0xb7; Dbuf[41]=0xd6; Dbuf[42]=0xd1; Dbuf[43]=0xa1; Dbuf[44]=0x09;
iSet=CH376ByteWrite(Dbuf,45,NULL);
return( iSet ); }
void main() { uchar iSet; uart0_init(); iSet=CH376FileCreate("\\GAB.XLS"); iSet=SetFileCreateTime( "\\GAB.XLS", MAKE_FILE_DATE( 2012,12, 26 ), MAKE_FILE_TIME( 15, 22, 30 ) ); iSet=CH376FileOpen("\\GAB.XLS"); if(iSet==USB_INT_SUCCESS) { iSet=CH376ByteLocate(0xFFFFFFFF);
Excel_Display_CH376(); iSet=CH376FileClose(TRUE); } }