[原创]USB通信协议的理解流程描述

上传人:Sc****h 文档编号:145519735 上传时间:2022-08-29 格式:DOCX 页数:16 大小:101.41KB
收藏 版权申诉 举报 下载
[原创]USB通信协议的理解流程描述_第1页
第1页 / 共16页
[原创]USB通信协议的理解流程描述_第2页
第2页 / 共16页
[原创]USB通信协议的理解流程描述_第3页
第3页 / 共16页
资源描述:

《[原创]USB通信协议的理解流程描述》由会员分享,可在线阅读,更多相关《[原创]USB通信协议的理解流程描述(16页珍藏版)》请在装配图网上搜索。

1、原创 USB通信协议的理解,流程 ,描述做了一段时间的USB 方面的开发,虽然是现成的方案,我们只需要搞清楚它的架构, 再添加我们的代码就行了。空闲之余,研究了一下USB 通信过程,也把82A851R部分的汇编代码重新用C 语言描述了一篇(仅是描述,不代表能真正运行)。发现汇编代码条理性太在太差了,不好读。一把C 语言的代码一写,马上觉得清楚很多。废话少说,开始贴图,贴代码。下面是将一些函数重新用C 语言描述了一遍#define BYTE unsigned char/*/基本定义函数/*BYTE FIFO_RD_CHECK(BYTE num)BYTE FIFO_FLAG=0;UCC|=num;

2、/选择 Endpoint,0,1,2,3,4,MISC&=0xf8;/低 3 位置 0MISC|=0X00;/TX位置 0;Delay_3us();MISC|=0X01;/Set RequestDelay_28us();if(MISC&0X40!=0)FIFO_FLAG=0x0f;/READYif(MISC&0x80!=0)FIF0_FLAG&=0xf0;/Len0 DetectedMISC&=0xfe;/clear REQreturn FIFO_FLAG;BYTE FIFO_WR_CHECK(BYTE num)BYTE FIFO_FLAG=0;/后 4 位表示 Ready 位 ,前四位表示L

3、en0 位的状态是否有被设置UCC|=num;/选择 Endpoint,0,1,2,3,4,MISC&=0xf8;/低 3 位置 0MISC|=0X02;/TX位置 0;Delay_3us();MISC|=0X01;/Set RequestDelay_28us();if(MISC&0X40!=0)FIFO_FLAG=0x0f;/READYif(MISC&0x80!=0)FIF0_FLAG&=0xf0;/Len0 DetectedMISC&=0xfe;/clear REQreturn FIFO_FLAG;void Read_FIFO(BYTE *Fifo_Addr,BYTE Fifo_Size,

4、BYTE *buffer)int i=0;MISC|=0x01;/Set Requestfor(i=0;iFifo_Size;i+)bufferi=Fifo_Addr0;/从 FIFO 地址取值Delay_28us();if(MISC&0x40=0)break;/Not ReadyMISC=0X02;/改变 TX 位状态Delay_3us();MISC&=0XFE;/Clear Requestvoid Write_FIFO(BYTE *Fifo_Addr,BYTE SendLenth,BYTE *buffer)int i=0;MISC|=0X01;/Set Requestfor(i=0;ida

5、ta_start0)/请求的数据超出ROM 数据return;data_count=buffer6;if(MISC&0x40!=0)/是控制指令return;if(data_count=0)Send_Hand_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

6、 指针前移if(bufferi=0x3f)continue;elsei+;if(data_count=0X81 0010 0000B if(temp&STALL=TRUE)/ 要检测的位置 1buffer0=1;else buffer0=0;buffer1=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():设置配置的函数/

7、*void GetConfiguration(BYTE *buffer,BYTE USB_Configuration)BYTE FIFO_SendLen;buffer0=USB_Configuration;FIFO_SendLen=0x01;while(1)if(Check_Real_Cmd()=TRUE) return;if(FIFO_WR_CHECK(0)&0x0f!=0)/Fifo Readybreak;Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);/*/GetInterface():获取 Interface接口的函数/*void GetInte

8、rface(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_WR_CHECK(0)&0xff=0) continue;/Not ReadyWrite_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer)/*/SetReport():设置 Report的函数/*BYTE SetReport(BYTE *buffer)BYTE FIFO

9、_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;/返回命令索引号/*/SetCur():设置当前信息的函数/包括 VolumeControl,Mu

