账号:
密码:
最新动态
产业快讯
CTIMES / 文章 /
为产品添加USB功能
 

【作者: Lane Hauck】2007年05月04日 星期五

浏览人次:【6859】

微处理器的选择通常以内建的周边功能做为考量,部份的微处理器包含有USB功能,但大部分,特别是价格相对较低的产品则没有,您是否曾经有选定了具备完美输出入与周边功能组合的微处理器后,却发现缺少了USB功能?如果能够在不需要购买新工具或学习另一种处理器架构的情况下就能进行USB周边的设计,那不正是美事一桩吗?


透过美商美信(Maxim)所推出的MAX3420E晶片产品,将USB功能添加到任何微处理器变得相当容易实现,这款晶片提供了USB全速收发器、智慧型USB串列介面引擎(Serial Interface Engine ;SIE),以及一个能够以高达26MHz SCK时脉信号运作的SPI从属介面,MAX3420E以单控制端点、两个双缓冲64byte资料端点以及一个64byte中断端点的全速USB周边方式运作。


由汇流排供电

(图一)描述了常见的USB周边架构,USB的Vbus接线提供5V电源给一个3.3V的稳压器,用来供应微控器以及MAX3420E电源,完全不需交流变压器。 SPI介面可以由3、4或5条接线组成,基本的SPI信号为串列时脉(Serial ClocK;SCK)、用来表示一个SPI传输程序动作的晶片选择(Chip Select;CS)、主控端输出从属端输入资料(Master Out Slave In data;MOSI)以及主控端输入从属端输出资料(Master In Slave Out data;MISO),部分介面可以将MOSI与MISO结合成双向接脚,带来3接脚式的介面。


MAX3420E同时也提供有一个能够节省SPI介面上资料流量的中断接脚,因此微处理器可以简单地只读取中断接脚来取得状态,而不需要一直透过SPI连接埠来抓取USB的状态位元,或者在较复杂的系统中也可以用它做为真正的中断信号。


那么如果微处理器没有具备SPI连接埠呢?不用担心,可以相当简单地透过直接控制通用输出入接脚的状态来制作一个韧体驱动的SPI主控介面。 USB的一个强大功能是能够自行控制速度,自动调整来配合SPI端的任何速度介面,这主要透过USB端的NAK交握信号来表示「忙线中请再试一次」,许多USB周边,特别是与人机介面相关的都能够相当高效率地进行互动运作,甚至是在最慢的SPI介面上。


但如果图一中的微处理器相当小型,例如在10根接脚以下,那么是不是在耗掉宝贵的接脚与USB晶片进行通讯后就没有额外的接脚可以使用了呢?没错,这也就是为什么MAX3420E提供了四根通用输入以及四根通用输出接脚来补偿与它通讯所耗掉的接脚,甚至还更多,因此事实上系统在和MAX3420E连接后还取得了更多的可用输出入接脚。


MAX3420E在应用上并不局限于小型系统,(图二)描述了如何为ASIC、FPGA、DSP或其他大型晶片添加USB功能,这样做一个相当明显的理由是这些晶片可能没有内建USB功能,或者是内含的USB功能并不符合您的需求,这个架构作法的另一个好处是,大型晶片因制程技术而逐渐缩小后,在处理USB所需的较高电压,例如3.3V的能力就会越来越差,这时具备低电压SPI介面的外接USB晶片就是一个理想的解答,为了执行低电压介面,MAX3420E内建了位准转换电路以及一个VL接脚来选择介面接脚的工作电压,范围在1.7V到3.6V之间。


如(图三),SPI介面同时也是加入光隔离器相当方便的位置,由于信号为单向,因此可以规划以相对较低的速度运作以支援低成本的光隔离元件。



《图一 透过USB 5V Vbus接线供电的USB装置,SPI接口可以使用3、4或5根接脚,不过MAX3420E可以提供超过它所耗用的输出入接脚。》
《图一 透过USB 5V Vbus接线供电的USB装置,SPI接口可以使用3、4或5根接脚,不过MAX3420E可以提供超过它所耗用的输出入接脚。》

SPI介面

