[求助]374的USB上传函数

void USB_UpData(UINT8 mAddr, UINT8 mLen, PUINT8 mBuf) { //while(!(Read374Byte( REG_INTER_FLAG )&0x01)==0x01);//等待中断完成 //Write374Byte(REG_INTER_FLAG, (Read374Byte( REG_INTER_FLAG ))|0x01); while(busy); unsigned char i; buff[0]=0x3f; buff[1]=mLen; for ( i =2; i < mLen+2; i ++ ) buff[i] = *(mBuf+mAddr+i-2); Write374Block( RAM_ENDP2_TRAN, 64, buff ); // USB回传,此处的长度不需要为h Write374Byte( REG_USB_LENGTH, 64 ); Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) )) ; busy=1; }

busy初始化为0,在in中断里,将busy清零,在主函数里调用上传函数,发现程序无法进入in中断,也就是说数据没有发到pc上边。我怀疑是 Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) )) ; 的原因,但是不太清楚问题出在哪

需要看下你的完整程序,正常的写数据是这样写的: Write374Block( RAM_ENDP2_TRAN, 64, buff ); // USB回传,此处的长度不需要为h Write374Byte( REG_USB_LENGTH, 64); Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) ) );//启动发送 当产生上传中断之后,需要在中断函数里面只有处理: case USB_INT_EP2_IN: { // 批量端点上传成功,未处理 Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_NAK( Read374Byte( REG_USB_ENDP2 ) ) ^BIT_EP2_TRAN_TOG ); break; } 还有就是你发送第一包的数据的时候,需要等计算机完成对CH374的枚举过程,具体的是在计算机发送SET_CONFIG的SETUP命令之后在发送数据才是可以的


是这样的 我的想法是在中断里将busy清零,但是按照您上述的写法,根本就无法进入in中断 同时也应该不是枚举未完成的问题 因为我把官方例程

else if ( s & BIT_IF_TRANSFER ) { // USB传输完成 s = Read374Byte( REG_USB_STATUS ); switch( s & BIT_STAT_PID_ENDP ) { // USB设备中断状态 case USB_INT_EP2_OUT: { // 批量端点下传成功 UINT8 buf[64]; if ( s & BIT_STAT_TOG_MATCH ) { // 仅同步包 l = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_ENDP2_RECV, l, buf ); for ( s = 0; s < l; s ++ ) buf[s] ^= 0xFF; // 数据取反由计算机验证 Write374Block( RAM_ENDP2_TRAN, l, buf ); // 演示回传 Write374Byte( REG_USB_LENGTH, l ); Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_RECV_TOG ); // Write374Index( REG_USB_ENDP2 ); // 对于并口连接可以用本行及下面一行代替上一行的程序,减少写一次index的时间,提高效率 // Write374Data( M_SET_EP2_TRAN_ACK( Read374Data0( ) ) ^ BIT_EP2_RECV_TOG ); } break; }

我把下面for ( s = 0; s < l; s ++ ) buf[s] ^= 0xFF; // 数据取反由计算机验证 Write374Block( RAM_ENDP2_TRAN, l, buf ); // 演示回传 Write374Byte( REG_USB_LENGTH, l ); Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_RECV_TOG ); // Write374Index( REG_USB_ENDP2 ); // 对于并口连接可以用本行及下面一行代替上一行的程序,减少写一次index的时间,提高效率 // Write374Data( M_SET_EP2_TRAN_ACK( Read374Data0( ) ) ^ BIT_EP2_RECV_TOG ); 部分的所有l都改成了64,就无法上传数据了,但是按说应该和l无关的 求解释


只有登录才能回复,可以选择微信账号登录