[求助]CH376T 按字節(jié)方式寫入問題

我是用的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); } }

一、AVR的接受緩沖區(qū)有多字節(jié) 在查詢到中斷后376會多給出一個中斷狀態(tài)值(后面再接收一個數(shù)據(jù)才是中斷狀態(tài)值)需要你先清下接收緩沖區(qū),可以改為uchar Query376Interrupt( void ) { unsigned i; delay_us(1); if(!(UCSR0A&(1<<7))) return(FALSE); else { i=UDR; return(TRUE); } } 二、你main函數(shù)流程不標(biāo)準(zhǔn) 建議您按照我們給的例程的前面的初始化過程: s = mInitCH376Host( ); /* 初始化CH376 */ mStopIfError( s ); /* 其它電路初始化 */

while ( 1 ) { printf( "Wait Udisk/SD\n" ); while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) { /* 檢查U盤是否連接,等待U盤插入,對于SD卡,可以由單片機(jī)直接查詢SD卡座的插拔狀態(tài)引腳 */ mDelaymS( 100 ); } mDelaymS( 200 ); /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */

/* 對于檢測到USB設(shè)備的,最多等待100*50mS,主要針對有些MP3太慢,對于檢測到USB設(shè)備并且連接DISK_MOUNTED的,最多等待5*50mS,主要針對DiskReady不過的 */ for ( i = 0; i < 100; i ++ ) { /* 最長等待時間,100*50mS */ mDelaymS( 50 ); printf( "Ready ?\n" ); s = CH376DiskMount( ); /* 初始化磁盤并測試磁盤是否就緒 */ if ( s == USB_INT_SUCCESS ) break; /* 準(zhǔn)備好 */ else if ( s == ERR_DISK_DISCON ) break; /* 檢測到斷開,重新檢測并計(jì)時 */ if ( CH376GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 ) break; /* 有的U盤總是返回未準(zhǔn)備好,不過可以忽略,只要其建立連接MOUNTED且嘗試5*50mS */ } if ( s == ERR_DISK_DISCON ) { /* 檢測到斷開,重新檢測并計(jì)時 */ printf( "Device gone\n" ); continue; } if ( CH376GetDiskStatus( ) < DEF_DISK_MOUNTED ) { /* 未知USB設(shè)備,例如USB鍵盤、打印機(jī)等 */ printf( "Unknown device\n" ); goto UnknownUsbDevice; }


好的,多謝指教.


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

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