10、teControl/*void SetCur(BYTE *buffer)/;21 01if(buffer3=0x01)/MUTE_CONTROLMuteControl();else if(buffer3=0x02)/VOLUME_CONTROLVolumeControl();elseSTALL0|=0x01;BYTE MuteControl(BYTE *buffer) /21 01 00 01,if have more feature , the state must be modify!BYTE nCmdIndex1;if(buffer5=0x02)/FIFO_wIndexH,MuteCon

11、trol_SetSpeaker();nCmdIndex1=0x18;return nCmdIndex1;else if(buffer5=0x06)/MuteControl_SetMic();nCmdIndex1=0x19;return nCmdIndex1;BYTE VolumeControl(BYTE *buffer)BYTE nCmdIndex1;if(buffer5=0x02)/FIFO_wIndexH,VolumeControl_SetSpeaker()nCmdIndex1=0x28;return nCmdIndex1;else ifbuffer5=0x06)nCmdIndex1=0x

12、29;return nCmdIndex1;/*/GetMin():获取各种最小信息的函数/包括 GetMin_SetSpeaker,GetMin_SetMic/*void GetMin(BYTE *buffer)if(buffer5=0x02)/FIFO_wIndexHGetMin_SetSpeaker();else if(buffer5=0x06)GetMin_SetMic();elseSTALL|=0X01;void GetMin_SetSpeaker(BYTE *buffer)buffer0=0x00;buffer1=0xe0;/Min_Volumewhile(1)if(Check_Re

13、al_Cmd()=TRUE)return;if(FIFO_WR_CHECK(0)&0xff=0) continue;/Not ReadyWrite_FIFO(Fifo_0_Addr,0x02,buffer)void GetMin_SetMic(BYTE *buffer)buffer0=0x00;buffer1=0x00;/MIC_Min_Volumewhile(1)if(Check_Real_Cmd()=TRUE)return;if(FIFO_WR_CHECK(0)&0xff=0) continue;/Not ReadyWrite_FIFO(Fifo_0_Addr,0x02,buffer)/*

14、/GetMax():获取各种最大信息的函数/包括 Speaker,Mic/*void GetMax(BYTE *buffer)if(buffer5=0x02)/FIFO_wIndexHGetMax_SetSpeaker();else if(buffer5=0x06)GetMax_SetMic();elseSTALL0|=0x01;void GetMax_SetSpeaker(BYTE *buffer)buffer0=0x00;buffer1=0x0c;/Max_Volumewhile(1)if(Check_Real_Cmd()=TRUE)return;if(FIFO_WR_CHECK(0)&0

15、xff=0) continue;/Not ReadyWrite_FIFO(Fifo_0_Addr,0x02,buffer)void GetMax_SetMic(BYTE *buffer)buffer0=0x00;buffer1=0x0c;/MIC_Max_Volumewhile(1)if(Check_Real_Cmd()=TRUE)return;if(FIFO_WR_CHECK(0)&0xff=0) continue;/Not ReadyWrite_FIFO(Fifo_0_Addr,0x02,buffer)/*/GetRes():/*void GetRes(BYTE *buffer)buffe

16、r0=0x00;buffer1=0x01;while(1)if(Check_Real_Cmd()=TRUE)return;if(FIFO_WR_CHECK(0)&0xff=0) continue;/Not ReadyWrite_FIFO(Fifo_0_Addr,0x02,buffer)/*/GetCur():/*void GetCur(BYTE *buffer)BYTE FIFO_wLengthL=buffer6;BYTE FIFO_wIndexH=buffer5;BYTE FIFO_SendLen;FIFO_SendLen=FIFO_wLengthL;if(FIFO_SendLen=0x01

17、)GetCurMute();else if(FIFO_SendLen=0x02)GetCur_Volume();elseSTALL|=0x01;void GetCur_Mute(BYTE *buffer)if(FIFO_wIndexH=0x02)GetCur_Mute_Speaker();else if(FIFO_wIndexH=0x06)GetCur_Mute_Mic();elseSTALL|=0x01;void GetCur_Mute_Mic(BYTE *buffer)if(bFlag_Mic_Mute=TRUE)buffer0=0x01;elsebuffer0=0x00;while(1)

18、if(Check_Real_Cmd()=TRUE) return;if(FIFO0_WR_CHECK()&0x0f=0) continue;/未准备好elsebreak;Write_FIFO(Fifo_0_Addr,0x01,buffer);void GetCur_Mute_Speaker(BYTE *buffer)if(bFlag_Audio_Mute=TRUE)buffer0=0x01;elsebuffer0=0x00;while(1)if(Check_Real_Cmd()=TRUE) return;if(FIFO0_WR_CHECK()&0x0f=0) continue;/未准备好els

19、ebreak;Write_FIFO(Fifo_0_Addr,0x01,buffer);void GetCur_Volume(BYTE *buffer)if(buffer5=0x02)/FIFO_wIndexHGetCur_Volume_Speaker();else if(buffer5=0x06)GetCur_Volume_Mic();elseSTALL|=0x01;void GetCur_Volume_Mic(BYTE *buffer)buffer0=0x00;buffer1=PGA_CTRL&0x3f;while(1)if(Check_Real_Cmd()=TRUE) return;if(

20、FIFO0_WR_CHECK()&0x0f=0) continue;/未准备好else break;Write_FIFO(Fifo_0_Addr,0x02,buffer);void GetCur_Volume_Speaker(BYTE *buffer,BYTE VolumeL_Save,BYTE VolumeH_Save)buffer0=VolumeH_Save;buffer1=VolumeL_Save;while(1)if(Check_Real_Cmd()=TRUE) return;if(FIFO0_WR_CHECK()&0x0f=0) continue;/未准备好else break;Wr

21、ite_FIFO(Fifo_0_Addr,0x02,buffer);/*/Const String常量/*BYTE device_desc_table=/18 bytesWORD0x0112,/descriptor type (device descriptor) , size of descriptor (18 bytes)WORD0x0110,/USB spec release (ver 1.1)WORD0x0000,/device sub-class , Communicationdevice classWORD0x0800,/bMaxPacketSize0 maximum packet

22、 size , bDeviceProtocolWORD0x04D9,/vendor ID = 004D9HWORD0x2851,/product version ID (Sample Device)WORD0x0100,/product version ID Device Release CodeWORD0x0201,/product string index , manufacturer string indexWORD0x0103,/number of configurations , serial number string indexBYTE config_desc_table=/9 bytesWORD0x0209,/descriptor type (config descriptor) , size of descriptorWORD0x00D9,/total length of descriptor (D9 H=217 bytes)WORD0x0104,/index of this configuration , 4 interfaceWORD0x3F00,/configuration string indexWORD0x3F80,/configuration attributes (bus supply)WORD0x3FFA,/maxpower (500ma)

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!