教你为任何系统增加USB_第1页
教你为任何系统增加USB_第2页
教你为任何系统增加USB_第3页
教你为任何系统增加USB_第4页
教你为任何系统增加USB_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、为任何系统增加加USB引言有关通用串串行总线(UUSB)的文文章通常从UUSB是个人人电脑的一个个新连接标准准开始讲起。谢谢天谢地现在在不再需要如如此做,因此此本引言可以以简短地写为为:如果你有有一个嵌入式式系统并且想想连到PC,主主流的连接通通道是USBB。本文介绍绍了一款Maaxim最新新推出的芯片片,MAX33420E,它它可以很容易易地把USBB加入到任何何系统中。本本文主要着重重于SPI接接口,提供了了实现通用SSPI的C例例程。最后给给出了一个简简单的USBB HID (人机接口口设备) 基于Wiindowss的应急按钮钮程序。 为任何系统增加加USB微控控制器(CC)的选择通通常

2、基于它所所集成的外设设。许多处理理器集成了UUSB功能,但但是大多数处处理器,特别别是一些低价价位的处理器器不含USBB。有时,您您可能选用了了一个I/OO和外设都很很完美的微控控制器,但它它却缺少USSB。您是否否希望只是添添加USB功功能而继续使使用当前的微微控制器呢? 利用Maaxim的芯芯片MAX33420E,可可以为任何处处理器添加UUSB功能。MMAX34220E集成了了USB全速速收发器、智智能USB串串行接口引擎擎(SIE)和一个可工工作到26MMHz时钟的的从SPI接接口。MAXX3420EE的使用如同同一个具有单单个控制端点点、两个双重重缓冲的644字节数据端端点和一个66

3、4字节的中中断端点的全全速USB外外设。总线供电图1. USB供电图1是一个普通通的USB外外设结构。UUSB的VBBUS电源线线为3.3VV稳压器提供供5V输入,该该稳压器给微微控制器和MMAX34220E供电(无需墙上适适配器)。SSPI接口可可以是3、44或5线。表表1列出了55线接口。表1. 使用33到5线的SSPI接口 如果应用中不需需要中断(MMAX34220E的中断断条件可以通通过读取寄存存器直接检测测到)s,可可以去掉INNT引脚,得得到一个4线线接口。如果果SPI主机机具有双向数数据接口(MMOSI/MMISO),则则可以省掉另另外一条接口口线,这样,没没有中断、支支持双向通

4、信信的SPI接接口只需要33个引脚。如果微控制器没没有SPI接接口怎么办呢呢?没问题,可可以很容易地地设计一个直直接触发GPPIO的、固固件形式的SSPI主控器器。USB的的一个非常强强的特性是自自控流量能力力,它自动配配合SPI侧侧的任何速度度(它利用在在USB侧插插入NAK握握手来提示“忙忙,重试”)。很多USSB外设,特特别是与人接接口的,即使使与最低速的的SPI接口口都能应答自自如。如果图1中的微微控制器非常常小,只有110脚以下怎怎么办呢?难难道就不能把把这些珍贵的的I/O口用用来连USBB芯片了?不不,这就是为为什么MAXX3420EE提供了四个个通用输出口口和四个通用用输入口的原

5、原因,它们可可以替代被用用掉的处理器器上的I/OO口,事实上上你的系统在在接上MAXX3420EE后还得到了了更多的口线线。大规模集成芯片片图2. 只连接大规模集成芯片的少许引脚MAX34200E不仅仅只只限用于小系系统。图2说说明了如何给给一个ASIIC,FPGGA,DSPP和其他大芯芯片增加USSB功能。这这样做的一个个明显原因是是大芯片没有有内建的USSB或内部的的USB不是是正好符合你你的所需。另另一个原因是是随着工艺尺尺寸的缩小,这这些大片子不不能兼容USSB所需的33.3V “高高”压,此时时使用外部带带低压SPII接口的USSB芯片就是是一个很好的的方案。MAAX34200E内带

6、电平平转换器,VVL脚设定接接口电平的范范围,从1.7V到3.6V。隔离USB图3. 隔离USB如图3所示,由由于SPI接接口信号是单单向的,还很很容易进行光光隔。同时还还可以设定较较低的速率来来支持廉价的的光耦。SPI接口SPPI (串行行外设接口)是一个简单单的串行接口口,它使用两两根数据线,一一根串行时钟钟和一个片选选信号。SPPI主控把SSS#拉低来来开始传输,然然后驱动串行行时钟SCLLK来把数据据同步输入和和输出从设备备。SPI主主控通过把SSS#拉回到到高电平,以以终止传输。SPI接口有四种时钟模式,反映了两个信号CPOL (时钟极性)和CPHA (时钟相位)的两个状态。这两信号

7、以(CPOL, CPHA)的形式来表示。可以证明一个接口利用正沿SCLK且在第一个正沿时钟到来以前MOSI数据已经准备就绪可以工作在(0,0)和(1,1)模式而无需任何改变。这一属性使MAX3420E无需额外的模式引脚设置,就可以工作在(0,0)或(1,1)模式。图4和图5显示示了利用SPPI模式在微微控制器(MMAXQ20000,随后后介绍)和MMAX34220E之间的的数据传输。图图4所示为(0,0)模模式,图5所所示为(1,1)模式。两两者的区别是是SCLK信信号的无效电电平不同,(0,0)是是低无效,(1,1)是是高无效。MAX34200E每次传输输接收的第一一个字节是命命令字节。命命

8、令字节包含含寄存器号和和方向位,第第二个字节和和后续字节包包含数据。在在图4和图55中,移入命命令字时,来来自MAX33420E (MISOO引脚)的88位数据是UUSB状态位位。此特性只只在使用分离离MISO和和MOSI脚脚的接口中有有效。SPI代码编写写MAX34420E通用用C代码的窍窍门是把原始始的最基本的的SPI操作作封装到独立立的模块中,然然后针对不同同的SPI接接口的只需客客户化这一模模块。最基本本的模块只须须做三件事: 初始化SSPI口 读读一个字节 写一个字节节 本文中的的应用例子使使用硬件SPPI单元。对对没有此单元元的SPI主主控器,我们们先看看一些些位仿真SPPI接口的

9、通通用C代码。位仿真SPIInit SPI初始化SPI口的函数会随处理器的不同而有很多变化。比较好的做法是先指定接口使用的I/O脚,设置它们的方向,然后设定SS=1和SCLK=0的初始条件(我们假定用SPI主控器的(00)模式)。读寄存器,写寄寄存器rreeg是读取MMAX34220E寄存器器的C函数,这这个宏把功能能从不同微控控制器的不同同I/O结构构中独立出来来,使用宏使使代码易读且且与处理器无无关。wreeg是写MAAX34200E寄存器的的例程。更换处理器时,只只需对宏进行行修改即可使使用这些例程程。例如:下下面是用于不不带硬件SPPI单元的微微控制器的宏宏。 #definee SCL

10、KK_HI OOUTA = PINSSA | 00 x02;#definne SCLLK_LO OUTA = PINNSA & 0 xFD;#defiine SSS_HI OOUTA = PINSSA | 00 x04;#definne SS_LO OUUTA = PINSAA & 0 xxFB;#ddefinee MOSII(v) OOUTA = (PINNSA & 0 x7F) | (vv & 0 xx80);#definne MISSO invval |= PINSSA & 00 x01; BYTE rrreg(BYYTE r) / RRead aa regiister, retuurn

11、 itts jj;BYTEE bv,iinval;invall = 0;SS_LOObv = r3; / LLeft-sshift the rreg nuumber, WRITTE=0foor (j=0; j8; j+) / sendd the regisster nnumberr and direcction bitMOSI(bv) / putt out a bittbv = 1; / shhift oone biit lefftSCLKK_HISCCLK_LOOfor (j=0; j7; j+) / geet 7 bbits aand shhift lleft iin

12、to invallSCLK_HIMISSOinvaal = 1; / shiift inn one bitSCCLK_LOOSCLK_HI / one more bit, but ddont shiftt invval tthis ttimeMIISOSCLLK_LOSSS_HIrreturnn invaal; / retuurn thhe bytte we read invoid wrreg(BYYTE r,BYTE v) / regiister, valuueint jj;BYTEE bv;SSS_LObbv = (r3)+2; / Lefft-shiift thhe regg numbb

13、er, sset thhe WRIITE diirectiion biitfor (j=0; j8; j+) / ssend tthe reegisteer nummber aand diirectiion biitMOSI(bv) / putt out a bittbv = 1; / shhift oone biit lefftSCLKK_HISCCLK_LOOfor (j=0; j8; j+) / seend thhe reggisterr dataaMOSI(v) / put out aa bitvv = 1; / shifft onee bit leftSSCLK_HHISCLKK_L

14、OSS_HII硬件SPI这一一部分讨论上上面提到的MMAXQ20000微控制制器,简单地地说,MAXXQ20000是低功耗、116位、高性性能RISCC处理器家族族中的第一个个。“Q”代代表安静,表表示这一结构构能够与敏感感的模拟电路路很好地协调调工作。MAAXQ20000内建了一一个SPI口口,它与MAAX34200E配合特别别合适,下面面的例子使用用MAXQ22000开发发板和MAXX3420EE搭建了一个个简单、有趣趣的Winddows小产产品。MAXXQ20000硬件SPII单元提供了了SCK、MMOSI和MMISO,但但是没有SSS#。由于SSS#的操作作方式会变化化(比如寻址址一个

15、字节与与突发的字节节串),最好好用通用I/O脚做SSS#。MAXQ I/O单元图6. MAXQ I/O单元图6所示是一个个基本的MAAXQ I/O单元。II/O口以格格式porrt.bitt表示,p代表端端口,b代表位。作作为例子,我我们主要讨论论I/O口55,第3位(用P53)表示。每一个I/O单单元有一个触触发器,本例例中用一个称称为PO5.3的位来写写。O代代表输出。你你一直可以写写这个触发器器,它的输出出有没有与引引脚相连由方方向位决定。配配置输出脚时时,实际应用用时先写触发发器再连到引引脚比较好,这这样它可以避避免引脚上出出现毛刺。P53脚的方向向由称作PDD5.3的位位来设定。D代

16、表方方向,D信号号充当引脚驱驱动的输出使使能:1 = 驱动,00 = 浮空空。引脚的状状态一直可以以通过称作PPI5.3的的位读取,I代表输输入,无论引引脚是如何驱驱动的,被内内部触发器(PD5.33 = 1)还是被外部部的信号(PPD5.3 = 0),PPI位表示引引脚状态。这种结构的一个个好处是如果果引脚被配制制成输入(PPD5.3 = 0),触触发器的输出出没有被用作作输出,那么么它可以作为为上拉电阻的的开关重新利利用。如果DD = 0,00信号被重新新定义,表示示“连接一个个上拉电阻”,如如图6中的点点状线所示。许多I/O脚有有中断功能,如如图6下面的的框图所示,中中断模块有三三个信号

17、: 一个中断标志位位,中断请求求有效时被置置位,由CPPU来复位。 一个边沿选选择位,决定定是正信号跳跳变还是负信信号跳变引起起中断请求。 对每一个能能引起中断的的引脚有一个个中断使能位位。 我们的的应用例子把把MAX34420E的中中断输出配置置成正边沿触触发中断,在在MAXQ22000这边边,程序直接接测试USBB中断的中断断触发器,而而不是使用MMAXQ20000的中断断系统。程序序除了检测按按键的状态和和响应USBB请求外什么么都不干,因因此只需一个个查询循环。初始化SPIMAXQ2000的I/O引脚由通用I/O和像SPI单元这样的特殊功能硬件共享。使用特殊功能硬件时,先配置硬件块,然

18、后把它连到I/O脚上。程序清单中的SPI_Init()过程设置了引脚方向,配置了SPI接口,最后使能它。 void SPPI_Iniit(voiid)/ MAAXQ20000 SPII porttCKCN = 0 x000; / systtem cllock ddivisoor is 1SS_HHI / SS# hhigh PPD5 |= 0 x0770; / Set SPI ooutputt pinss (SS, SCLKK, DOUUT) ass outpput.PDD5 &= 0 x0880; / Set SPI iinput pin (DIN) as innput.SSPICK = 0

19、 x000; / fasttest SSPI cllock-div bby 2 SSPICF = 0 x000; / modee(0,0), 8 bbit daataSPIICN_biit.MSTTM = 11; / Set QQ2000 as thhe masster.SSPICN_bit.SSPIEN = 1; / Ennable SPI/ MAX33420E INT ppin iss tiedd to MMAXQ20000 P660; maake itt an iinputPPD6 &= 0 x001; / PD6.0=0 (turn off ooutputt)读寄存器,写寄寄存器以下函

20、函数利用了MMAXQ20000硬件SSPI单元的的优点,因此此比起那些位位仿真代码尺尺寸小而且快快。 / Read a MAXX3420EE regiister, retuurn itts vallue.BYYTE rrreg(BYYTE reeg)BYTE dum;SSS_LOSSPIB = reg3; / regg numbber w. dir=0 (INN)whille(SPIICN_biit.STBBY); / looop if data stilll beinng senntdum = SPIIB; / readd and toss the iinput byteSSPIB=00 x

21、00; / daata iss dont carre, weere cclockiing inn MISOO bitsswhilee(SPICCN_bitt.STBYY); / loopp if ddata sstill beingg senttSS_HIIreturrn(SPIIB);/ Writte a MMAX34220E reegisteer.voiid wreeg(BYTTE regg, BYTTE datt)SS_LOO / SSet SSS# lowwSPIB = (reeg3)+2; / sennd regg. nummber ww. DIRR bit (b1) set tto

22、 WRIITEwhiile(SPPICN_bbit.STTBY); / looop iff dataa stilll beiing seentSPIIB = ddat; / sennd thee dataawhilee(SPICCN_bitt.STBYY); / loopp if ddata sstill beingg senttSS_HII / sset SSS# higgh例子:基于Wiindowss的应急按钮钮这个USBB小产品是一一个USB HID,或或人体学输入入设备-单个个按键。当你你按下按键,所所有的活动窗窗口被最小化化,你看到的的仅剩桌面,再再按一下它,所所有的应用窗窗口又重新

23、弹弹回来。USSB键盘很有有意思,如果果插入几个键键盘,它们将将同时有效。所所以我们的小小应急按钮可可以和你的正正常键盘一起起工作。如果PC在待机机,这个应急急按钮担当了了一个新角色色-它可以充充当PC的远远程唤醒按键键。不过这取取决于你的PPC支持不支支持USB唤唤醒,有些可可以,有些不不可以。这个个按钮可以帮帮你判断你的的PC可不可可以。此例程在带有一一个USB子子卡(包含MMAX34220E)的MMAXQ20000开发板板上运行。USB详细说明明这个应用代代码包含了UUSB做枚举举类型琐碎工工作的样板代代码,此设备备的属性已经经用Paniic_Buttton_EEnum_DData.hh

24、中的特性阵阵列完全描述述。这个应用使用了了两个端点,强强制的CONNTROL端端点0,和EEP3-INN,单缓冲664字节端点点。虽然MAAX34200E内含两个个双重缓冲的的64字节端端点(EP11-OUT和和EP2-OOUT),在在这个应用中中并不需要双双重缓冲的吞吞吐优势。一个普遍存在HHID错误概概念是HIDD设备仅仅工工作在低速下下,本例展示示了即使是像像键盘这样的的东西也可以以从全速运行行中得到好处处,通过发送送12MHzz的包来而不不是1.5MMHz包,它它可以使用更更低的总线带带宽。图7. 应急按钮的流程图中断端点有查询询间隔,它决决定了USBB主设备隔多多久向IN端端点要数据

