USB通信协议.docx

上传人:b****0 文档编号:10065955 上传时间:2023-05-23 格式:DOCX 页数:18 大小:57.92KB
下载 相关 举报
USB通信协议.docx_第1页
第1页 / 共18页
USB通信协议.docx_第2页
第2页 / 共18页
USB通信协议.docx_第3页
第3页 / 共18页
USB通信协议.docx_第4页
第4页 / 共18页
USB通信协议.docx_第5页
第5页 / 共18页
USB通信协议.docx_第6页
第6页 / 共18页
USB通信协议.docx_第7页
第7页 / 共18页
USB通信协议.docx_第8页
第8页 / 共18页
USB通信协议.docx_第9页
第9页 / 共18页
USB通信协议.docx_第10页
第10页 / 共18页
USB通信协议.docx_第11页
第11页 / 共18页
USB通信协议.docx_第12页
第12页 / 共18页
USB通信协议.docx_第13页
第13页 / 共18页
USB通信协议.docx_第14页
第14页 / 共18页
USB通信协议.docx_第15页
第15页 / 共18页
USB通信协议.docx_第16页
第16页 / 共18页
USB通信协议.docx_第17页
第17页 / 共18页
USB通信协议.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

USB通信协议.docx

《USB通信协议.docx》由会员分享,可在线阅读,更多相关《USB通信协议.docx(18页珍藏版)》请在冰点文库上搜索。

USB通信协议.docx

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位的状态是否有被设置

   UCC|=num;//选择Endpoint,0,1,2,3,4,

   MISC&=0xf8;//低3位置0

   MISC|=0X02;//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;

}

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接口的函数            

//         

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

voidGet

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2