📄 ch375.c.bak
字号:
//-------------------------------
void mCh375Interrupt(void)
{
unsigned char InterruptStatus;
unsigned char length, len;
CH375_WR_CMD_PORT(CMD_GET_STATUS); // 获取中断状态并取消中断请求
InterruptStatus = CH375_RD_DAT_PORT(); // 获取中断状态
RECV_LEN=0;
switch( InterruptStatus ) // 分析中断状态
{
case USB_INT_EP2_OUT: // 批量端点/端点2收到数据, 下传成功
if(0x00!=(rdData())) // 收到数据非空
{
if(0x11==RECV_BUFFER[0])
{
led=!led;
}
}
if(debug) uartPutStr("EP2_OUT\n\r");
break;
case USB_INT_EP2_IN: //批量端点/端点2数据上传成功, 未处理
if(debug) uartPutStr("EP2_IN\n\r");
CH375_WR_CMD_PORT (CMD_UNLOCK_USB);
break;
case USB_INT_EP1_IN: //中断端点/端点1数据上传成功,未处理
if(debug) uartPutStr("EP1_IN\n\r");
CH375_WR_CMD_PORT (CMD_UNLOCK_USB);
break;
case USB_INT_EP1_OUT: //中断端点/端点1数据下传成功
if(debug) uartPutStr("EP1_OUT\n\r");
if(0x00!=rdData())
{
break;
}
break;
case USB_INT_EP0_SETUP: //控制端点建立成功, 端点0接受到数据, setup成功
if(debug&DBG_SETUP) uartPutStr("#SETUP\n\r");
CH375_WR_CMD_PORT( CMD_RD_USB_DATA );
length=CH375_RD_DAT_PORT();
for( len=0; len<length; len++ )
{
request.buffer[len] = CH375_RD_DAT_PORT(); // 取出数据
}
if(debug&DBG_SETUP) uartPrint("setup dat: %\n\r", request.buffer, length);
if( 0x08==length )
{
mVarSetupLength=(request.buffer[6]&0x7f); //控制传输数据长度最大设置为128
if( !(request.r.bmReuestType&0x60) ) //标准请求
{
mVarSetupRequest=request.r.bRequest; //暂存标准请求码, 标准请求码有12种, 其中有2种是为将来保留的
switch( request.r.bRequest ) //分析标准请求
{
//标准请求, 1
case DEF_USB_CLR_FEATURE: //请求, 清除特性, 现在只支持端口
if(debug) uartPutStr("clr feature\n\r");
if((request.r.bmReuestType&0x1F)==0x02) //接受者, 0-设备, 1-接口, 2-端点, 3-其他
{
switch( request.buffer[4] ) //表明是哪一个接口或节点, bit7-表方向, 1-入; bit0-3端点号
{
case 0x82: //端点2, 入
CH375_WR_CMD_PORT( CMD_SET_ENDP7 ); //设置端点2发送器, 清除端点2上传
CH375_WR_DAT_PORT( 0x8E ); //发命令清除端点
break;
case 0x02: //端点2, 出
CH375_WR_CMD_PORT( CMD_SET_ENDP6 );
CH375_WR_DAT_PORT( 0x80 ); //清除端点2下传
break;
case 0x81: //
CH375_WR_CMD_PORT( CMD_SET_ENDP5 ); //清除端点1上传
CH375_WR_DAT_PORT( 0x8E );
break;
case 0x01:
CH375_WR_CMD_PORT( CMD_SET_ENDP4 ); //清除端点1下传
CH375_WR_DAT_PORT( 0x80 );
break;
default:
break;
}
}
else
{
CH375FLAGERR=1; //不支持的清除特性,置错误标志
}
break;
//标准请求, 2
case DEF_USB_GET_STATUS: //标准请求, 获得状态
if(debug) uartPutStr("G_STATUS\n\r");
request.buffer[0]=0;
request.buffer[1]=0; //上传状态
break;
//标准请求, 3
case DEF_USB_SET_ADDRESS: //标准请求, 设置地址
VarUsbAddress=request.buffer[2]; //暂存USB主机发来的地址
break;
//标准请求, 4
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; //做字符串处理
}
mCh375DesUp();*/
switch(request.buffer[3])
{
case USB_DEVICE: //设备描述苻
if(debug) uartPutStr("DEVICE\n\r");
VarSetupDescr=DevDes;
break;
case USB_CONFIGURATION: //配置描述符
if(debug) uartPutStr("CONFIG\n\r");
VarSetupDescr=ConDes;
break;
case USB_STRING: //字符串描述符
if(debug) uartPutStr("STRING\n\r");
if(0==request.buffer[2])
VarSetupDescr=LangDes;
else
VarSetupDescr=SerDes;
break;
case USB_HID: //HID描述符
if(debug) uartPutStr("HID\n\r");
VarSetupDescr=Class_Descriptor;
break;
case USB_REPORT: //
if(debug) uartPutStr("REPORT\n\r");
VarSetupDescr=hid_report_desc_table;
break;
default:
if(debug) uartPutStr("NO_DES\n\r");
break;
}
mCh375DesUp(); //其余描述符不支持
break;
case DEF_USB_SET_FEATURE:
CH375_WR_CMD_PORT( CMD_SET_ENDP4 ); //清除端点1下传
CH375_WR_DAT_PORT( 0x80 );
break;
//标准请求, 5
case DEF_USB_GET_CONFIG: //获得配置
if(debug) uartPutStr("GET_CONFIG\n\r");
request.buffer[0]=0; //没有配置则传0
if( CH375CONFLAG )
request.buffer[0]=1; //已经配置则传1, 这是在描述符里规定的
break;
//标准请求, 6
case DEF_USB_SET_CONFIG: //设置配置
if(debug) uartPutStr("SET_CONFIG\n\r");
CH375CONFLAG=0;
if( request.buffer[2] != 0 )
{
CH375CONFLAG=1; //设置配置标志
}
break;
//标准请求, 7
case DEF_USB_GET_INTERF: //获得接口
if(debug) uartPutStr("GET_INTERF\n");
request.buffer[0]=1; //上传接口数,本事例只支持一个接口
break;
default :
if(debug) uartPutStr("NAK_REQUEST\n");
CH375FLAGERR=1; //不支持的标准请求
break;
}//分析标准请求结束
}//标准请求处理结束
//类请求
else if(0x20==(request.r.bmReuestType&0x60))
{
if(debug) uartPutStr("Request class\n\r");
}
//非标准请求, 保留
else
{
;
}
}//长度是8的数据处理结束
else //不支持的控制传输,不是8字节的控制传输
{
CH375FLAGERR=1;
}
if( !CH375FLAGERR )
mCh375Ep0Up(); //没有错误/调用数据上传,长度为0上传为状态
else
{
CH375_WR_CMD_PORT( CMD_SET_ENDP3 ); //设置端点0发送器的工作方式, 为STALL,指示一个错误
CH375_WR_DAT_PORT( 0x0F );
if(debug&DBG_SETUP) uartPutStr("error!\n\r");
//flash_led();
}
break;
case USB_INT_EP0_IN: //控制端点上传成功
if(1) uartPutStr("0_IN\n\r");
if( mVarSetupRequest==DEF_USB_GET_DESCR ) //描述符上传
{
mCh375DesUp();
mCh375Ep0Up();
}
else
if( mVarSetupRequest==DEF_USB_SET_ADDRESS ) //设置地址
{
CH375_WR_CMD_PORT( CMD_SET_USB_ADDR );
CH375_WR_DAT_PORT( VarUsbAddress ); //设置USB地址,设置下次事务的USB地址
if(debug) uartPrint("SET_ADDRESS: %\n\r", &VarUsbAddress, 1);
}
CH375_WR_CMD_PORT(CMD_UNLOCK_USB); //释放缓冲区
break;
case USB_INT_EP0_OUT: //控制端点下传成功
if(debug&DBG_SETUP) uartPutStr("EP0_OUT!\n\r");
/*
CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); //发出读数据命令
length=CH375_RD_DAT_PORT();
if( length>0 ) //长度为0跳出
{
for( len=0;len!=length;len++ )
CH375_RD_DAT_PORT(); //取出下传数据
}*/
len=rdData();
if(0==len)
{
if(debug&DBG_SETUP) uartPutStr("length 0x00!\n\r");
}
else
{
if(debug&DBG_SETUP) uartPrint("EP0_OUT %\n\r", RECV_BUFFER, len);
}
break;
default:
if(debug&DBG_SETUP) uartPrint("status defaut %!\n\r", &InterruptStatus, 1);
if( 0x03==(InterruptStatus&0x03) ) //总线复位
{
CH375FLAGERR=0; //错误清0
CH375CONFLAG=0; //配置清0
mVarSetupLength=0;
}
else
{ //命令不支持
flash_led();
}
CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); //释放缓冲区
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -