USB学习一:USB硬件电路解析
2015-02-02
其实早就想学习USB了,但是开始的时候由于基础差点,看到USB那么多繁复的上电复位啊枚举啊还有那么多的包啊,头很大没有一点思路。所以当时只是看看资料翻翻周立功的《PDIUSBD12 USB固件编程与驱动开发》做个了解,并没有深入。但是正如圈圈的USB小组里说的,现在的电子工程师不懂USB可不行,所以决心重新着手USB的进阶了。其实我以前的51实验板和MSP430的板子上面都有USB的这一块电路,只可惜实验程序写得不够针对,所以看起来很费劲,也提不起我的兴趣。现在有圈圈的板子,我想那么多有针对性并且完整的程序在等着,岂有学不会之理!
我的第一篇USB日志从硬件下手,至于基本的一些概念当然是要先了解的,但是我以为学习应该以实践为主,以练带学,从中不断积累。所以,在了解了一些基本的USB的概念和PDIUSBD12芯片以后,应该着手实践了。其实如果你不是做USB的芯片开发,对于那一大堆理论也不是必须完全领会的,我也是带着似懂非懂的状态来操控PDIUSBD12的,对于它的一些寄存器的控制是重点,掌握了这个基本算是入了门,至于其它的一些时序上的读写操作什么的我想对于有基础的人不是难点。
先来看一下PDIUSBD12的引脚配置和引脚分配:
圈圈的原理图我就不贴了(不好截图,有点乱,呵呵~~)。D0-D7口接单片机的P0口,因为实验中不使用DMA传输,所以与DMA传输有关的DMREQ,DMACK_N,EOT_N几个引脚被悬空或者接地了。CLKOUT,VOUT3.3和SUSPEND三个引脚由于不使用就悬空或者接地了。GL_N接一个电阻和LED指示灯用于指示通信状态,INT_N接单片机的一个中断口,D+和D-两个差分信号是接标准USB接口的,XTAL1和XTAL2之间接16MHz的晶振,另外VCC,GND自不必说。最后来看下几个可以有不同接法的引脚:ALE,RD_N,WR_N,CS_N,其实这几个引脚的不同接法是普遍性的,也就是说你可以把这几个脚接成单片机时序控制数据地址的读写操作,也可以把PDIUSBD12的寄存器接成单片机的外部RAM,这样对寄存器的寻址就和RAM一样了,可以免去复杂的时序操作。而我们看到圈圈的电路里采用了前者,也就是用时序来读写D12的寄存器,因此它的电路接法是:把ALE接地,CS_N接地(片选有效),WR_N,RD_N接单片机的专用读写口P3.6和P3.7(采用时序读写操作这两个口其实不一定非得接这两个口,接其它任何的IO口也行),所以在程序里面我们会看到有专门的D12寄存器读写子程序。
我们再来讨论一下后者的接法实现,如图:
这种接法是把D12的ALE脚与单片机的ALE脚相接,这是专用的外部RAM扩展,详细的说明(包括RAM扩展接法的寻址和读写)在CAN学习笔记的硬件部分有介绍了。
以上两种寄存器读写方式都是很有代表性的,无所谓谁好谁坏,根据个人习惯吧。其实在RAM寻址空间允许的情况下采用后者还是比较方便的。但是圈圈采用了前者,那么在以后的程序中都以此为基础进行编程。
上面分析了D12的各个管脚的分配情况,有些脚还必须接一定的电阻,如差分信号D+和D-就必须在接1K的电阻后接VCC或者GND。USB标准接口的四个信号口,中间两个就是接差分信号的,而边上两个就是电源信号(从计算机接出的+5V,有时大家在设计时往往利用这个5V做系统电源)。
硬件电路分析到这里大概能对D12有一个初步的掌握了,下一步就应该去熟悉一下D12内部的一些寄存器以及这些寄存器在不同的配置状态下都能实现什么样工作。