我用CH372内置固件模式,端点2批量上传时遇到这样的问题: 端点2下传数据(命令要求返回采集到的信息),单片机通过端点2批量返回采集到的信息,但每次返回的都是上次采集的信号,本次要求返回的采集信息只有再下次下传命令时才返回;谁知道是怎么回事?代码如下: #include "config.h" stcRxBUF CRBuf; UINT8 TempBuf[15]; UINT8 T=1; void Delay50ms( ) { UINT8 i, j,k; for ( i=10; i!=0; i-- ) for ( j=10; j!=0; j-- ) for ( k=10; k!=0; k-- ) ; } void Delay60ms( ) { UINT8 i, j,k; for ( i=20; i!=0; i-- ) for ( j=20; j!=0; j-- ) for ( k=10; k!=0; k-- ) ; } __irq void IRQ_Eint2(void) { UINT8 InterruptStatus; UINT8 i, length,CRC; UINT8 buffer[16]; UINT32 status=0; stcTxBUF CTbuf; const UINT8 CRCerr[]={"CRC ERROR!",}; const UINT8 CRCOK[]={"CRC OK!",}; const UINT8 CanErr[]={"CAN Chun Err!",}; CH375_WR_CMD_PORT( CMD_GET_STATUS ); InterruptStatus = CH375_RD_DAT_PORT( ); switch ( InterruptStatus ) { case USB_INT_EP2_OUT: { CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); length = CH375_RD_DAT_PORT( ); for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); CRC=GetCRCR8_8C(buffer,15); if(buffer[0] > 0) { status =1; } else { if(CRC==buffer[15]) { CTbuf.TxFrameInfo.Bits.PRIO_BIT = buffer[0]; //CAN通道号 CTbuf.TxFrameInfo.Bits.FF_BIT =(buffer[1]&0x80) >> 7; //帧格式 CTbuf.TxFrameInfo.Bits.RTR_BIT = (buffer[1]&0x40)>> 6; //帧类型 CTbuf.TxFrameInfo.Bits.DLC_BIT = buffer[1]&0x0f; //数据长度 for(i=0;i<4;i++) { *((UINT8 *)&CTbuf.TxCANID.Word +i)=buffer[5-i]; } memcpy((UINT8 *)&CTbuf.CANTDA,&buffer[6],4); memcpy((UINT8 *)&CTbuf.CANTDB,&buffer[10],4); status = CANSendData(buffer[0],buffer[14],&CTbuf); if(T==1) { T++; CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); CH375_WR_DAT_PORT( sizeof(CRCOK) ); for ( i = 0; i CH375_WR_DAT_PORT(CRCOK[i] ); } } else { if(T==1) { T++; CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); CH375_WR_DAT_PORT( sizeof(CRCerr) ); for ( i = 0; i CH375_WR_DAT_PORT(CRCerr[i] ); } } } if(status==1) { if(T==1) { T++; CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); CH375_WR_DAT_PORT( sizeof(CanErr)); for ( i = 0; i CH375_WR_DAT_PORT( CanErr[i]); } } break; } case USB_INT_EP2_IN: { T=1; CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); break; } default: { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); break; } } EXTINT=0x04; VICVectAddr=0x00; } void CH375_Init( ) { UINT8 i; CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); CH375_WR_DAT_PORT( 0x55 ); i=0x55; i=~i; if ( CH375_RD_DAT_PORT( ) != i ) { for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); CH375_RD_DAT_PORT( ); } CH375_WR_CMD_PORT( 0 ); Delay50ms( ); } CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 2 ); for ( i=100; i!=0; i-- ) { if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } EXTMODE=0x00; EXTPOLAR=0x00; VICIntSelect = 0x00000000; VICVectCntl0 = 0x20|16; VICVectAddr0 = (UINT32)IRQ_Eint2; EXTINT=0x04; VICIntEnable = (1<<16); }

int main(void ) { UINT8 i; TargetResetInit(); PINSEL0 = 0x0000C000; PINSEL1 = 0x00000000; CH375_Init( ); for(i=0;i<1;i++) { InitCAN(i); } while ( 1 ) { for(i=0;i<1;i++) { if(ReadCANRcvCyBuf(i,&CRBuf) == 0) { TempBuf[0]=0x00; TempBuf[1]=(UINT8)CRBuf.CANRcvFS.Bits.DLC_BIT | ((UINT8)CRBuf.CANRcvFS.Bits.FF_BIT << 7)| ((UINT8)CRBuf.CANRcvFS.Bits.RTR_BIT << 6); for(i=0;i<4;i++) { TempBuf[2+i]=*((UINT8 *)&CRBuf.RxCANID + 3-i); } for(i=0;i<4;i++) { TempBuf[6+i]=*((UINT8 *)&CRBuf.CANRDA+i); } for(i=0;i<4;i++) { TempBuf[10+i]=*((UINT8 *)&CRBuf.CANRDB+i); } TempBuf[14]=GetCRCR8_8C(TempBuf,14); if(T==1) { T++; CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); CH375_WR_DAT_PORT( 15 ); for ( i = 0; i <15; i ++ ) CH375_WR_DAT_PORT(TempBuf[i]); } } } for(i=0;i<1;i++) { if(CANMOD(i).Bits.RM_BIT != 0) { CANGSR(i).Word=0; CANMOD(i).Bits.RM_BIT=0x00; CANCMR(i).Word=0x02; } } } return(0); }