[求助]请高手们帮忙看看,CH375B外置固件模式下的问题

我的板子调试信息如下: 0001 有中断产生;中断状态:07 ;总线复位 0002 有中断产生;中断状态:07 ;总线复位 0003 有中断产生;中断状态:0C ; 0004 端点0接收Setup包:80 06 00 01 00 00 40 00;标准请求输入--获取描述符 0005 端点0上传数据:12 01 10 01 00 00 00 08 ;(设备描述符前8个字节) 0006 端点0 SETUP结束; 0007 有中断产生;中断状态:08 0008 端点0继续上传描述符:15 11 15 00 10 01 00 00 ; 0009 端点0上传成功; 0010 有中断产生;中断状态:00 ;端点0下传成功 0011 有中断产生;中断状态:0C 0012 端点0接收Setup包:00 05 03 00 00 00 00 00; 0013 标准输出请求--设置地址:03 0014 端点0 SETUP结束 0015 有中断产生;中断状态:08 0016 设置USB地址:03 0017 端点0上传成功; 0018 有中断产生;中断状态:0C 0019 端点0接收Setup包:80 06 00 01 00 00 12 00;标准请求输入--获取描述符 0020 端点0上传数据:12 01 10 01 00 00 00 08 0021 端点0 SETUP成功 0022 有中断产生;中断状态:08 0023 端点0继续上传描述符:15 11 15 00 10 01 00 00 ; 0024 端点0上传成功; 0025 有中断产生;中断状态:08 0026 端点0继续上传描述符:00 01 (此时要求上传的18个字节已经上传完成) 0027 端点0上传成功; 0028 有中断产生;中断状态:08 (问题点) 0029 端点0继续上传描述符: 0030 端点0上传成功; 0031 有中断产生;中断状态:00 ;端点0下传成功 0032 有中断产生;中断状态:08 0033 端点0继续上传描述符: 0034 端点0上传成功; 0035 有中断产生;中断状态:00 ;端点0下传成功 0036 有中断产生;中断状态:07 ;总线复位 0037 有中断产生;中断状态:07 ;总线复位

现在的问题是,在(问题点)的位置是不是应该有一个中断状态是0C的中断,然后发送一个获取配置描述符的命令包呢,请各位高手给看看问题出在哪里? 谢谢!

主机在获取完描述符之后 会下传一个0长度的数据包,作为控制传输的握手。 程序是否有很多的串口打印信息,这些信息会浪费许多枚举的时间,因为PC在枚举设备的时候有时间要求,如果设备长时间不响应主机请求,那么主机就会复位设备,从而枚举失败


谢谢!程序里面确实有很多串口打印的信息,我把它们注释掉试试。


我试过了,结果和以前一样,应该不是串口打印信息的问题。 你说的“会下传一个0长度的数据包”,这个应该是有的,就是在(问题点)下3行的“有中断产生;中断状态:00 ;端点0下传成功”。 这之后应该是PC下传个SETUP包呢还是我的板子返回点什么给PC呢?


应该是主机开始设置USB设备地址,也就是SETUP


地址不是设置过一次了吗?在调试信息的第12-17行。 为什么PC发送的命令都还是08呢?


我现在只上传了我的设备描述符:12 01 10 01 00 00 00 08 15 11 15 00 10 01 00 00 00 01  这个会不会有错导致PC没有发送下面的命令呢?


你的程序 可能有什么操作没有执行,导致PC复位你的设备。可以把程序发过来看看


//端点0数据上传 void mCh375Ep0Up() { uint i,len; putstring("MCH375EP0UP"); USART_putchar(mVarSetupLength); USART_putchar(0x0d); USART_putchar(0x0a); if(mVarSetupLength) { //长度不为0传输具体长度的数据 if(mVarSetupLength<=8) { len=mVarSetupLength; mVarSetupLength=0; } //长度小于8则按实际要求的长度输出 else { len=8; mVarSetupLength-=8; } //长度大于8则传输8个,切总长度减8 CH375_WriteCMD(CMD_WR_USB_DATA3); //发出写端点0的命令 Delay1us(); CH375_WriteDAT(len); //写入长度 for(i=0;i!=len;i++) { Delay1us(); CH375_WriteDAT(request.buffer[i]); Delay2us( ); USART_putchar(request.buffer[i]); Delay2us( ); } //循环写入数据 USART_putchar(0x0d); USART_putchar(0x0a); //putstring("shangchuan"); } else { CH375_WriteCMD(CMD_WR_USB_DATA3); //发出写端点0的命令 Delay2us(); CH375_WriteDAT(0); //上传0长度数据,这是一个状态阶段 } }

