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<Fifo_Size;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<SendLenth;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);
USB通信协议源代码教学提纲 来自淘豆网www.taodocs.com转载请标明出处.