串列周边介面(Serial Peripheral Interface;SPI)是一个使用两条资料线、一条串列时脉以及一个晶片选择信号的简单型串列式介面,SPI主控端首先将CS#接脚拉低来启动传输动作,接着透过推动串列时脉SCK的同时将资料送出或由从属元件读入资料,SPI主控端藉由将CS#接脚拉回​​高电位来完成整个传输程序。


SPI介面拥有四种时脉模式,反应在两个称为时脉极性(Clock POLarity;CPOL)以及时脉相位(Clock PHAse;CPHA)的信号模式中,这些信号以(CPOL,CPHA)的形式表示,因此一个期望正向边缘SCKS并同时希望MOSI资料在第一个正向时脉边缘前出现的介面可以在模式(0,0)与模式(1,1)下运作而不需变换,这样的特性使得MAX3420E可以在模式(0,0)或(1,1)下运作而不需要一根模式选择接脚。


(图四)描述了MAXQ2000微处理器与MAX3420E之间使用SPI模式(0,0)与(0,1)传输资料的情形,其中的差异在于SCK信号的未动作位准,其中低位准时为模式(0,0),高位准时则为模式(1,1)。


MAX3420E将每次传输动作的第一个位元组视为命令位元组,命令位元组包含了暂存器编号以及方向位元,第二个以及接下来的的位元组则包含传输资料,您可能会想知道,图四中当命令位元组送入(MOSI)时,MAX3420E会提供什么样的输出(MISO),事实上当每次命令位元组送入时会有八个USB状态位元输出,但这项功能只有在采用独立MISO与MOSI输出入接脚时才会启动。



《图二 MAX3420E并不局限于小型系统,内建的位准转换电路可以处理低于3.3V的接口电压,SPI端口则可以以高达26 MHz的速度运作。》
《图二 MAX3420E并不局限于小型系统,内建的位准转换电路可以处理低于3.3V的接口电压,SPI端口则可以以高达26 MHz的速度运作。》

SPI程式码

撰写MAX3420E通用C语言程式码的诀窍在于将最细的SPI运作流程隔离在一个模组中,并依不同的SPI介面进行这个模组的调整,在最低程度的要求上,这个模组可以只做三件事,分别为SPI连接埠的初始化、读取位元组以及送出位元组。


本文的范例应用采用硬体式的SPI单元,对于没有独立SPI硬体的主控端,将会先讨论采用位元操控(bit-banged)方式的SPI介面程式码。


位元操控式SPI介面

进行SPI连接埠的初始化函数会因处理器而有所不同,主要用来指定介面所使用的特定输出入接脚,设定它们的方向,然后设定CS=1以及SCK=0的初始状态,在此假设使用模式(0,0)的SPI主控端。


(公式一)显示了读写MAX3420E暂存器的通用程式码,开头始的巨集定义了推动SCK信号高低电位、推动CS高低电位,并使用MOSI以及MISO接脚透过时脉将资料送出或读入的低阶接脚运作,这个巨集将函数与各类不同处理器的不同输出入接脚安排方式隔离,巨集的使用可以让程式码更容易阅读,同时也能够排除和处理器间的相关性,列表一中的巨集主要提供给没有内含硬体SPI单元的典型旧式微处理器使用。


硬体SPI

Tom Cantrell在2004年9月号的Circuit Cellar杂志中为读者介绍了MAXQ2000,简单来说,MAXQ2000是美商美信(Maxim/Dallas)所推出一系列低耗电高效能RISC处理器的第一个产品,其中Q代表安静与平和,表示这个架构在设计上能够平顺地与敏感的类比线路搭配。从USB介面的观点来看,MAXQ2000特别适合MAX3420E,原因是它内建了SPI连接埠,以下的例子将利用MAXQ2000开发工具组以及MAX3420E来架构一个简单但有趣的Windows装置,请参考(图五) 。


MAXQ2000的硬体式SPI单元提供有SCK、MOSI以及MISO,但没有CS#,由于CS#在运作上有许多变化,例如在存取一个位元组或多个连续位元组时,因此最好使用一根通用输出入接脚做为CS#使用。


