部分程序如下 void mCH372Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char length, c1, len; unsigned char *pBuf; unsigned char mBuf[64]; CH372_WR_CMD_PORT(CMD_GET_STATUS); /* 获取中断状态并取消中断请求 */ InterruptStatus =CH372_RD_DAT_PORT(); /* 获取中断状态 */ IE1 = 0; /* 清中断标志,对应于INT0中断 */ switch(InterruptStatus){ // 分析中断状态 case USB_INT_EP2_OUT: // 批量端点下传成功 pBuf=mBuf; //数据未处理 CH372_WR_CMD_PORT(CMD_RD_USB_DATA); //发出读数据命令 length=CH372_RD_DAT_PORT(); //首先读出的是长度 for(len=0;len!=length;len++,pBuf++)*pBuf=CH372_RD_DAT_PORT(); //将数据读入到缓冲区 // pBuf=mBuf; // 演示回传 // CH372_WR_CMD_PORT(CMD_WR_USB_DATA7); //发出写上传端点命令 // CH372_WR_DAT_PORT(length); // for(len=0;len!=length;len++,pBuf++)CH372_WR_DAT_PORT(*pBuf); //将数据写入上传端点 break; case USB_INT_EP2_IN: //批量端点上传成功,未处理 CH372_WR_CMD_PORT (CMD_UNLOCK_USB); //释放缓冲区 break; case USB_INT_EP1_IN: //中断端点上传成功,未处理 CH372_WR_CMD_PORT (CMD_UNLOCK_USB); //释放缓冲区 break; case USB_INT_EP1_OUT: //中断端点下传成功,未处理 CH372_WR_CMD_PORT(CMD_RD_USB_DATA); //发出读数据命令 if(length=CH372_RD_DAT_PORT()){ //长度为0跳出 for(len=0;len!=length;len++)c1=CH372_RD_DAT_PORT(); //取出下传数据 } // CH372_WR_CMD_PORT (CMD_UNLOCK_USB); //释放缓冲区,如果前面没有CMD_RD_USB_DATA命令则使用本命令 break; case USB_INT_EP0_SETUP: //控制端点建立成功 CH372_WR_CMD_PORT(CMD_RD_USB_DATA); length=CH372_RD_DAT_PORT(); for(len=0;len!=length;len++)request.buffer[len]=CH372_RD_DAT_PORT(); // 取出数据 if(length==0x08){ mVarSetupLength=request.buffer[6]&0x7f; //控制传输数据长度最大设置为128 if((c1=request.r.bmReuestType)&0x40){ //厂商请求,未处理 } if((c1=request.r.bmReuestType)&0x20){ //类请求,未处理 } if(!((c1=request.r.bmReuestType)&0x60)){ //标准请求 mVarSetupRequest=request.r.bRequest; //暂存标准请求码 switch(request.r.bRequest){ // 分析标准请求 case DEF_USB_CLR_FEATURE: //清除特性 if((c1=request.r.bmReuestType&0x1F)==0X02){ //不是端点不支持 switch(request.buffer[4]){ case 0x82: CH372_WR_CMD_PORT(CMD_SET_ENDP7); //清除端点2上传 CH372_WR_DAT_PORT(0x8E); //发命令清除端点 break; case 0x02: CH372_WR_CMD_PORT(CMD_SET_ENDP6); CH372_WR_DAT_PORT(0x80); //清除端点2下传 break; case 0x81: CH372_WR_CMD_PORT(CMD_SET_ENDP5); //清除端点1上传 CH372_WR_DAT_PORT(0x8E); break; case 0x01: CH372_WR_CMD_PORT(CMD_SET_ENDP4); //清除端点1下传 CH372_WR_DAT_PORT(0x80); break; default: break; } } else{ CH372FLAGERR=1; //不支持的清除特性,置错误标志 } break; case DEF_USB_GET_STATUS: //获得状态 request.buffer[0]=0; request.buffer[1]=0; //上传状态 break; case DEF_USB_SET_ADDRESS: //设置地址 VarUsbAddress=request.buffer[2]; //暂存USB主机发来的地址 break; case DEF_USB_GET_DESCR: //获得描述符 if(request.buffer[3]==1) //设备描述符上传 VarSetupDescr=DevDes; else if(request.buffer[3]==2) //配置描述符上传 VarSetupDescr=ConDes; else if(request.buffer[3]==3) { if ( request.buffer[2]== 0 ) VarSetupDescr=LangDes; else VarSetupDescr=SerDes; //做字符串处理 } mCH372DesUp(); //其余描述符不支持 break; case DEF_USB_GET_CONFIG: //获得配置 request.buffer[0]=0; //没有配置则传0 if(CH372CONFLAG) request.buffer[0]=1; //已经配置则传1;这是在描述符里规定的 break; case DEF_USB_SET_CONFIG: //设置配置 CH372CONFLAG=0; CH372ACT=1; if ( request.buffer[2] != 0 ) { CH372CONFLAG=1; //设置配置标志 CH372ACT=0; //输出配置完成信号 } break; case DEF_USB_GET_INTERF: //得到接口 request.buffer[0]=1; //上传接口数,本事例只支持一个接口 break; default : CH372FLAGERR=1; //不支持的标准请求 break; } } } else { //不支持的控制传输,不是8字节的控制传输 CH372FLAGERR=1; } if(!CH372FLAGERR) mCH372Ep0Up(); //没有错误/调用数据上传,,长度为0上传为状态 else { CH372_WR_CMD_PORT(CMD_SET_ENDP3); //设置端点1为STALL,指示一个错误 CH372_WR_DAT_PORT(0x0F); } break; case USB_INT_EP0_IN: //控制端点上传成功 if(mVarSetupRequest==DEF_USB_GET_DESCR){ //描述符上传 mCH372DesUp(); mCH372Ep0Up(); } else if(mVarSetupRequest==DEF_USB_SET_ADDRESS){ //设置地址 CH372_WR_CMD_PORT(CMD_SET_USB_ADDR); CH372_WR_DAT_PORT(VarUsbAddress); //设置USB地址,设置下次事务的USB地址 } CH372_WR_CMD_PORT (CMD_UNLOCK_USB); //释放缓冲区 break; case USB_INT_EP0_OUT: //控制端点下传成功 CH372_WR_CMD_PORT(CMD_RD_USB_DATA); //发出读数据命令 if(length=CH372_RD_DAT_PORT()){ //长度为0跳出 for(len=0;len!=length;len++)c1=CH372_RD_DAT_PORT(); //取出下传数据 } break; default: if((InterruptStatus&0x03)==0x03){ //总线复位 CH372FLAGERR=0; //错误清0 CH372CONFLAG=0; //配置清0 mVarSetupLength=0; CH372ACT=1; //清配置完成输出 } else{ //命令不支持 ; } CH372_WR_CMD_PORT (CMD_UNLOCK_USB); //释放缓冲区 break; } }