原创USB通信协议的理解流程描述.docx
《原创USB通信协议的理解流程描述.docx》由会员分享,可在线阅读,更多相关《原创USB通信协议的理解流程描述.docx(15页珍藏版)》请在冰豆网上搜索。
原创USB通信协议的理解流程描述
[原创]USB通信协议的理解,流程,描述
做了一段时间的USB方面的开发,虽然是现成的方案,我们只需要搞清楚它的架构,再添加我们的代码就行了。
空闲之余,研究了一下USB通信过程,也把82A851R部分的汇编代码重新用C语言描述了一篇(仅是描述,不代表能真正运行)。
发现汇编代码条理性太在太差了,不好读。
一把C语言的代码一写,马上觉得清楚很多。
废话少说,开始贴图,贴代码。
================下面是将一些函数重新用C语言描述了一遍============
#defineBYTEunsignedchar
//**************************************************
// 基本定义函数
BYTEFIFO_RD_CHECK(BYTEnum)
{
BYTEFIFO_FLAG=0;
UCC|=num;//选择Endpoint,0,1,2,3,4,
MISC&=0xf8;//低3位置0
MISC|=0X00;//TX位置0;
Delay_3us();
MISC|=0X01;//SetRequest
Delay_28us();
if(MISC&0X40!
=0) FIFO_FLAG=0x0f;//READY
if(MISC&0x80!
=0) FIF0_FLAG&=0xf0;//Len0Detected
MISC&=0xfe;//clearREQ
returnFIFO_FLAG;
}
BYTEFIFO_WR_CHECK(BYTEnum)
BYTEFIFO_FLAG=0;//后4位表示Ready位,前四位表示Len0位的状态是否有被设置
MISC|=0X02;//TX位置0;
voidRead_FIFO(BYTE*Fifo_Addr,BYTEFifo_Size,BYTE*buffer)
inti=0;
MISC|=0x01;//SetRequest
for(i=0;i { buffer[i]=Fifo_Addr[0];//从FIFO地址取值 Delay_28us(); if(MISC&0x40==0) break;//NotReady } MISC^=0X02;//改变TX位状态 Delay_3us(); MISC&=0XFE;//ClearRequest}voidWrite_FIFO(BYTE*Fifo_Addr,BYTESendLenth,BYTE*buffer){ inti=0; MISC|=0X01;//SetRequest for(i=0;i { Fifo_Addr[0]=buffer[i];//将要发送的数据放至相应的Fifo中 Delay_28us(); if(MISC&0x40==0) break;//NotReady } MISC^=0X02;//改变TX位状态 Delay_3us(); MISC&=0XFE;//ClearRequest}BOOLCheck_Real_Cmd(){ BYTEbFlag_Real_Cmd=FALSE; if(MISC&0X20!=0) bFlag_Real_Cmd=TRUE; if(MISC&0X80!=0) bFlag_Real_Cmd=TRUE; returnbFlag_Real_Cmd;}voidSend_hand(){ BOOLIsRealCmd,Status_Flag; while(1) { IsRealCmd=Check_Real_Cmd(); if(IsRealCmd==TRUE) return; else { Status_Flag=FIFO_WR_CHECK(0); if(Status_Flag&0x0f!=0)//Fifo_Ready break; else continue; } } MISC|=0x01;//SetRequset MISC^=0X02;//改变TX位状态 Delay_3us(); MISC&=0XFE;//ClearRequest}voidcontrol_read(WORD*rom_dataptr,BYTE*buffer)//从中读取数据,{ //rom_dataptr是全局的在其他函数中赋值改变 BYTEtemp,i=0; if(buffer[7]!=0)//FIFO_WLENGTHH return; if(buffer[6]==0)//FIFO_WLENGTHL return; if(buffer[6]>data_start[0])//请求的数据超出ROM数据 return; data_count=buffer[6]; if(MISC&0x40!=0)//是控制指令 return; if(data_count==0) { Send_Hand_Shake(); return; } //开始真正的control_read while(1) { if(bFlag_RD_HTable==0)//ReadLowByte { bFlag_RD_HTable=1; buffer[i]=(BYTE)*rom_dataptr;//取其低位 i++; data_count--;//全局变量,要发送的总长度 if(data_count<=1) break; if(i+1==8)//FIFO_size=8 break; } else//ReadHightByte { bFlag_RD_HTable=0; buffer[i]=(BYTE)(*rom_dataptr)>>8;//取其高位 rom_dataptr++;//将ROM指针前移 if(buffer[i]==0x3f) continue; else { i++; if(data_count<=1) break; if(i+1==8) break; } } }//填充完毕,结束循环,开始向FIFO发送数据 while(1) { if(Check_Real_Cmd()==TRUE) return; if(FIFO_WR_CHECK(0)&0xff==0)continue;//NotReady } Write_FIFO(Fifo_0_Addr,0x02,buffer); }//**************************************************// SetAddress(): 重新设定Endpoint地址函数//**************************************************voidSetAddress(BYTE*buffer){ BYTEDev_Addr; Dev_Addr=buffer[2]//FIFO_OUT3,FIFO_WVALUEL SIES|=0x01;//主机从设备读操作后将更新在AWR中的地址,否则为0则立即更新 Dev_Addr&=0XFE; USB_AWR=Dev_Addr; Send_Hand_Shake();}//**************************************************// SetConfiguration(): 设置配置函数//**************************************************voidSetConfiguration(BYTE*buffer,BYTE*USB_Configuration){ USVC|=0x80; PGA_CTRL|=0x80; *USB_Configuration=buffer[2];//FIFO_WVALUEL STALL&=0x00;//设置好以上的寄存器 Send_Hand_Shake();}//**************************************************// ClearFeature(): 清徐Feature函数//**************************************************voidClearFeature(BYTE*buffer){ BYTEtemp; temp=buffer[2];//FIFO_wValueL if(temp=0x01) { Send_Hand_Shake(); } else STALL0|=0x01;//SendStall0();}voidClearFeature_Endpoint(BYTE*buffer){ BYTEtemp; temp=buffer[4];//FIFO_wIndexL if(bFlag_SetConfiguration_Ready==TRUE);//表明已经配置过了 temp=GetPipeBit(temp);//获取对应位 temp=~temp;//取反 STALL=temp&STALL;//与STALL寄存器相与,将需要的位置0 Send_Hand_Shake();}//**************************************************// SetFeature(): 设置Feature函数// 包括Endpoint部分//**************************************************voidSetFeature(BYTE*buffer){ BYTEFIFO_wValueL=buffer[2]; BYTEFIFO_wValueH=buffer[3]; if(FIFO_wValueH==0x00) { if(FIFO_wValueL==0x01) { Send_Hand_Shake(); } else STALL0|=0x01;//SendStall0(); } elseif(FIFO_wValueH>=0X81<=0X84) { if(FIFO_wValueL==0x00) { Send_Hand_Shake(); } else STALL0|=0x01;//SendStall0(); } else STALL0|=0x01;//SendStall0();}voidSetFeature_Endpoint(BYTE*buffer){ BYTEtemp; temp=buffer[4];//FIFO_wIndexL if(bFlag_SetConfiguration_Ready!=TRUE) return;//有没有被SetConfiguration()设置 temp&=0x7f; temp=GetPipeBit(temp);//获取对应位 STALL=temp|STALL;//将指定的Enpoint置1 Send_Hand_Shake();}//**************************************************// SetInterface(): 设置Interface函数// //**************************************************BOOLSetInterface(BYTE*buffer,BYTE*USB_Interface_Alt,BYTE*USB_Interface){ *USB_Interface_Alt=buffer[2];//FIFO_WVALUEL *USB_Interface=buffer[4];//FIFO_WINDEXL PA|=0X01;//SetPA.0 Send_Hand_Shake(); returnTRUE;}//**************************************************// GetDescriptor(): 获取Descriptor// 描述的函数//**************************************************voidGetDescriptor(BYTE*buffer){ BYTEFIFO_WvalueH=buffer[3]; BYTEFIFO_wIndexL=buffer[4]; switch(FIFO_WvalueH) { case01://device,80060001 GetDeviceDescriptor(); return; case02://configurationDescriptor80060002 GetConfigurationDescriptor(); return; case03://string,80060003 GetStringDescriptor(); default: break; } //********************************** //****ThentestforHIDclassDescriptor //*********************************** if(FIFO_wIndexL==0x03)//CheckInterface3,被配置为HID { switch(FIFO_WvalueH) { case22://report,81060022 GetReportDescriptor(); break; case21://HID,81060021 GetHIDDescriptor(); break; default: STALL0|=0x01;//SendStall0();//无法解析的情况 break; } } else STALL0|=0x01;//SendStall0();//无法解析的情况}voidGetDeviceDescriptor(BYTE*buffer){ BYTEdata_count; BYTE*data_start; data_count=device_desc_table[0];//低字节存放长度 data_start=device_desc_table; }//**************************************************// GetStatus(): 设置USB状态的函数 // 包括Endpoint部分//**************************************************voidGetStatus(BYTE*buffer){ BYTEFIFO_SendLen=0X02; buffer[0]=0x00; buffer[1]=0x01; while(1) { if(Check_Real_Cmd()==TRUE)break;//估计是Len0=1,结束会话 if(FIFO_WR_CHECK(0)==FALSE)continue; } Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);}GetStatus_Endpoint(BYTE*buffer){ BYTEFIFO_SendLen=0X02; BYTEtemp; temp=buffer[4];//FIFO_wIndexL,表示要检测的Endpoint号 temp&=0x7f; temp=GetPipeBit(temp);//获取位数如:000000101B=>00100000B if(temp&STALL==TRUE)//要检测的位置1 buffer[0]=1; elsebuffer[0]=0; buffer[1]=0; while(1) { if(Check_Real_Cmd()==TRUE)break;//估计是Len0=1,结束会话 if(FIFO_WR_CHECK(0)==FALSE)continue; } Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);}//**************************************************// GetConfiguration(): 设置配置的函数 // //**************************************************voidGetConfiguration(BYTE*buffer,BYTEUSB_Configuration){ BYTEFIFO_SendLen; buffer[0]=USB_Configuration; FIFO_SendLen=0x01; while(1) { if(Check_Real_Cmd()==TRUE)return; if(FIFO_WR_CHECK(0)&0x0f!=0)//FifoReady break; } Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);}//**************************************************// GetInterface(): 获取Interface接口的函数 // //******************************************
buffer[i]=Fifo_Addr[0];//从FIFO地址取值
if(MISC&0x40==0) break;//NotReady
MISC^=0X02;//改变TX位状态
MISC&=0XFE;//ClearRequest
voidWrite_FIFO(BYTE*Fifo_Addr,BYTESendLenth,BYTE*buffer)
for(i=0;i { Fifo_Addr[0]=buffer[i];//将要发送的数据放至相应的Fifo中 Delay_28us(); if(MISC&0x40==0) break;//NotReady } MISC^=0X02;//改变TX位状态 Delay_3us(); MISC&=0XFE;//ClearRequest}BOOLCheck_Real_Cmd(){ BYTEbFlag_Real_Cmd=FALSE; if(MISC&0X20!=0) bFlag_Real_Cmd=TRUE; if(MISC&0X80!=0) bFlag_Real_Cmd=TRUE; returnbFlag_Real_Cmd;}voidSend_hand(){ BOOLIsRealCmd,Status_Flag; while(1) { IsRealCmd=Check_Real_Cmd(); if(IsRealCmd==TRUE) return; else { Status_Flag=FIFO_WR_CHECK(0); if(Status_Flag&0x0f!=0)//Fifo_Ready break; else continue; } } MISC|=0x01;//SetRequset MISC^=0X02;//改变TX位状态 Delay_3us(); MISC&=0XFE;//ClearRequest}voidcontrol_read(WORD*rom_dataptr,BYTE*buffer)//从中读取数据,{ //rom_dataptr是全局的在其他函数中赋值改变 BYTEtemp,i=0; if(buffer[7]!=0)//FIFO_WLENGTHH return; if(buffer[6]==0)//FIFO_WLENGTHL return; if(buffer[6]>data_start[0])//请求的数据超出ROM数据 return; data_count=buffer[6]; if(MISC&0x40!=0)//是控制指令 return; if(data_count==0) { Send_Hand_Shake(); return; } //开始真正的control_read while(1) { if(bFlag_RD_HTable==0)//ReadLowByte { bFlag_RD_HTable=1; buffer[i]=(BYTE)*rom_dataptr;//取其低位 i++; data_count--;//全局变量,要发送的总长度 if(data_count<=1) break; if(i+1==8)//FIFO_size=8 break; } else//ReadHightByte { bFlag_RD_HTable=0; buffer[i]=(BYTE)(*rom_dataptr)>>8;//取其高位 rom_dataptr++;//将ROM指针前移 if(buffer[i]==0x3f) continue; else { i++; if(data_count<=1) break; if(i+1==8) break; } } }//填充完毕,结束循环,开始向FIFO发送数据 while(1) { if(Check_Real_Cmd()==TRUE) return; if(FIFO_WR_CHECK(0)&0xff==0)continue;//NotReady } Write_FIFO(Fifo_0_Addr,0x02,buffer); }//**************************************************// SetAddress(): 重新设定Endpoint地址函数//**************************************************voidSetAddress(BYTE*buffer){ BYTEDev_Addr; Dev_Addr=buffer[2]//FIFO_OUT3,FIFO_WVALUEL SIES|=0x01;//主机从设备读操作后将更新在AWR中的地址,否则为0则立即更新 Dev_Addr&=0XFE; USB_AWR=Dev_Addr; Send_Hand_Shake();}//**************************************************// SetConfiguration(): 设置配置函数//**************************************************voidSetConfiguration(BYTE*buffer,BYTE*USB_Configuration){ USVC|=0x80; PGA_CTRL|=0x80; *USB_Configuration=buffer[2];//FIFO_WVALUEL STALL&=0x00;//设置好以上的寄存器 Send_Hand_Shake();}//**************************************************// ClearFeature(): 清徐Feature函数//**************************************************voidClearFeature(BYTE*buffer){ BYTEtemp; temp=buffer[2];//FIFO_wValueL if(temp=0x01) { Send_Hand_Shake(); } else STALL0|=0x01;//SendStall0();}voidClearFeature_Endpoint(BYTE*buffer){ BYTEtemp; temp=buffer[4];//FIFO_wIndexL if(bFlag_SetConfiguration_Ready==TRUE);//表明已经配置过了 temp=GetPipeBit(temp);//获取对应位 temp=~temp;//取反 STALL=temp&STALL;//与STALL寄存器相与,将需要的位置0 Send_Hand_Shake();}//**************************************************// SetFeature(): 设置Feature函数// 包括Endpoint部分//**************************************************voidSetFeature(BYTE*buffer){ BYTEFIFO_wValueL=buffer[2]; BYTEFIFO_wValueH=buffer[3]; if(FIFO_wValueH==0x00) { if(FIFO_wValueL==0x01) { Send_Hand_Shake(); } else STALL0|=0x01;//SendStall0(); } elseif(FIFO_wValueH>=0X81<=0X84) { if(FIFO_wValueL==0x00) { Send_Hand_Shake(); } else STALL0|=0x01;//SendStall0(); } else STALL0|=0x01;//SendStall0();}voidSetFeature_Endpoint(BYTE*buffer){ BYTEtemp; temp=buffer[4];//FIFO_wIndexL if(bFlag_SetConfiguration_Ready!=TRUE) return;//有没有被SetConfiguration()设置 temp&=0x7f; temp=GetPipeBit(temp);//获取对应位 STALL=temp|STALL;//将指定的Enpoint置1 Send_Hand_Shake();}//**************************************************// SetInterface(): 设置Interface函数// //**************************************************BOOLSetInterface(BYTE*buffer,BYTE*USB_Interface_Alt,BYTE*USB_Interface){ *USB_Interface_Alt=buffer[2];//FIFO_WVALUEL *USB_Interface=buffer[4];//FIFO_WINDEXL PA|=0X01;//SetPA.0 Send_Hand_Shake(); returnTRUE;}//**************************************************// GetDescriptor(): 获取Descriptor// 描述的函数//**************************************************voidGetDescriptor(BYTE*buffer){ BYTEFIFO_WvalueH=buffer[3]; BYTEFIFO_wIndexL=buffer[4]; switch(FIFO_WvalueH) { case01://device,80060001 GetDeviceDescriptor(); return; case02://configurationDescriptor80060002 GetConfigurationDescriptor(); return; case03://string,80060003 GetStringDescriptor(); default: break; } //********************************** //****ThentestforHIDclassDescriptor //*********************************** if(FIFO_wIndexL==0x03)//CheckInterface3,被配置为HID { switch(FIFO_WvalueH) { case22://report,81060022 GetReportDescriptor(); break; case21://HID,81060021 GetHIDDescriptor(); break; default: STALL0|=0x01;//SendStall0();//无法解析的情况 break; } } else STALL0|=0x01;//SendStall0();//无法解析的情况}voidGetDeviceDescriptor(BYTE*buffer){ BYTEdata_count; BYTE*data_start; data_count=device_desc_table[0];//低字节存放长度 data_start=device_desc_table; }//**************************************************// GetStatus(): 设置USB状态的函数 // 包括Endpoint部分//**************************************************voidGetStatus(BYTE*buffer){ BYTEFIFO_SendLen=0X02; buffer[0]=0x00; buffer[1]=0x01; while(1) { if(Check_Real_Cmd()==TRUE)break;//估计是Len0=1,结束会话 if(FIFO_WR_CHECK(0)==FALSE)continue; } Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);}GetStatus_Endpoint(BYTE*buffer){ BYTEFIFO_SendLen=0X02; BYTEtemp; temp=buffer[4];//FIFO_wIndexL,表示要检测的Endpoint号 temp&=0x7f; temp=GetPipeBit(temp);//获取位数如:000000101B=>00100000B if(temp&STALL==TRUE)//要检测的位置1 buffer[0]=1; elsebuffer[0]=0; buffer[1]=0; while(1) { if(Check_Real_Cmd()==TRUE)break;//估计是Len0=1,结束会话 if(FIFO_WR_CHECK(0)==FALSE)continue; } Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);}//**************************************************// GetConfiguration(): 设置配置的函数 // //**************************************************voidGetConfiguration(BYTE*buffer,BYTEUSB_Configuration){ BYTEFIFO_SendLen; buffer[0]=USB_Configuration; FIFO_SendLen=0x01; while(1) { if(Check_Real_Cmd()==TRUE)return; if(FIFO_WR_CHECK(0)&0x0f!=0)//FifoReady break; } Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);}//**************************************************// GetInterface(): 获取Interface接口的函数 // //******************************************
Fifo_Addr[0]=buffer[i];//将要发送的数据放至相应的Fifo中
BOOLCheck_Real_Cmd()
BYTEbFlag_Real_Cmd=FALSE;
if(MISC&0X20!
=0) bFlag_Real_Cmd=TRUE;
if(MISC&0X80!
returnbFlag_Real_Cmd;
voidSend_hand()
BOOLIsRealCmd,Status_Flag;
while
(1)
IsRealCmd=Check_Real_Cmd();
if(IsRealCmd==TRUE)
return;
else
Status_Flag=FIFO_WR_CHECK(0);
if(Status_Flag&0x0f!
=0)//Fifo_Ready
break;
continue;
MISC|=0x01;//SetRequset
voidcontrol_read(WORD*rom_dataptr,BYTE*buffer)//从中读取数据,
{ //rom_dataptr是全局的在其他函数中赋值改变
BYTEtemp,i=0;
if(buffer[7]!
=0)//FIFO_WLENGTHH
if(buffer[6]==0)//FIFO_WLENGTHL
if(buffer[6]>data_start[0])//请求的数据超出ROM数据
data_count=buffer[6];
if(MISC&0x40!
=0)//是控制指令
if(data_count==0)
Send_Hand_Shake();
//开始真正的control_read
if(bFlag_RD_HTable==0)//ReadLowByte
bFlag_RD_HTable=1;
buffer[i]=(BYTE)*rom_dataptr;//取其低位
i++;
data_count--;//全局变量,要发送的总长度
if(data_count<=1)
if(i+1==8)//FIFO_size=8
else//ReadHightByte
bFlag_RD_HTable=0;
buffer[i]=(BYTE)(*rom_dataptr)>>8;//取其高位
rom_dataptr++;//将ROM指针前移
if(buffer[i]==0x3f)
if(i+1==8)
}//填充完毕,结束循环,开始向FIFO发送数据
if(Check_Real_Cmd()==TRUE) return;
if(FIFO_WR_CHECK(0)&0xff==0)continue;//NotReady
Write_FIFO(Fifo_0_Addr,0x02,buffer);
// SetAddress():
重新设定Endpoint地址函数
voidSetAddress(BYTE*buffer)
BYTEDev_Addr;
Dev_Addr=buffer[2]//FIFO_OUT3,FIFO_WVALUEL
SIES|=0x01;//主机从设备读操作后将更新在AWR中的地址,否则为0则立即更新
Dev_Addr&=0XFE;
USB_AWR=Dev_Addr;
// SetConfiguration():
设置配置函数
voidSetConfiguration(BYTE*buffer,BYTE*USB_Configuration)
USVC|=0x80;
PGA_CTRL|=0x80;
*USB_Configuration=buffer[2];//FIFO_WVALUEL
STALL&=0x00;//设置好以上的寄存器
// ClearFeature():
清徐Feature函数
voidClearFeature(BYTE*buffer)
BYTEtemp;
temp=buffer[2];//FIFO_wValueL
if(temp=0x01)
STALL0|=0x01;//SendStall0();
voidClearFeature_Endpoint(BYTE*buffer)
temp=buffer[4];//FIFO_wIndexL
if(bFlag_SetConfiguration_Ready==TRUE);//表明已经配置过了
temp=GetPipeBit(temp);//获取对应位
temp=~temp;//取反
STALL=temp&STALL;//与STALL寄存器相与,将需要的位置0
// SetFeature():
设置Feature函数
// 包括Endpoint部分
voidSetFeature(BYTE*buffer)
BYTEFIFO_wValueL=buffer[2];
BYTEFIFO_wValueH=buffer[3];
if(FIFO_wValueH==0x00)
if(FIFO_wValueL==0x01)
elseif(FIFO_wValueH>=0X81<=0X84)
if(FIFO_wValueL==0x00)
else STALL0|=0x01;//SendStall0();
voidSetFeature_Endpoint(BYTE*buffer)
if(bFlag_SetConfiguration_Ready!
=TRUE)
return;//有没有被SetConfiguration()设置
temp&=0x7f;
STALL=temp|STALL;//将指定的Enpoint置1
// SetInterface():
设置Interface函数
//
BOOLSetInterface(BYTE*buffer,BYTE*USB_Interface_Alt,BYTE*USB_Interface)
*USB_Interface_Alt=buffer[2];//FIFO_WVALUEL
*USB_Interface=buffer[4];//FIFO_WINDEXL
PA|=0X01;//SetPA.0
returnTRUE;
// GetDescriptor():
获取Descriptor
// 描述的函数
voidGetDescriptor(BYTE*buffer)
BYTEFIFO_WvalueH=buffer[3];
BYTEFIFO_wIndexL=buffer[4];
switch(FIFO_WvalueH)
case01:
//device,80060001
GetDeviceDescriptor();
case02:
//configurationDescriptor80060002
GetConfigurationDescriptor();
case03:
//string,80060003
GetStringDescriptor();
default:
//**********************************
//****ThentestforHIDclassDescriptor
//***********************************
if(FIFO_wIndexL==0x03)//CheckInterface3,被配置为HID
case22:
//report,81060022
GetReportDescriptor();
case21:
//HID,81060021
GetHIDDescriptor();
STALL0|=0x01;//SendStall0();//无法解析的情况
voidGetDeviceDescriptor(BYTE*buffer)
BYTEdata_count;
BYTE*data_start;
data_count=device_desc_table[0];//低字节存放长度
data_start=device_desc_table;
// GetStatus():
设置USB状态的函数
voidGetStatus(BYTE*buffer)
BYTEFIFO_SendLen=0X02;
buffer[0]=0x00;
buffer[1]=0x01;
if(Check_Real_Cmd()==TRUE)break;//估计是Len0=1,结束会话
if(FIFO_WR_CHECK(0)==FALSE)continue;
Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);
GetStatus_Endpoint(BYTE*buffer)
temp=buffer[4];//FIFO_wIndexL,表示要检测的Endpoint号
temp=GetPipeBit(temp);//获取位数如:
000000101B=>00100000B
if(temp&STALL==TRUE)//要检测的位置1
buffer[0]=1;
elsebuffer[0]=0;
buffer[1]=0;
// GetConfiguration():
设置配置的函数
voidGetConfiguration(BYTE*buffer,BYTEUSB_Configuration)
BYTEFIFO_SendLen;
buffer[0]=USB_Configuration;
FIFO_SendLen=0x01;
if(Check_Real_Cmd()==TRUE)return;
if(FIFO_WR_CHECK(0)&0x0f!
=0)//FifoReady
// GetInterface():
获取Interface接口的函数
//******************************************
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1