(图六)描述了MAXQ系列的基本输出入单元,每一个输出入单元都拥有一个正反器,在这个例子中透过称为PO5.3的位元写入,其中O代表输出,(我们)可以随时写入这个正反器,而它的输出是否与输出入接脚连接则由方向位元决定,在进行输出接脚组态时,最好能够在将它连接到接脚前先将资料写入正反器以避免突波杂讯。


P53接脚的方向由称为PD5.3的位元决定,其中D代表方向,同时D信号也可以做为接脚驱动的输出控制功能,1代表受到驱动,0则为浮动(float)。


接脚的状态则可以随时由称为PI5.3的位元读入,其中I代表输入,不管接脚的驱动方式是使用内部正反器(PD5.3=1)或外部电路(PD5.3 =0),PI位元都能够提供接脚的目前状态。


这个结构的一个优点是,如果接脚设定为输入(PD5.3=0),那么正反器的输出就不会成为输出,因此能够被用来做为提升电阻的切换开关,当D=0时,O信号就重新定义为「连接提升电阻」,请参考(图六)中的虚线和切换开关。


部分的输出入接脚还拥有中断功能,请参考图六下方,中断电路方块拥有三个信号,当中断要求动作时会设定一个旗标位元,并透过CPU加以重置,边缘选择位元则可以决定正向或负向信号变化会产生中断要求,最后,每个接脚并提供一个可以用来控制是否能够提出中断要求的中断功能启动位元。


本文的范例应用程式将MAX3420E的INT输出接脚设定为正向变化边缘触发中断,在MAXQ2000端,程式码会直接测试中断正反器来决定是否有待处理的USB中断而不使用MAXQ2000本身的中断系统,程式随时检查按钮开关的状态并回应USB的要求,因此持续检查回圈是程式唯一的需求。


MAXQ2000的输出入接脚可以规划为通用输出入或特殊功能硬体,例如SPI单元,如果要使用特殊的硬体,首先必须进行硬体电路方块的设定,然后将它连接到输出入接脚上,程式码中的SPI_Init()常式先设定了接脚的方向,接着进行SPI介面的组态,最后再加以启动。


程式码中的rreg以及wreg函数利用了MAXQ2000中的硬体SPI单元,因此在程式码上比采用位元操控方式要简洁,执行速度也较快。


范例:Windows Panic Button

这个USB装置属于USB人机介面装置,拥有单一按钮,当按钮按下时,所有已开启的视窗会立即最小化,让我们可以直接看到桌面,再按一次,所有的应用程式视窗会再重现。


USB键盘相当有趣,如果插入多个键盘,那么它们可以同时动作,因此按钮装置事实上可以搭配正常的键盘运作。


如果PC进入暂停模式,那么这个单一按钮装置还可以扮演新的角色,例如做为PC的远端唤醒按键,不过这项功能必须视PC是否支援USB唤醒功能而定,有些可以,有些则不行,不过最少这个按钮装置可以帮助确认PC是否支援这项功能。这个程式码范例在扩充连接槽上插有内含MAX3420E小型USB子板的MAXQ2000开发工具组上执行,程式码本身事实上是一个更为完整USB程式码范例的精简版,可以透过Maxim/Dallas网站下载完整的程式码。


《图三 SPI接口提供了将USB端口与控制器隔离的理想位置,SPI信号为单向,同时速度也可以相对较低(1 MHz SCK),让我们可以使用低成本的光隔离组件。》 - BigPic:606x305
《图三 SPI接口提供了将USB端口与控制器隔离的理想位置,SPI信号为单向,同时速度也可以相对较低(1 MHz SCK),让我们可以使用低成本的光隔离组件。》 - BigPic:606x305

USB的动作细节

这个应用程式包含了进行繁杂列举(enumeration)工作的USB程式码,装置的特定资讯可以由程式列表中Panic_Button_Enum_Data.h内的字元阵列完整描述。


这个应用使用两个端点,包括必要的CONTROL控制端点0,以及一个单缓冲64byte端点EP3-IN,虽然MAX3420E内含了两个双缓冲64byte端点(EP1-OUT与EP2-IN),但双缓冲所提供的输出效能优势在这个应用中并不需要。


一个有关HID的常见错误观念是HID只能以低速运作,这个应用显示,就算是像键盘这类的低速装置也能够由全速运作获益,由于它透过12MHz而非1.5MHz封包传送资料,因此使用了较少的汇流排频宽。