//*********************************************************

//复制描述符以便上传 void mCh375DesUp() { uchar k; for (k=0; k!=8; k++ ) { request.buffer[k]=*VarSetupDescr; //依次复制8个描述符, VarSetupDescr++; Delay2us( ); USART_putchar(request.buffer[k]); } USART_putchar(0x0d); USART_putchar(0x0a); putstring("MCH375DESUP"); }

//*********************************************************

/* CH375中断服务程序INT7 */ SIGNAL(SIG_INTERRUPT7) //否则用查询,修改熔丝位去掉103模式,对引脚设置成上拉电阻否则进中断就出不来了 { uchar InterruptStatus; uchar length, c1, len; //uchar i; //uint a[16]; //uchar *pBuf; //uchar mBuf[64]; putstring("INT"); CH375_WriteCMD(CMD_GET_STATUS); Delayms(1); InterruptStatus =CH375_ReadDAT(); USART_putchar(InterruptStatus); USART_putchar(0x0d); USART_putchar(0x0a); switch(InterruptStatus) { // 分析中断状态 case USB_INT_EP2_OUT: // 批量端点下传成功 CH375_WriteCMD(CMD_UNLOCK_USB); putstring("EP2 IN"); break; case USB_INT_EP2_IN: //批量端点上传成功 CH375_WriteCMD(CMD_UNLOCK_USB); //释放缓冲区 putstring("EP2 IN"); break; case USB_INT_EP1_IN: //中断端点上传成功,未处理 CH375_WriteCMD(CMD_UNLOCK_USB); //释放缓冲区 putstring("EP1 IN"); break; case USB_INT_EP1_OUT: //中断端点下传成功 CH375_WriteCMD(CMD_RD_USB_DATA); //发出读数据命令 Delay2us(); if( length = CH375_ReadDAT( ) ) { //长度为0跳出 for(len=0;len!=length;len++) { c1=CH375_ReadDAT(); Delay2us(); } //取出下传数据 } //CH375_WriteCMD(CMD_UNLOCK_USB); //释放缓冲区,如果前面没有CMD_RD_USB_DATA命令则使用本命令 putstring("EP1 OUT"); break; case USB_INT_EP0_SETUP: //控制端点建立成功 CH375_WriteCMD(CMD_RD_USB_DATA); Delay2us(); length=CH375_ReadDAT(); USART_putchar(length); USART_putchar(0x0d); USART_putchar(0x0a); for(len=0;len!=length;len++) { request.buffer[len]=CH375_ReadDAT(); // 取出数据 //USART_putchar(0x5B); //for(i=0;i Delay2us(); USART_putchar(request.buffer[len]); //USART_putchar(0x5D); } USART_putchar(0x0d); USART_putchar(0x0a); if(length==0x08)//if(length==0x08) { mVarSetupLength=request.buffer[6]&0x7f; //控制传输数据长度最大设置为128 USART_putchar(mVarSetupLength); USART_putchar(0x0d); USART_putchar(0x0a); if((c1=request.r.bmReuestType)&0x40) //厂商请求,未处理 { } if((c1=request.r.bmReuestType)&0x20)//类请求,未处理 { if(request.buffer[1]==0x0a) { } //SET_IDLE else if(request.buffer[1]==0x09) { UPDATA_FLAG=1; } } if(!((c1=request.r.bmReuestType)&0x60))//标准请求 { mVarSetupRequest=request.r.bRequest; //暂存标准请求码 USART_putchar(request.r.bRequest); USART_putchar(0x0d); USART_putchar(0x0a); switch(request.r.bRequest) { // 分析标准请求 case DEF_USB_CLR_FEATURE: //清除特性 if((c1=request.r.bmReuestType&0x1F)==0X02)//是端点执行线面的语句 { //不是端点不支持 USART_putchar(request.buffer[4]); USART_putchar(0x0d); USART_putchar(0x0a); switch(request.buffer[4]) { case 0x82: CH375_WriteCMD(CMD_SET_ENDP7); //清除端点2上传 Delay2us(); CH375_WriteDAT(0x8E); //发命令清除端点 break; case 0x02: CH375_WriteCMD(CMD_SET_ENDP6); Delay2us(); CH375_WriteDAT(0x80); //清除端点2下传 break; case 0x81: CH375_WriteCMD(CMD_SET_ENDP5); //清除端点1上传 Delay2us(); CH375_WriteDAT(0x8E); break; case 0x01: CH375_WriteCMD(CMD_SET_ENDP4); //清除端点1下传 Delay2us(); CH375_WriteDAT(0x80); break; default: break; } } else { CH375FLAGERR=1; //不支持的清除特性,置错误标志 } putstring("CLR FEATURE"); break; case DEF_USB_GET_STATUS: //获得状态 request.buffer[0]=0; request.buffer[1]=0; //上传状态 putstring("GET STATUS"); break; case DEF_USB_SET_ADDRESS: //设置地址 VarUsbAddress=request.buffer[2]; //暂存USB主机发来的地址 USART_putchar(VarUsbAddress); USART_putchar(0x0d); USART_putchar(0x0a); putstring("SET ADDRESS"); break; case DEF_USB_GET_DESCR: //获得描述符 USART_putchar(request.buffer[3]); USART_putchar(0x0d); USART_putchar(0x0a); 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; //做字符串处理 } else if(request.buffer[3]==0x22) { VarSetupDescr=Hid_des; //报表描述符上传 } mCh375DesUp(); //其余描述符不支持 putstring("GET DESCR"); break; case DEF_USB_GET_CONFIG: //获得配置 request.buffer[0]=0; //没有配置则传0 if(CH375CONFLAG) request.buffer[0]=1; //已经配置则传1;这是在描述符里规定的 putstring("GET CONFIG"); break; case DEF_USB_SET_CONFIG: //设置配置 CH375CONFLAG=0;

if ( request.buffer[2] != 0 ) { CH375CONFLAG=1; //设置配置标志 } putstring("SET CONFIG"); break; case DEF_USB_GET_INTERF: //得到接口 request.buffer[0]=1; //上传接口数,本事例只支持一个接口 putstring("GET INTERF"); break; default : putstring("default"); CH375FLAGERR=1; //不支持的标准请求 break; } } } else { //不支持的控制传输,不是8字节的控制传输 CH375FLAGERR=1; } putstring("MCH"); if(!CH375FLAGERR) mCh375Ep0Up(); //没有错误/调用数据上传,,长度为0上传为状态 else { CH375_WriteCMD(CMD_SET_ENDP3); //设置端点1为STALL,指示一个错误 Delay2us(); CH375_WriteDAT(0x0F); } //CH375_WriteCMD(CMD_UNLOCK_USB);//*****后加的 putstring("EP0 SETUP"); break; case USB_INT_EP0_IN://在枚举阶段都是检测到主机发送IN令牌包后进入中断服务程序USB_INT_EP0_IN来上传描述符.//控制端点上传成功 USART_putchar(mVarSetupRequest); USART_putchar(0x0d); USART_putchar(0x0a); if(mVarSetupRequest==DEF_USB_GET_DESCR) { //描述符上传 mCh375DesUp(); Delay2us( ); mCh375Ep0Up(); putstring("EP0 IF"); } else if(mVarSetupRequest==DEF_USB_SET_ADDRESS) { //设置地址 CH375_WriteCMD(CMD_SET_USB_ADDR); Delay2us(); CH375_WriteDAT(VarUsbAddress); //设置USB地址,设置下次事务的USB地址 USART_putchar(VarUsbAddress); USART_putchar(0x0d); USART_putcha


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