版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、三江学院 本科生毕业设计(论文) 题 目 基于 51 单片机的 USB键盘设计与实现 高职院 院(系) 电气工程及其自动化 专业 学生姓名 梁邱一学号 G105071013 指导教师 孙传峰职称 讲师 指导教师工作单位三江学院 起讫日期 2013 年 12 月 10 日至 2014 年 4 月 12 日 摘要 随着计算机技术的不断更新和多媒体技术的快速发展 ,传统的计算机外设接 口因为存在许多缺点已经不能适应计算机的发展需要。比起传统的AT,PS/2,串 口,通用串行总线 USB,具有速度快 ,使用方便灵活 ,易于扩展,支持即插即用 ,成本低 廉等一系列优点 ,得到了广泛的应用。 本论文阐述了
2、 51系列单片机和 USB 的相关内容,详细介绍了系统的一些功能 设计,包括硬件设计和软件设计。在程序调试期间用简单的串口通信电路,通过 串口调试助手掌握了 USB 指令的传输过程,这对整个方案的设计起到了很大的指 导作用。论文以单片机最小系统配合模拟键盘组成的 USB 键盘硬件系统,通过对 D12 芯片的学习与探索,在其基本命令接口的支持下,结合硬件进行相应的固件 程序设计,使其在 USB 协议下,实现 USB 模块与 PC的数据通信,完成 USB 键 盘的功能模拟。 总结论文研究工作有阐述 USB 总线的原理、 对本设计的系统要求作出了分析、 根据要求选定元件和具体编程方案、针对系统所要实
3、现的功能对相关芯片作了详 细介绍以及在硬件部分设计了原理图。 关键词 :USB;D12;PC Abstract With the rapid development of computer technology and multimedia technology constantly updated, traditional computer peripheral interface because there are many shortcomings have been unable to meet the development needs of the computer.Compare
4、d to traditional AT, PS / 2, serial, Universal Serial Bus USB, with fast, flexible and easy to use, easy to expand, support Plug and Play, a series of advantages, such as low cost, has been widely used. This paper describes the 51 series and USB related content, detailing some of the features of the
5、 system design, including hardware and software design.During debugging a simple serial communication circuit, through the serial port debugging assistant master USB transfer instructions, which designed the entire program has played a significant role in guiding.Thesis smallest single-chip system c
6、onsisting of analog keyboard with a USB keyboard hardware system, by learning and exploration D12 chips, with the support of its basic command interface, in conjunction with the corresponding hardware firmware design, making it in the USB protocol, USB module data communication with the PC, the USB
7、keyboard to complete the functional simulation. This paper summarizes research work has elaborated the principle of the USB bus, the system is designed to require the analysis, components and solutions based on the specific requirements of the selected programming for the system to achieve the funct
8、ion of the relevant chips are described in detail in the hardware part of the design as well as the principle of Figure. Keywords:USB;D12;PC II 目录 第一章 绪 论. 1 1.1 PC 接口简介 1 1.2 USB 接口分析 1 1.3 USB 器件的选择 1 第二章系统分析 . 3 2.1 USB 总线简介 3 2.2 USB 技术指标 3 2.3 USB 系统构成 4 第 3 章系统硬件设计 6 3.1 STC89C52单片机简介及最小系统 . 6
9、 3.1.1 单片机发展概况及发展方向 6 3.1.2 单片机特点及结构 6 3.1.3 复位电路设计 8 3.1.4 单片机最小系统硬件设计 9 3.2 PDIUSBD12 接口芯片设计 9 3.2.1 USB 接口芯片简介 9 3.2.2 USB 接口芯片引脚配置 11 3.2.3 USB 接口芯片硬件设计 14 3.2.4 USB 接口芯片端点描述 14 3.2.5 USB 接口芯片命令 16 3.3 USB 键盘硬件设计 18 第 4 章系统软件设计 19 4.1 固件编程的实现 20 4.1.1 USB 接口芯片工作流程图 20 4.1.2 PDIUSBD12 命令接口 PDIUSB
10、D12.C . 21 4.1.3 USB 中断服务程序 USBISR.C 21 4.1.4 按键处理流程图 21 4.1.5 USB 键盘处理程序 - KEY.C . 22 4.1.6 USB 主循环程序 MAIN .C 23 4.2 实物演示 25 结束语. 27 致 谢 . 28 参考文献 . 29 附录 A 30 附录 B 37 三江学院 2014 届本科生毕业设计(论文) 第一章 绪 论 1.1 PC接口简介 PC中的接口有两类:串行接口和并行接口。计算机内部总线,如 CPU与存储器之间 匀采用并行接口,这样速度快;但外设却以串行接口比较占优势。传统的打印机接口为 并行接口。 SCSI
11、标准的全名是小型设备通用接口标准,其传输速率为 10M ,早期的扫描 仪一般使用此接口,硬盘与主机的联接也使用这种接口。串行接口出现最早,使用最广 的RS232接口,但其速度太慢,现在已经逐渐被淘汰。 USB接口和 IEEE1394接口是两种 速度比较高的串行接口,还有局域网中的以太网接口,它们具有较广阔的发展前景和应 用潜力。 USB适用于低档外设与主机之间的高速数据传输, USB1.1可以达到 1.5Mbps或 12Mbps的传输率,而1394更是可达 100200400Mbps。USB2.0将速度定位在 480Mbps, 而IEEE1394也推出了1394b 1.3.1 版草案,速度从
12、800Mbps起步,最高可达 3.2Gbps。局 局域中用得最多的是以太网接口,速度可达 100Mbps,当使用光纤传输时,速度可达 1000Mbps。 1.2 USB 接口分析 通用串行总线 ( Universal Serial Bus USB),是一种快速、灵活的总线接口。与其它 通信接口比较, USB接口的最大特点是易于使用。作为一种高速总线接口, USB适用于 多种设备,如数码相机、 MP3播放机、高速数据采集设备等。易于使用还表现在 USB接 口支持热插拔,并且所有的配置过程都由系统自动完成,无需用户干预。USB接口支持 1.5Mb/s(低速) 、 12Mb/s(全速) 和高达 48
13、0Mb/s的数据传输速率,扣除用于总线状态、控 制和错误监测等的数据传输, USB的最大理论传输速率仍达 1.2Mb/s或9.6Mb/s,远高于 一般的串行总线接口。 USB接口芯片价格低廉,一个支持 USB 1.1 规范的 USB接口芯片 价格大多在人民币 1530元之间,这也大大促进 USB设备的开发与应用。 1.3 USB 器件的选择 在进行一个 USB设备开发之前,首先要根据具体使用要求选择合适的 USB控制器。 目前,市场上供应的 USB控制器主要有两种:带 USB接口的单片机( MCU )或纯粹的 USB接口芯片。带 USB接口的单片机从应用上又可以分成两类,一类是从底层设计专用
14、于USB控制的单片机另一类是增加了 USB接口的普通单片机,如 Cypress公司的 EZ USB( 基于8051),选择这类 USB控制器的最大好处在于开发者对系统结构和指令集非 常熟悉,开发工具简单,但对于简单或低成本系统。但价格因素也是在实际选择过程中 需要考虑的因素。纯粹的 USB 接口芯片仅处理 USB通信,必须有一个外部微处理器来 进行协议处理和数据交换。典型产品有 Philips公司的 PDIUSBD11(I2C接口)、 PDIUSBD12( 并行接口), NS公司的 USBN9603/9604( 并行接口), NetChip公司的 三江学院 2014 届本科生毕业设计(论文)
15、NET2888 等。 USB接口芯片的主要特点是价格便宜、接口方便、可靠性高,尤其适合 于产品的改型设计(硬件上仅需对并行总线和中断进行改动,软件则需要增加微处理器 的USB中断处理和数据交换程序、 PC机的USB接口通信程序, 无需对原有产品系统结构 作很大的改动)。 三江学院 2014 届本科生毕业设计(论文) 第二章 系统分析 2.1 USB总线简介 USB是一种支持在 USB 主机和 USB 设备之间进行串行数据传输的通信协议。 主机 作为总线的主叫方,采用两种信令模式:全速模式 12Mb/s 和低速模 1.5Mb/s。USB 使 用四种数据传输方式:控制传输( control)、中断
16、传输( interrupt)、批量传输( bulk)及 等时传输( isochronous)。 Intel 公司开发的通用串行总线架构 (USB) 的目的主要基于以下三方面考虑: 一、计算机与电话之间的连接 显然用计算机来进行计算机通信将是下一代计算机基本的应用。 机器和人们的数据 交互流动需要一个广泛而又便宜的连通网络。然而,由于目前产业间的相互独立发展 , 尚未建立统一标准 ,而 USB 则可以广泛的连接计算机和电话。 二、易用性 众所周知, PC 机的改装是极不灵活的。对用户友好的图形化接口和一些软硬件机 制的结合,加上新一代总线结构使得计算机的冲突大量减少,且易于改装。但以终端用 户的
17、眼光来看, PC 机的输入/输出,如串行 /并行端口、键盘、鼠标、操纵杆接口等, 均还没有达到即插即用的特性, USB 正是在这种情况下问世的。 三、端口扩充 外围设备的添加总是被相当有限的端口数目限制着。缺少一个双向、价廉、与外设 连接的中低速的总线,限制了外围设备 (如电话/ 电传/调制解调器的适配器、扫描仪、 键盘、PDA ) 的开发。 现有的连接只可对极少设备进行优化, 对于 PC 机的新的功能部件 的添加需定义一个新的接口来满足上述需要, USB 就应运而生。 它是快速、双向、同步、 动态连接且价格低廉的串行接口,可以满足 PC 机的发展现状和未来需要。码主要存储 在单片机中,通过单
18、片机中的软件代码运行后,通过各个管脚的控制外围辅助电路的运 行以实现系统的功能。复位电路是保证系统安全运行的基础,由于单片机的运行环境无 法确定,无法保证单片机在长时间的运行过程中能够一直保证系统的稳定性,复位电路 就是在单片机无法正常运行后,软复位无法进行复位的情况下,能够保证系统能够重新 启动 2.2 USB技术指标 USB最大的特点是支持热插拔( Hot plug)和即插即用 ( Plug TL0=(65536-Fclk/1000/12*5+15)%256; / if(!KeyCanChange)return; / 如果正在处理按键,则不再扫描键盘 / 开始键盘扫描 / 保存按键状态到当
19、前按键情况 / KeyCurrent 总共有 8 个 bit / 当某个开关按下时,对应的 bit 为 1 KeyCurrent=GetKeyValue(); / 读取键值, GetKeyValue()其实是个宏,不是函数, / 这里故意写成函数的样子,美观。它的定义在 /key.h 文件中 if(KeyCurrent!=KeyOld) / 如果两次值不等,说明按键情况发生了改变 KeyNoChangedTime=0; / 键盘按下时间为 0 KeyOld=KeyCurrent ; / return; / 返回 else KeyNoChangedTime+; 保存当前按键情况 / 按下时间累计
20、 if( KeyNoChangedTime=1) / 如果按下时间足够 22 三江学院 2014 届本科生毕业设计(论文) KeyNoChangedTime=1; KeyPress=KeyOld; / 保存按键 KeyDown|=(KeyLast) / 求出新按下的键 KeyUp|=KeyLast / 求出新释放的键 KeyLast=KeyPress; / 保存当前按键情况 4.1.6USB主循环程序 MAIN .C 主函数部分程序代码: /* 函数功能:主函数。 入口参数:无。 返 回:无。 备 注:无。 */ void main(void) / 主函数 uint16 id; uint8 I
21、nterruptSource; EA=1; / 打开中断 InitKeyboard(); / 初始化按键 id=D12ReadID(); Prints(Your D12 chips ID is: ); PrintShortIntHex(id); if(id=0 x1012) Prints(. ID is correct! Congratulations!rnrn); else Prints(. ID is incorrect! What a pity!rnrn); 23 三江学院 2014 届本科生毕业设计(论文) UsbDisconnect(); / 先断开 USB连接 UsbConnect
22、(); / 将 USB连接上 ConfigValue=0; / 配置值初始化为 0 while(1) / 死循环 if(D12GetIntPin()=0) / 如果有中断发生 D12WriteCommand(READ_INTERRUPT_REGISTER); / 写读中 断寄 存器的命令 总线挂起中断处理 InterruptSource=D12ReadByte(); / 读回第一字节的中断寄存器 / 总线复位中断处理 / 端点 0 输出中断处理 / 端点 0 输入中断处理 / 端点 1 输出中断处理 / 端点 1 输入中断处理 / 端点 2 输出中断处理 / 端点 2 输入中断处理 if(In
23、terruptSource / if(InterruptSource if(InterruptSource if(InterruptSource if(InterruptSource if(InterruptSource if(InterruptSource if(InterruptSource if(ConfigValue!=0) / 如果已经设置为非 0 的配置,则可以返回报告数据 if(!Ep1InIsBusy) / 如果端点 1 输入没有处于忙状态,则可以发送数 据 KeyCanChange=0; / 禁止按键扫描 if(KeyUp|KeyDown) / 如果有按键事件发生 SendR
24、eport(); / 则返回报告 KeyCanChange=1; / 允许按键扫描 程序说明: 24 三江学院 2014 届本科生毕业设计(论文) 如果单片机检测到按键按下的信息,并根据相应的模式发送按键码, USB 接口芯 片如果出于非忙的状态,自动将处理好的数据包发往 PC 机,顺利实现一次按键过程。 前文指出, PDIUSBD12 的 技术可提供良好的 USB连接指示。在枚举中 LED 指示 根据通信的状况间歇闪烁。当 PDIUSBD12 成功地枚举和配置后 LED 指示将一直点亮, 随后与 PDIUSBD12 之间成功的传输 (带应答)将关闭 LED,处于挂起状态时, LED 将 会关
25、闭。该特性为 USB 器件,集线器和 USB 通信状态提供了用户友好的指示。作为一 个诊断工具,它对隔离故障的设备是很有用的。从系统测试中也可以看见该指示 LED 间歇闪烁,很好的验证了这一特性。 4.2 实物演示 25 三江学院 2014 届本科生毕业设计(论文) 将 USB 插入电脑 , 看到 USB 指示灯闪烁 , 说明连接正常 , 打开记事本 , 任意按下相应 的独立开关 , 模拟电脑键盘下的键值 ,在记事本中成功的显示了相应的按键键值 , 即 USB 与电脑通讯成功 . 26 三江学院 2014 届本科生毕业设计(论文) 结束语 本科毕业设计是对大学两年年来所学专业知识的整体考察,
26、也是对自己综合能力的 一次很好的评估。掌握了基于 51单片机和 PDIUSBD12 芯片的 USB 键盘设计与实现, 熟悉了 USB 相关协议,为以后的深入学习奠定了良好的基础。编程所采用的软件开发 平台是 Keil uVision4 ,开发语言是 C 语言,硬件调试电路手工焊接,可操作性好。虽然 C 语言和开发环境曾经都学习并使用过, 但应用于这次的毕业设计才发现自己掌握的还 不够熟练。在老师的悉心指导下,自己查找资料、动手练习,在顺利完成毕设任务的同 时,对单片机 C 语言和 USB 协议的认识和掌握水平也上了一个新的台阶。 该论文阐述了 51系列单片机和 USB 的相关内容,详细介绍了系
27、统的一些功能设计, 包括硬件设计和软件设计。在程序调试期间用简单的串口通信电路,通过串口调试助手 掌握了 USB 指令的传输过程,这对整个方案的设计起到了很大的指导作用。现总结论 文研究工作如下:(1)阐述了 USB 总线的原理;(2)对本设计的系统要求作出了分析, 根据要求选定元件和具体编程方案; ( 3)针对系统所要实现的功能对相关芯片作了详细 介绍,特别是对 Philips 公司的 PDIUSBD12 芯片给出了具体的描述; (4)在硬件部分设 计了原理图,对单片机控制电路和 USB 接口芯片及其外围给出了 Protel 电路图,在软 件部分设计了采用了结构化的程序思想。 从系统演示的实
28、际情况来看,本设计虽然实现了基本功能,但还有很多功能不是很 完备,希望可以在今后的学习和工作中去完善。 27 三江学院 2014 届本科生毕业设计(论文) 致谢 大学生活也已渐渐到了尾声,此次论文的写作从开题、查阅资料、分析设计到最 后全部完成,也用了 4 个多月的时间。在此期间得到了老师和同学的帮助,我要感谢他 们对我的帮助。 这次毕业论文设计中,我的指导老师对我的关心和支持及其重要。在论文的开题、 大纲确立和最后的成文过程中,老师悉心指导并帮助我,使论文才能顺利的完成。孙老 师严谨的教学方法、积极的工作态度对我有着很大的鼓励 每次遇到难题的时候,我最先做的就是向孙老师寻求帮助,而孙老师每次
29、不管忙或 闲,都会通过邮箱电话的形式来帮助我,然后帮我解决问题。老师平日里工作繁多,但 我做毕业设计的每个阶段, 从选题到查阅资料, 论文提纲的确定, 中间的无数次的修改, 最后论文格式调整等各个环节中都给予了我细心的指导。这几个月以来,孙老师一直指 导我完成毕业设计,最后我再次对我的指导老师表示感谢! 28 三江学院 2014 届本科生毕业设计(论文) 参考文献 1 卢超。单片机与 PC 机的通信设计 J. 工矿自动化 ,2007-5. 2 胡晓军 . USB 接口开发技术 M. 西安 : 西安电子科技大学出版社, 2005 3 杨代华,叶敦范,王典洪等 .单片机原理及应用 M. 武汉:中国
30、地质大学出版社, 2002 4 陈再清。微机单片机通信浅谈 J. 电气时代 ,2001-12. 5 张念淮 . USB 总线接口开发指南 M. 北京:国防工业出版社, 1999 6 路永坤 . 基于 USB 接口的数据采集模块的设计与实现 J. 自动化仪表, 2005, (2) 7 马忠梅,马岩,张凯等 . 单片机的 C语言应用程序设计 M. 北京: 北京航空航天大学出版社, 1996 8 董建国 , 戚云军 , 何运兰 . 基于 USB 总线的 PC 机与单片机的通信 J. 信息技术 ,2003-11. 9 徐振立 , 陶乐仁 , 等。在 VB 平台上开发的太阳能喷射制冷实验台测控系统 J.
31、 微计算机信息, 2007,23(7-1). 10 李华. MCS-51 系列单片机使用接口技术 M. 北京: 北京航空航天大学出版社, 2000 11 史波,田凯。通用串行总线 USB 技术概述 J. 信息技术, 2001(4). 12 Chris Cant.Windows WDM 设备驱动程序开发指南 M.西安 : 西安电子科技大学出版社, 2000 29 三江学院 2014 届本科生毕业设计(论文) 附录 A 4.1.2 PDIUSBD12 命令接口 PDIUSBD12.C /* 函数功能: D12 写命令。 入口参数: Command:一字节命令。 返 回:无。 备 注:无。 */ v
32、oid D12WriteCommand(uint8 Command) D12SetCommandAddr(); / 设置为命令地址 D12ClrWr(); /WR 置低 D12SetPortOut(); / 将数据口设置为输出状态(注意这里为空宏,移植时可能有用) D12SetData(Command) ; / 输出命令到数据口上 D12SetWr(); /WR 置高 D12SetPortIn(); / 将数据口设置为输入状态,以备后面输入使用 / End of function/ /* 函数功能:读一字节 D12 数据。 入口参数:无。 返 回:读回的一字节。 备 注:无。 */ uint8
33、 D12ReadByte(void) uint8 temp; D12SetDataAddr(); / 设置为数据地址 D12ClrRd(); /RD 置低 temp=D12GetData(); / 读回数据 D12SetRd(); /RD 置高 return temp; / 返回读到数据 / End of function/ 30 三江学院 2014 届本科生毕业设计(论文) /* 函数功能:读 D12 的 ID。 入口参数:无。 返回:D12 的 ID。 备 注:无。 */ uint16 D12ReadID(void) uint16 id; D12WriteCommand(Read_ID);
34、 / 写读 ID 命令 id=D12ReadByte(); / 读回 ID 号低字节 id|=(uint16)D12ReadByte()Len) / 如果要读的字节数比实际接收到的数据长 j=Len; / 则只读指定的长度数据 #ifdef DEBUG1 / 如果定义了 DEBUG1 ,则需要显示调试信息 Prints( 读端点 ); PrintLongInt(Endp/2); / 端点号。由于 D12 特殊的端点组织形式, /这里的 0 和 1分别表示端点 0 的输出和输入; /而 2、3分别表示端点 1 的输出和输入; /4、5分别表示端点 2 的输出和输入。 /因此要除以 2 才显示对应
35、的端点。 Prints( 缓冲区 ); PrintLongInt(j); / 实际读取的字节数 Prints( 字节。 rn); #endif for(i=0;ij;i+) 33 三江学院 2014 届本科生毕业设计(论文) / 这里不直接调用读一字节的函数,而直接在这里模拟时序,可以节省时间 D12ClrRd(); / RD 置低 *(Buf+i)=D12GetData(); / 读一字节数据 D12SetRd(); / RD 置高 #ifdef DEBUG1 PrintHex(*(Buf+i); / 如果需要显示调试信息,则显示读到的数据 if(i+1)%16)=0)Prints(rn);
36、 / 每 16 字节换行一次 #endif #ifdef DEBUG1 if(j%16)!=0)Prints(rn); / 换行。 #endif return j; / 返回实际读取的字节数。 / End of function/ /* 函数功能:使能发送端点缓冲区数据有效的函数。 入口参数:无。 返 回:无。 备 注:只有使用该函数使能发送端点数据有效之后,数据才能发送出去。 */ void D12ValidateBuffer(void) D12WriteCommand(D12_VALIDATE_BUFFER); / End of function/ /* 函数功能:将数据写入端点缓冲区函数
37、。 入口参数: Endp:端点号; Len:需要发送的长度; Buf :保存数据的缓冲区 返回: Len 的值。 备 注:无。 */ uint8 D12WriteEndpointBuffer(uint8 Endp,uint8 Len,uint8 * Buf) uint8 i; D12SelectEndpoint(Endp); / 选择端点 34 三江学院 2014 届本科生毕业设计(论文) D12WriteCommand(D12_WRITE_BUFFER); / 写 Write Buffer 命令 D12WriteByte(0); / 该字节必须写 0 D12WriteByte(Len); /
38、 写需要发送数据的长度 #ifdef DEBUG1 / 如果定义了 DEBUG1 ,则需要显示调试信息 Prints( 写端点 ); PrintLongInt(Endp/2); / 端点号。由于 D12 特殊的端点组织形式, / / / 这里的 0 和 1分别表示端点 0 的输出和输入; 而 2、 3 分别表示端点 1 的输出和输入; 4、 5 分别表示端点 2 的输出和输入。 / 因此要除以 2 才显示对应的端点。 Prints( 缓冲区 ); PrintLongInt(Len); / 写入的字节数 Prints( 字节。 rn); #endif D12SetPortOut(); / 将数据
39、口设置为输出状态(注意这里为空宏,移植时可能有用) for(i=0;iDeviceDescriptor7) / 按最大包长度发送 D12WriteEndpointBuffer(1,DeviceDescriptor7,pSendData); / 发送后剩余字节数减少最大包长 SendLength-=DeviceDescriptor7; / 发送一次后指针位置要调整 pSendData+= DeviceDescriptor7; else if(SendLength!=0) / 不够最大包长,可以直接发送 D12WriteEndpointBuffer(1,SendLength,pSendData);
40、 / 发送完毕后, SendLength 长度变为 0 SendLength=0; else / 如果要发送的数据包长度为 0 if(NeedZeroPacket=1) / 如果需要发送 0 长度数据 D12WriteEndpointBuffer(1,0,pSendData); / 发送 0 长度数据包 NeedZeroPacket=0;/ / 清需要发送 0 长度数据包标志 /* 函数功能:端点 0 输出中断处理函数。 入口参数:无。 返 回:无。 备 注:无。 38 三江学院 2014 届本科生毕业设计(论文) void UsbEp0Out(void) #ifdef DEBUG0 Prin
41、ts( USB 端点 0 输出中断。 rn); #endif / 读取端点 0 输出最后传输状态,该操作清除中断标志 / 并判断第 5 位是否为 1 ,如果是,则说明是建立包 if(D12ReadEndpointLastStatus(0) / 读建立过程数据 D12AcknowledgeSetup(); / 应答建立包 D12ClearBuffer(); / 清缓冲区 / 将缓冲数据填到设备请求的各字段中 bmRequestType=Buffer0; bRequest=Buffer1; wValue=Buffer2+(uint16)Buffer3)8); wIndex=Buffer4+(uin
42、t16)Buffer5)8); wLength=Buffer6+(uint16)Buffer7)5) #endif / USB 协议定义了几个标准输入请求,我们实现这些标准请求即可 / 请求的代码在 bRequest 中,对不同的请求代码进行散转 / 事实上,我们还需要对接收者进行散转,因为不同的请求接收者 / 是不一样的。接收者在 bmRequestType的 D4D0 位中定义。 / 我们这里为了简化操作,有些就省略了对接收者的判断。 / 例如获取描述符的请求,只根据描述符的类型来区别。 switch(bRequest) 39 三江学院 2014 届本科生毕业设计(论文) case GET
43、_CONFIGURATION: / 获取配置 #ifdef DEBUG0 Prints( 获取配置。 rn); #endif break; case GET_DESCRIPTOR : / 获取描述符 #ifdef DEBUG0 Prints( 获取描述符 ); #endif / 对描述符类型进行散转,对于全速设备, / 标准请求只支持发送到设备的设备、配置、字符串三种描述符 switch(wValue8) #endif pSendData=DeviceDescriptor; / 需要发送的数据 / 判断请求的字节数是否比实际需要发送的字节数多 / 这里请求的是设备描述符,因此数据长度就是 /
44、DeviceDescriptor0 。如果请求的比实际的长, / 那么只返回实际长度的数据 if(wLengthDeviceDescriptor0) SendLength=DeviceDescriptor0; if(SendLength%DeviceDescriptor7=0) / 并且刚好是整数个数据包时 NeedZeroPacket=1;/ / 需要返回 0 长度的数据包 else SendLength=wLength; / 将数据通过 EP0 返回 UsbEp0SendData(); break; case CONFIGURATION_DESCRIPTOR: / 配置描述符 40 三江学
45、院 2014 届本科生毕业设计(论文) #ifdef DEBUG0 Prints( 配置描述符。 rn); #endif pSendData=ConfigurationDescriptor; / 需要发送的数据为配置描述符 / 判断请求的字节数是否比实际需要发送的字节数多 / 这里请求的是配置描述符集合,因此数据长度就是 / ConfigurationDescriptor3*256+ConfigurationDescriptor2 。 / 如果请求的比实际的长,那么只返回实际长度的数据 SendLength=ConfigurationDescriptor3; SendLength=SendLe
46、ngth*256+ConfigurationDescriptor2; if(wLengthSendLength) if(SendLength%DeviceDescriptor7=0) / 并且刚好是整数个数据包时 NeedZeroPacket=1;/ / 需要返回 0 长度的数据包 else SendLength=wLength; / 将数据通过 EP0返回 UsbEp0SendData(); break; case STRING_DESCRIPTOR: / 字符串描述符 #ifdef DEBUG0 Prints( 字符串描述符 ); #endif switch(wValue #endif p
47、SendData=LanguageId; SendLength=LanguageId0; break; case 1: / 厂商字符串的索引值为 1,所以这里为厂商字符串 41 三江学院 2014 届本科生毕业设计(论文) #ifdef DEBUG0 Prints( 厂商描述 ) 。rn); #endif pSendData=ManufacturerStringDescriptor; SendLength=ManufacturerStringDescriptor0; break; case 2 : / 产品字符串的索引值为 2,所以这里为产品字符串 #ifdef DEBUG0 Prints(
48、产品描述 ) 。rn); #endif pSendData=ProductStringDescriptor; SendLength=ProductStringDescriptor0; break; case 3: / 产品序列号的索引值为 3,所以这里为序列号 #ifdef DEBUG0 Prints( 产品序列号 ) 。rn); #endif pSendData=SerialNumberStringDescriptor; SendLength=SerialNumberStringDescriptor0; break; default : #ifdef DEBUG0 Prints( 未知的索引
49、值 ) 。rn); #endif / 对于未知索引值的请求,返回一个 0 长度的包 SendLength=0; NeedZeroPacket=1; break; / 判断请求的字节数是否比实际需要发送的字节数多 / 如果请求的比实际的长,那么只返回实际长度的数据 if(wLengthSendLength) if(SendLength%DeviceDescriptor7=0) / 并且刚好是整数个数据包时 NeedZeroPacket=1;/ / 需要返回 0 长度的数据包 else 42 三江学院 2014 届本科生毕业设计(论文) SendLength=wLength; / 将数据通过 EP
50、0返回 UsbEp0SendData(); break; case REPORT_DESCRIPTOR: / 报告描述符 #ifdef DEBUG0 Prints( 报告描述符。 rn); #endif pSendData=ReportDescriptor;/ / 需要发送的数据为报告描述符 SendLength=sizeof(ReportDescriptor);/ / 需要返回的数据长度 / 判断请求的字节数是否比实际需要发送的字节数多 / 如果请求的比实际的长,那么只返回实际长度的数据 if(wLengthSendLength) if(SendLength%DeviceDescriptor
51、7=0) / 并且刚好是整数个数据包时 NeedZeroPacket=1;/ / 需要返回 0 长度的数据包 else SendLength=wLength; / 将数据通过 EP0 返回 UsbEp0SendData(); break; default: / 其它描述符 #ifdef DEBUG0 Prints( 其他描述符,描述符代码: ); PrintHex(wValue8) Prints(rn); #endif break; break; case GET_INTERFACE: / 获取接口 #ifdef DEBUG0 43 三江学院 2014 届本科生毕业设计(论文) Prints(
52、 获取接口。 rn); #endif break; case GET_STATUS:/ / 获取状态 #ifdef DEBUG0 Prints( 获取状态。 rn); #endif break; case SYNCH_FRAME: / 同步帧 #ifdef DEBUG0 Prints( 同步帧。 rn); #endif break; default: / 未定义的标准请求 #ifdef DEBUG0 Prints( 错误:未定义的标准输入请求。 rn); #endif break; break; case 1: / 类请求 #ifdef DEBUG0 Prints( USB 类输入请求: rn
53、); #endif break; case 2: / 厂商请求 #ifdef DEBUG0 Prints( USB 厂商输入请求: rn); #endif break; default: / 未定义的请求。这里只显示一个报错信息 #ifdef DEBUG0 Prints( 错误:未定义的输入请求。 rn); #endif break; / 否则说明是输出请求 44 三江学院 2014 届本科生毕业设计(论文) else /if(bmRequestType #endif / USB 协议定义了几个标准输出请求,我们实现这些标准请求即可 / 请求的代码在 bRequest中,对不同的请求代码进行散
54、转 switch(bRequest) case CLEAR_FEATURE: / 清除特性 #ifdef DEBUG0 Prints( 清除特性。 rn); #endif break; case SET_ADDRESS: / 设置地址 #ifdef DEBUG0 Prints( 设置地址。地址为: ); PrintHex(wValue / 显示所设置的地址 Prints(rn); #endif D12SetAddress(wValue / wValue 中的低字节是设置的地址值 / 设置地址没有数据过程,直接进入到状态过程,返回一个 0 长度的数据包 SendLength=0; NeedZer
55、oPacket=1; / 将数据通过 EP0 返回 UsbEp0SendData(); break; case SET_CONFIGURATION: / 设置配置 #ifdef DEBUG0 Prints( 设置配置。 rn); #endif / 使能非 0 端点。非 0端点只有在设置为非 0 的配置后才能使能。 / wValue的低字节为配置的值,如果该值为非 0,才能使能非 0 端点。 45 三江学院 2014 届本科生毕业设计(论文) / 保存当前配置值 ConfigValue=wValue D12SetEndpointEnable(ConfigValue); / 返回一个 0 长度的状态数据包 SendLength=0; NeedZeroPacket=1; / 将数据通过 EP0 返回 UsbEp0SendData(); break; case SET_DESCRIPTOR :/ 设置描述符 #ifdef DEBUG0 Prints( 设置描述符。 rn); #endif break; case SET_FEATURE:/ / 设置特性 #ifdef DEBUG0 Prints( 设置特性。 rn); #endif break; case
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026秋季国家管网集团西北公司高校毕业生招聘考试备考试题(浓缩500题)附答案详解(a卷)
- 2026秋季国家管网集团油气调控中心高校毕业生招聘14人笔试参考题库(浓缩500题)含答案详解(精练)
- 2026秋季国家管网集团共享运营分公司高校毕业生招聘考试参考题库(浓缩500题)带答案详解(培优a卷)
- 2026秋季国家管网集团华南公司(广东省管网公司)高校毕业生招聘考试备考试题(浓缩500题)附答案详解(培优b卷)
- 2025国网北京市高校毕业生提前批招聘(约450人)笔试模拟试题浓缩500题及答案详解参考
- 2026秋季国家管网集团华南公司(广东省管网公司)高校毕业生招聘笔试备考试题(浓缩500题)及参考答案详解(巩固)
- 2026国网湖北省电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题含答案详解(黄金题型)
- 2026国网湖南省电力公司高校毕业生提前批招聘笔试参考题库浓缩500题完整参考答案详解
- 2026国网河南省电力校园招聘(提前批)笔试模拟试题浓缩500题含答案详解(培优a卷)
- 2026国网云南省电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题及答案详解一套
- 课内文言文知识点梳理(原文+注释+翻译) 统编版语文九年级下册
- 十年(2015-2024)高考真题数学分项汇编(全国)专题15 函数及其基本性质(单调性、奇偶性、周期性、对称性)小题综合(学生卷)
- 人教pep五年级上册unit3What would you like15 单元整体作业设计
- 2024年个人信用报告(个人简版)样本(带水印-可编辑)
- 开展学校德育工作专题研究记录
- 第六章 作物生长模型
- 无菌技术操作规范护理课件
- 邯郸市第一医院2022年7月招聘试题及答案
- 举升机检查表
- 学术规范与学术道德课件
- 2023-2024年注册测绘师案例分析真题及答案解析
评论
0/150
提交评论