📄 usbex.c
字号:
for(len=0;len!=length;len++)request.buffer[len]=CH375_RD_DAT_PORT(); // 取出数据
if(length==0x08){
mVarSetupLength=request.buffer[6]; //控制传输数据长度最大设置为128
if((c1=request.r.bmReuestType)&0x40){ //厂商请求,未处理
}
if((c1=request.r.bmReuestType)&0x20){// printf("b\n"); //类请求,未处理
if(request.buffer[1]==0x0a){//printf("c\n");
} //SET_IDLE
else if(request.buffer[1]==0x09){
UPDATA_FLAG=1;
}
}
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:
CH375_WR_CMD_PORT(CMD_SET_ENDP7); //清除端点2上传
CH375_WR_DAT_PORT(0x8E); //发命令清除端点
break;
case 0x02:
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;
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]==0x22) {
VarSetupDescr=Hid_des;
// if ( request.buffer[2]== 0 ) VarSetupDescr=LangDes;
// else VarSetupDescr=SerDes; //做字符串处理
}
mCh375DesUp(); //其余描述符不支持
break;
case DEF_USB_GET_CONFIG: //获得配置
request.buffer[0]=0; //没有配置则传0
if(CH375CONFLAG) request.buffer[0]=1; //已经配置则传1;这是在描述符里规定的
break;
case DEF_USB_SET_CONFIG: //设置配置
CH375CONFLAG=0;
CH375ACT=1;
if ( request.buffer[2] != 0 ) {
CH375CONFLAG=1; //设置配置标志
CH375ACT=0; //输出配置完成信号
}
break;
case DEF_USB_GET_INTERF: //得到接口
request.buffer[0]=1; //上传接口数,本事例只支持一个接口
break;
default :
CH375FLAGERR=1; //不支持的标准请求
break;
}
}
}
else { //不支持的控制传输,不是8字节的控制传输
CH375FLAGERR=1;
}
if(!CH375FLAGERR) mCh375Ep0Up(); //没有错误/调用数据上传,,长度为0上传为状态
else {
CH375_WR_CMD_PORT(CMD_SET_ENDP3); //设置端点1为STALL,指示一个错误
CH375_WR_DAT_PORT(0x0F);
}
break;
case USB_INT_EP0_IN: //控制端点上传成功
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地址
}
CH375_WR_CMD_PORT (CMD_UNLOCK_USB); //释放缓冲区
break;
case USB_INT_EP0_OUT: //控制端点下传成功
CH375_WR_CMD_PORT(CMD_RD_USB_DATA); //发出读数据命令
if(length=CH375_RD_DAT_PORT()){ //长度为0跳出
// printf("len=%d\n",(unsigned int)length);
for(len=0;len!=length;len++){buf1[len]=CH375_RD_DAT_PORT(); //取出下传数据
// printf("buf=%02x",(unsigned short)buf1[len]);
}
}
// printf("\n");
break;
default:
if((InterruptStatus&0x03)==0x03){ //总线复位
CH375FLAGERR=0; //错误清0
CH375CONFLAG=0; //配置清0
mVarSetupLength=0;
CH375ACT=1; //清配置完成输出
}
else{ //命令不支持
;
}
CH375_WR_CMD_PORT (CMD_UNLOCK_USB); //释放缓冲区
CH375_RD_DAT_PORT();
break;
}
}
up_data( )
{
unsigned char i;
// for(i=0;i!=8;i++) //发送0按键值
// buf[i]=0;
// buf[2]=0x59;
CH375_WR_CMD_PORT(CMD_WR_USB_DATA5); //发出写上传端点命令
CH375_WR_DAT_PORT(8);
for(i=0;i!=8;i++)
CH375_WR_DAT_PORT(buf[i]);
}
main( ) {
unsigned char data_flag=0; //有无数据标志
unsigned char i,time,k;
unsigned char real_data[11]; //需要上传的数据缓冲区
//unsigned char hHD[6];
unsigned long ulHex;
unsigned char idata ucsenddata[11];
unsigned char code uckeycode1[11]={ 0x62 //0
,0x59 //1
,0x5a //2
,0x5b //3
,0x5c //4
,0x5d //5
,0x5e //6
,0x5f //7
,0x60 //8
,0x61 //9
,0x58
};
SPK_P=1;
//SPK_P=1;
Delay50ms( );
Delay50ms( );
Delay50ms( );
Delay50ms( );
RED_LED=0;
// Delay50ms( );
// Delay50ms( );
GREEN_LED=1;
SPK_P=0;
Delay50ms( );
Delay50ms( );
Delay50ms( ); // 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 //
//mInitSTDIO( );
CH375_Init( ); // 初始化CH375 //
//EA=1;
//启动后,不输出数据,
//data_flag=1;
up_time=0; time=0;k=0;
for(i=0;i<8;i++) buf[i]=0;
////////
while(1){ // 主程序 //
if(CH375_INT_WIRE == 0){
SEND: mCH375Interrupt( );
if(data_flag==1) {
if((UPDATA_FLAG==0x01)&&(k<=1)){ //先发八个字节的0包,相当于确保按键的取消
for(i=0;i<8;i++) buf[i]=0;
up_data( );
k++;
}
else {
if((UPDATA_FLAG==0x01)&&(time%2==1)){ //按键按下
if(up_time<=11){
// printf("%d\n",(unsigned short)up_time);
buf[2]=real_data[up_time]; //发送八个字节,相当于发送1个按键
up_data( );
up_time++;
}
}
else if((UPDATA_FLAG==0x01)&&(time%2==0)){ //按键取消
for(i=0;i<8;i++) buf[i]=0;
up_data( );
}
time++;
}
}
//if(up_time==11) { up_time=0; data_flag=0; goto RD;} //循环上传
if(up_time>11)
{
for(i=0;i<8;i++) buf[i]=0;
up_data( );
data_flag=0; up_time=0;
SPK_P=1;
RED_LED=1;
GREEN_LED=0;
Delay50ms( );
Delay50ms( );
RED_LED=0;
GREEN_LED=1;
Delay50ms( );
Delay50ms( );
//Delay50ms( );
//Delay50ms( );
SPK_P=0;
//蜂鸣器、LED 操作
goto SEND;
};
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -