1、做了一段时间的 USB 方面的开发,虽然是现成的方案,我们只需要搞清楚它的架构,再添加我们的代码就行了。空闲之余,研究了一下 USB 通信过程,也把 82A851R 部分的汇编代码重新用 C 语言描述了一篇(仅是描述,不代表能真正运行) 。发现汇编代码条理性太在太差了,不好读。一把 C 语言的代码一写,马上觉得清楚很多。废话少说,开始贴图,贴代码。下面是将一些函数重新用 C 语言描述了一遍#define BYTE unsigned char/*/ 基本定义函数/*BYTE FIFO_RD_CHECK(BYTE num)BYTE FIFO_FLAG=0;UCC|=num;/选择 Endpoint
2、,0,1,2,3,4,MISC/低 3 位置 0MISC|=0X00;/TX 位置 0;Delay_3us();MISC|=0X01;/Set RequestDelay_28us();if(MISC/READYif(MISC/Len0 DetectedMISC/clear REQreturn FIFO_FLAG;BYTE FIFO_WR_CHECK(BYTE num)BYTE FIFO_FLAG=0;/后 4 位表示 Ready 位,前四位表示 Len0 位的状态是否有被设置UCC|=num;/选择 Endpoint,0,1,2,3,4,MISC/低 3 位置 0MISC|=0X02;/TX
3、位置 0;Delay_3us();MISC|=0X01;/Set RequestDelay_28us();if(MISC/READYif(MISC/Len0 DetectedMISC/clear REQreturn FIFO_FLAG;void Read_FIFO(BYTE *Fifo_Addr,BYTE Fifo_Size,BYTE *buffer)int i=0;MISC|=0x01;/Set Requestfor(i=0;idata_start0)/请求的数据超出 ROM 数据return;data_count=buffer6;if(MISCif(data_count=0)Send_Ha
4、nd_Shake();return; /开始真正的 control_readwhile(1)if(bFlag_RD_HTable=0)/Read Low BytebFlag_RD_HTable=1;bufferi=(BYTE )*rom_dataptr;/取其低位i+;data_count-;/全局变量,要发送的总长度if(data_count8;/取其高位rom_dataptr+;/将 ROM 指针前移if(bufferi=0x3f)continue;elsei+;if(data_count=0X81 0010 0000Bif(tempelse buffer0=0;buffer1=0;whi
5、le(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(): 设置配置的函数 / /*void GetConfiguration(BYTE *buffer,BYTE USB_Configuration)BYTE FIFO_SendLen;buffer0=USB_Configuration;FIFO_SendLen=0x01;while(1)if(
6、Check_Real_Cmd()=TRUE) return;if(FIFO_WR_CHECK(0)Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);/*/ GetInterface(): 获取 Interface 接口的函数 / /*void GetInterface(BYTE USB_Interface_Alt,BYTE *buffer)BYTE FIFO_SendLen;buffer0=USB_Interface_Alt;FIFO_SendLen=0x01;while(1)if(Check_Real_Cmd()=TRUE) return;if(FIFO
7、_WR_CHECK(0)/Not ReadyWrite_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer)/*/ SetReport(): 设置 Report 的函数 / /*BYTE SetReport(BYTE *buffer)BYTE FIFO_wValueH=buffer3;BYTE nCmdIndex1;if(FIFO_wValueH=0x02)/set_output_reportif(buffer4!=0x03)/check interfaceSTALL|=0x01;/ENPOINT0 Errorreturn;if(buffer6!=0x08)/FIFO_wLengthL,check lengthSTALL|=0x01;/ENPOINT0 Errorreturn;nCmdIndex1=0x21;return nCmdIndex1;/返回命令索引号