if (InitCH376Host() == USB_INT_SUCCESS) { if (CH376DiskConnect()== USB_INT_SUCCESS) { while(1); } else { if(CH376DiskMount() != USB_INT_SUCCESS) { Dlayms(100); while(1); } else { strcpy(buf, "\ABC.TXT"); if(CH376FileOpen(buf)==USB_INT_SUCCESS) { CH376ByteRead( buf, 30, &RealCount ); } } } } 前面都正常,運(yùn)行 CH376ByteRead( buf, 30, &RealCount );時(shí),s = Wait376Interrupt( );s=0x14,不是USB_INT_DISK_READ ,一直進(jìn)不去,不知什么原因。下面是CH376ByteRead函數(shù)。 UINT8 CH376ByteRead( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ) /* 以字節(jié)為單位從當(dāng)前位置讀取數(shù)據(jù)塊 */ { UINT8 s; WriteCH376Cmd(CMD2H_BYTE_READ); WriteCH376Data((UINT8)ReqCount); WriteCH376Data((UINT8)(ReqCount>>8)); if (RealCount) { *RealCount = 0; } while ( 1 ) { s = Wait376Interrupt( ); if ( s == USB_INT_DISK_READ ) { s = CH376ReadBlock( buf ); // 從當(dāng)前主機(jī)端點(diǎn)的接收緩沖區(qū)讀取數(shù)據(jù)塊,返回長(zhǎng)度 WriteCH376Cmd( CMD0H_BYTE_RD_GO ); buf += s; if ( RealCount ) { *RealCount += s; } } else { return( s ); /* 錯(cuò)誤 */ } } }
你的問(wèn)題有可能是中斷那塊的問(wèn)題,查一下中斷引腳電平的變化狀態(tài)。另外,串口讀寫的話,查詢中斷狀態(tài)之前可以清一下串口接收標(biāo)志。
謝謝,確實(shí)是這個(gè)問(wèn)題,昨天晚上調(diào)試,可以讀取數(shù)據(jù)了,但是好像只能讀取15個(gè)數(shù)據(jù),不知道什么原因?
字節(jié)讀取一次最多可以讀65535字節(jié)數(shù)據(jù),首先檢查一下你的讀緩沖區(qū)是否足夠大?其次,檢查一下讀數(shù)據(jù)的中斷狀態(tài)。
UINT8 CH376ReadBlock( PUINT8 buf ) /* 從當(dāng)前主機(jī)端點(diǎn)的接收緩沖區(qū)讀取數(shù)據(jù)塊,返回長(zhǎng)度 */ { UINT8 s, l,tmp; WriteCH376Cmd( CMD01_RD_USB_DATA0 ); s = l = ReadCH376Data( ); /* 長(zhǎng)度 */ s = l = ReadCH376Data( ); /* 長(zhǎng)度 */ if ( l ) { do { *buf = ReadCH376Data(); // tmp = CH376GetIntStatus(); buf ++; } while ( -- l ); } return( s ); } 讀取的文件長(zhǎng)度是42,但在讀取12個(gè)數(shù)據(jù)之后,就一直停在 unsigned char ReadCH376Data(void) { unsigned char RcvData; BYTE IIRValue; while ((U0LSR & 0x01) == 0); /* 等待接收標(biāo)志置位 */ RcvData= U0RBR; /* 讀取數(shù)據(jù) */ return (RcvData); } 收不到數(shù)據(jù),讀緩沖區(qū)1000字節(jié),此事中斷為高電平。
你的問(wèn)題應(yīng)該是串口接收不到數(shù)據(jù)。如果前面正常通過(guò),命令發(fā)送正常讀取到文件長(zhǎng)度之后,會(huì)有對(duì)應(yīng)文件長(zhǎng)度的數(shù)據(jù)。檢查一下是否有超時(shí)處理等問(wèn)題?
我也遇到這個(gè)問(wèn)題,現(xiàn)象一模一樣,其他初始化正常,就是到字節(jié)發(fā)送函數(shù)那總是等不到USB_INT_DISK_WRITE,一直進(jìn)不了數(shù)據(jù)發(fā)送
還有就是我用的是stm32異步串口4波特率9600函數(shù)已經(jīng)接收到了USB_INT_DISK_WRIT但是在u8 CH376ByteWrite( u8 *buf, u16 ReqCount, u16 *RealCount )調(diào)用u8 Wait376Interrupt(void) 時(shí)就是沒(méi)有返回0x1e 中斷接收函數(shù) u8 Wait376Interrupt(void) { u16 Init=0; while(Query376Interrupt() == FALSE);
Init=CH376GetIntStatus();//這里有返回0x1e SendByte(Init); return(Init); // 檢測(cè)到中斷,返回中斷狀態(tài)碼 }
但是到
u8 CH376ByteWrite( u8 *buf, u16 ReqCount, u16 *RealCount ) /* 以字節(jié)為單位向當(dāng)前位置寫入數(shù)據(jù)塊 */ { u8 s; xWriteCH376Cmd( CMD2H_BYTE_WRITE ); xWriteCH376Data( (u8)ReqCount ); xWriteCH376Data( (u8)(ReqCount>>8) ); // xEndCH376Cmd( ); //僅用于spi接口通信 if ( RealCount ) { *RealCount = 0; } while ( 1 ) {
s = Wait376Interrupt( ); //這里沒(méi)有返回0x1e而是0x14 SendByte(0xfe); SendByte(s); if ( s == USB_INT_DISK_WRITE ) { SendByte(0x77); s = CH376WriteReqBlock( buf ); /* 向內(nèi)部指定緩沖區(qū)寫入請(qǐng)求的數(shù)據(jù)塊,返回長(zhǎng)度 */ xWriteCH376Cmd( CMD0H_BYTE_WR_GO ); buf += s; if ( RealCount ) { *RealCount += s; } } /* else if ( s == USB_INT_SUCCESS ) return( s );*/ /* 結(jié)束 */ else return( s ); /* 錯(cuò)誤 */ } } 求大伙幫忙看看,謝謝
串口波特率9600下在哪個(gè)地方收到USB_INT_DISK_WRIT?如果你寫入數(shù)據(jù)比較少的話,只會(huì)產(chǎn)生一次USB_INT_DISK_WRIT,之后會(huì)產(chǎn)生0x14中斷。
u8 Wait376Interrupt(void) { u16 Init=0; while(Query376Interrupt() == FALSE); Init=CH376GetIntStatus();//這里有返回0x1e SendByte(Init); return(Init); // 檢測(cè)到中斷,返回中斷狀態(tài)碼 }這里有返回0x1E
但是這個(gè)函數(shù)u8 CH376ByteWrite( u8 *buf, u16 ReqCount, u16 *RealCount )調(diào)用u8 Wait376Interrupt(void)沒(méi)有返回0x1E一直返回是0x14 u8 CH376ByteWrite( u8 *buf, u16 ReqCount, u16 *RealCount ) /* 以字節(jié)為單位向當(dāng)前位置寫入數(shù)據(jù)塊 */ { u8 s; xWriteCH376Cmd( CMD2H_BYTE_WRITE ); xWriteCH376Data( (u8)ReqCount ); xWriteCH376Data( (u8)(ReqCount>>8) ); // xEndCH376Cmd( ); //僅用于spi接口通信 if ( RealCount ) { *RealCount = 0; } while ( 1 ) {
s = Wait376Interrupt( ); //這里沒(méi)有返回0x1e而是0x14//
if ( s == USB_INT_DISK_WRITE ) {
SendByte(0x77); s = CH376WriteReqBlock( buf ); /* 向內(nèi)部指定緩沖區(qū)寫入請(qǐng)求的數(shù)據(jù)塊,返回長(zhǎng)度 */ xWriteCH376Cmd( CMD0H_BYTE_WR_GO ); buf += s; if ( RealCount ) { *RealCount += s; } } /* else if ( s == USB_INT_SUCCESS ) return( s );*/ /* 結(jié)束 */ else return( s ); /* 錯(cuò)誤 */ } }
在u8 CH376ByteWrite( u8 *buf, u16 ReqCount, u16 *RealCount )函數(shù)里的 s = Wait376Interrupt( );一次都沒(méi)有接收到0x1E,一直是0x14所以數(shù)據(jù)沒(méi)有從串口發(fā)出
你CH376ByteWrite這個(gè)函數(shù)里等中斷的函數(shù)就是調(diào)用的第9樓的函數(shù)。CH376串口操作的話,如果使用查詢接收狀態(tài)碼來(lái)獲取中斷狀態(tài),可以在獲取中斷狀態(tài)之前清一下串口接收標(biāo)志。
是這個(gè)u8 Wait376Interrupt(void) { u16 Init=0; //是在這里清串口接收標(biāo)志。 while(Query376Interrupt() == FALSE); Init=CH376GetIntStatus();//這里有返回0x1e SendByte(Init); return(Init); // 檢測(cè)到中斷,返回中斷狀態(tài)碼 }這里有返回0x1E
你說(shuō)的那邊返回0x1E是哪個(gè)函數(shù)里面調(diào)用的?檢查你寫需要你發(fā)送的命令和數(shù)據(jù)是否正確?
在u8 Wait376Interrupt(void)里面調(diào)用CH376GetIntStatus();有0x1e返回!但是在u8 CH376ByteWrite( u8 *buf, u16 ReqCount, u16 *RealCount )函數(shù)里調(diào)用u8 Wait376Interrupt(void)沒(méi)有返回0x1e,就這里很困惑?