25、。每每隔一段时间间我们可以预预计到主控制制器发了一个个IN请求给给我们的设备备端点3。图图7显示了处处理这些请求求的一个简单单的状态机。只只要设备被例例举了,处理理器重复地执执行这一过程程。为了简单单起见,该应应用程序查询询中断脚是否否有效,当然然,如果你还还有其他事要要微控制器处处理,你会用用中断来激活活Do_INN3函数。状态机使用了两两个全局变量量:statte和buttton。CC宏定义了三三个状态:IIDLE, RELEAASE和 WWAIT 。状状态变量初始始化为IDLLE。如果连连在MAX33420E的的GPIN00上的按键按按下,变量bbuttonn是高,否则则为低。Maain

26、()中中的无穷循环环增加一个按按键检查定时时器,当定时时器到时它会会读一下MAAX34200E中的GPPIO寄存器器来决定按键键状态。此方方法省掉了不不必要的SPPI流量。当按键处于弹起起状态时,状状态图转到左左边的两个分分支,不做任任何事。如果果按键在IDDLE状态被被按下,就发发一个清除桌桌面上活动窗窗口的键码。键键码次序是008 (wiindowss键) 000 (保留)和07 (字母d)。下下一个状态转转到RELEEASE,这这样就完成了了。只要MAX34420E把数数据包送到UUSB,它就就产生另一个个EP3-IIN中断请求求来表示EPP3-IN FIFO可可以再一次装装载数据。然然

27、后再次进入入图7函数,此此时状态sttate = RELEEASE ,因因此函数发送送序列00 00 000来表示“按按键弹起”,下下一个状态进进入WAITT,意思是“等等待按键被释释放”。现在函数要做的的所有工作是是利用WAIIT状态分支支程序来检测测按键释放。如如果按键一直直按着,程序序不做任何事事,当按键一一被释放,状状态图就进到到右边的两个个分支,重新新初始化sttate 变变量为IDLLE,使函数数等候下一个个按键按下。占大部分运行时时间的代码只只有少数几行行,图7给出出了流程图: void Doo_IN3(void)switcch(staate)case IDLE:if (bbut

28、tonn)wreg(rEP3IINFIFOO,0 x088); / Winndows preffix keeywregg(rEP33INFIFFO,0);wreg(rEP3IINFIFOO,0 x077); / D keywrreg(rEEP3INBBC,3); / aarm itt statte = RRELEASSE; / nextt statte sennds thhe keeys upp coddebreakk; / else do noothingg (andd the SIE wwill NNAK)/case RELEAASE:wreg(rEP3IINFIFOO,0 x000);

29、/ key upwreeg(rEPP3INFIIFO,0 xx00);wwreg(rrEP3INNFIFO,0 x00); / key uupwregg(rEP33INBC,3); / armm itsttate = WAITT; / next statee waitts forr the PB too be uunpresssedbreakk; casse WAIIT:if (!buttton)sstate = IDLLE;breeak;deefaultt: staate = IDLE; / end sswitchh 代码关键需要对对代码中的一一些细节加以以说明。时间间敏感的USSB事件MA

30、AX34200E 通过在在USB总线线上送K状态10mms时间发了了一个远程唤唤醒信号,为为了避免用SSPI主控器器来做设定时时间这种杂活活,MAX33420E用用自己内部来来定时这个信信号(事实上上,所有的UUSB时间敏敏感事件),然然后在时间到到时给SPII主控器发一一个中断。SSPI主控器器对这些事件件不必用上它它自己的定时时器-它只需需启动操作,然然后等待完成成中断。ACKSTATT位函数rrregAS和和wregAAS的功能与与rreg和和wreg只只有一点不同同,它们在SSPI命令字字中设了ACCK STAATUS位。SSPI主控器器(我们的例例子中是MAAXQ20000)用这一一位表示MAAX34

温馨提示

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

评论

0/150

提交评论