中断端点拥有一个定时读取的时间间隔,决定了USB主控端询问IN端点读取资料的时间间隔,在每个时间间隔中可以期待主控端会发送一个IN要求到装置的端点3,(图七)描述了一个处理这个需求的简单状态机,当装置经过列举程序后,微处理器会重复执行这个常式,为了简化,这个应用程式会反覆读取中断接脚来取得状态,当然如果微处理器需​​要进行其他的工作,那么可能会想要启动Do_IN3函数的中断功能。


状态机中使用了两个全域变数state与button,C巨集定义了三个状态,分别为IDLE、RELEASE以及WAIT,其中state变数初使化为IDLE,变数button则在连接到MAX3420E GPIN0接脚的按压式按钮按下时为1,否则为0,在main()中的无尽回圈会持续进行并增加按钮检查计时器的计数值,当超过设定值时则会读取MAX3420E中的GPIO暂存器来决定按钮的状态,这将可以节省不必要的SPI动作。


当按钮没被按下时,状态图会依左边的路径行进,因此不会有任何反应,如果按钮在IDLE状态下被按住,那么就必须送出将开启视窗最小化的按键码,内容为08 (视窗按键)00(反向)与07(字母d)的连续序列,接着将下一个状态设定为RELEASE,这时工作就已结束。


当MAX3420E将这个封包由USB发出时,它会产生另一个EP3-IN中断要求来表示EP3-IN的FIFO中已经可以再一次提供资料读取,图七中的函数会再次进入,这时state=RELEASE ,因此函数会送出00 00 00的位元组序列,代表按钮放开,下一个状态则设定为WAIT,代表等待按钮被放开。


并非所有的函数都必须使用WAIT状态分支来侦测按钮放开的动作,当按钮还被按住时,不需任何反应,当按钮放开后,状态图就会经过右方的路径并将state变数重新初始化为IDLE,准备迎接下一次的按钮动作。


大部分时间所执行的程式只占了23行的C语言码,请参考Do_IN3函数来了解图七中流程图的实现方式。


程式码解说

在程式码中有一些部分值得进一步探讨。



《图四 上方的4个波形状态显示了在SPI模式(0,0)下运作的SPI接口,下方则是使用相同接口发送相同数据,但在SPI模式(1,1)下运作的波形状态,两者的差别在于静态SCK位准以及第一个正向SCK边缘发生的时间。》 - BigPic:640x403
《图四 上方的4个波形状态显示了在SPI模式(0,0)下运作的SPI接口,下方则是使用相同接口发送相同数据,但在SPI模式(1,1)下运作的波形状态,两者的差别在于静态SCK位准以及第一个正向SCK边缘发生的时间。》 - BigPic:640x403

与时间密切相关的USB事件

MAX3420E透过驱动K状态到汇流排上10ms来发出远端唤醒的动作,为了让SPI主控端免除时间计数的负担,可以利用MAX3420E内部来进行时间信号的计数,事实上所有USB与时间相关的事件都可以,然后在计时时间到达后提供给SPI主控端一个中断信号,这时SPI主控端就不需要让自己的计时器束缚在这些事件上,它只要直接启动运作,然后等待完成的中断信号即可。



《图五 这个应用在安装了内含MAX3420E小型扩充子板的MAXQ2000评估套件上运行,图中标示了端口到SPI信号的指定方式,可以做为阅读程序代码时的参考。》
《图五 这个应用在安装了内含MAX3420E小型扩充子板的MAXQ2000评估套件上运行,图中标示了端口到SPI信号的指定方式,可以做为阅读程序代码时的参考。》

ACKSTAT位元

rregAS与wregAS函数和rreg与wreg函数的一个不同点是会在SPI命令位元组中设定ACK STATUS状态位元,SPI主控端,在例子中为MAXQ2000,使用这个位元来告知MAX3420E它已经完成目前的CONTROL要求,因此透过确认状态来结束CONTROL的传送,ACKSTAT同时也以内部暂存器位元的形式存在,但包含在SPI命令位元组中,这个经常用到的动作可以取得更快的执行速度,同时也更节省程式码。


readbytes(), writebytes()函数

这些函数借助了MAX3420E的连续发送能力,不再采用每次使用时发送分别为命令位元组与资料位元组的两个位元组作法,它们首先拉低CS#,送出命令位元组,接着送出或读入一序列的位元组,最后拉高CS#来结束这次的SPI传输程序。


产品ID在哪里

存在Panic_Button_Enum_Data.h中的产品ID字串,提供了第一次插入单按钮装置时所显示的讯息,会在列举程序显示做为单按钮HID装置的辨识资料,并与内建的视窗驱动程式连结。


接下来的动作都相当简单,除了在插入USB装置时所听到的视窗声响外,如果想要检查装置的状态,那么可以进入USB人性化介面装置内容画面。可以透过在我的电脑上按下滑鼠右键,选择内容、硬体、装置管理员、展开人性化介面装置,并在USB人性化介面装置上按下右键并选择内容,将可以看到「MAX3420E USB Panic Button」等文字。



《图六 MAXQ系列输出入单元,输出入端口位以P.B表示,其中P为端口,B则代表位,图中为端口5中的位3。》
《图六 MAXQ系列输出入单元,输出入端口位以P.B表示,其中P为端口,B则代表位,图中为端口5中的位3。》

USB的相容性

当看到程式码时可能会觉得,就算是只有单颗按钮的USB装置难道都需要这么复杂的工作吗?这是因为对任何USB装置来说,都必须有一些基本动作需要执行,幸运地是,USB在设计上规划详细,因此整个列举程式码可以用来做为任何其他USB装置的范本,几乎上只要直接拷贝贴上就可使用。


所有聪明的开发工程师都希望进行的设计能够取得USB-IF论坛的认证,这将可以拥有使用USB商标的权利,并确保设计可以在任何PC上运行,这个应用通过了USBCV命令验证(USB Command Verifier 1.2.1.0版)以及USB-IF论坛网站上提供给开发工程师测试套件中的HID测试。



《图七 Windows Panic Button应用的动作流程图,这个算法仅使用29行的C语言程序代码,这个应用包含了连接到USB端口的单一按钮,按下按钮可以立即缩小或还原开启中的所有窗口。》 - BigPic:711x532
《图七 Windows Panic Button应用的动作流程图,这个算法仅使用29行的C语言程序代码,这个应用包含了连接到USB端口的单一按钮,按下按钮可以立即缩小或还原开启中的所有窗口。》 - BigPic:711x532

结语

如果需要设计一个USB周边,那么请参考MAX3420E,这是一款小型、容易设计同时搭配大量免费程式码的产品,可以为设计添加输出入接脚,并且能够与具备SPI支援的系统搭配,由于SPI相当容易利用位元操控的技巧实现,因此这也代表了这个产品可以搭配任何微处理器使用,如果需要更高效能,还可以让SPI介面以高达26MHz的时脉运作。


---作者为Maxim美商美信公司资深科学家---


相关文章
USB供电5.8 GHz RF LNA具有输出电源保护
选择USB转接驱动器的须知三要点
轻松有趣地提高安全性:SoC元件协助人们保持健康
医疗设备高效电源管理之高性能设计
聚焦工业与网通 以生态系统观点布局市场
comments powered by Disqus
相关讨论
  相关新闻
» 研华AIoV智慧车联网解决方案 打造智慧交通与商用车国家队
» 资策会MIC 37th春季研讨会即将登场 聚焦AI主轴探讨趋势
» MSI於2024 NAB Show展示媒体及娱乐产业适用的GPU伺服器
» 鼎新电脑串连生态系夥伴 数智驱动智慧低碳未来制造
» 微星科技携手Discovery推动世界地球日


刊登廣告 新聞信箱 读者信箱 著作權聲明 隱私權聲明 本站介紹

Copyright ©1999-2024 远播信息股份有限公司版权所有 Powered by O3  v3.20.1.HK84K1VBZPMSTACUKA
地址:台北数位产业园区(digiBlock Taipei) 103台北市大同区承德路三段287-2号A栋204室
电话 (02)2585-5526 #0 转接至总机 /  E-Mail: webmaster@ctimes.com.tw