关于I2C Bus与SMBus,许多人很少去谈论与了解两者的细节差异,包括很多国外的简报文件也经常将两者混写、交杂描述、交替运用。
确实,在一般运用下,I2C Bus与SMBus没有太大的差别,从实体接线上看也几乎无差异,甚至两者直接相连多半也能相安无误地正确互通并运作。不过若真要仔细探究,其实还是有诸 多不同,如果电子设计工程师不能明辨两者的真实差异,那么在日后的开发设计的验证除错阶段时必然会产生困扰,为此本文将从各层面来说明I2C Bus与SMBus的细微区别,期望能为各位带来些许助益。
附注:关于I2C Bus的基础,可参考笔者之前的「I2C介面之线路实务」,网址为:
http://www.digitimes.com.tw/n/article.asp?id=304799064272FED148256FDC00481D68
或参考Philips半导体网站的I2C官方规格:
http://www.semiconductors.philips.com/acrobat/literature/9398/39340011.pdf
运用背景、版本演进之别
首先从规格的制订背景开始,I2C是在设计电视应用时所发创的介面,首版于1992年发表;而SMBus(System Management Bus)则是Intel与Duracell(金顶电池)共同制订笔记型电脑所用的智慧型电池(Smart Battery)时所发创的介面,首版于1995年发表,不过SMBus文件中也提及,SMBus确实是参考自I2C,并以I2C为基础所衍生成。
I2C起源于电视设计,但之后朝通用路线发展,各种电子设计都有机会用到I2C;而SMBus则在之后为PC所制订的先进组态与电源管理介面(Advanced Configuration & Power Interface;ACPI)规范中成为基础的管理讯息传递介面、控制传递介面。
虽然I2C与SMBus先后制订时间不同,但都在2000年左右进入成熟化改版,I2C的过程改版以加速为主要诉求,而SMBus以更切合Smart Battery及ACPI的需求为多。
I2C三次主要改版:
1992年v1.0
1998年v2.0
2000年v2.1
SMBus三次主要改版:
1995年v1.0
1998年v1.1
2000年v2.0
▲图说:MAXIM公司的MAX6641晶片,具有温度监督及风扇控制功能(用PWM脉宽调变方式控制风扇转速),图中脚位7、8即是SMBus(圈处),其他装置可透过SMBus与此晶片沟通,取得温度及相关资讯,或进行命令操控。 (图/MAXIM-IC.com)
电气特性差异:逻辑位准定义、限流、相关限制
I2C的Hi/Lo逻辑准位有两种认定法:相对认定与绝对认定,相对认定是依据Vdd的电压来决定,Hi为0.7 Vdd,Lo为0.3 Vdd,绝对认定则与TTL准位认定相同,直接指定Hi/Li电压,Hi为3.0V,Lo为1.5V。相对的SMBus只有绝对认定,且准位与I2C有异,Hi为2.1V,Lo为0.8V,与I2C不全然吻合但也算部分交集。
不过,SMBus后来也增订一套更低电压的准位认定,Hi为1.4V,Lo为0.6V,这是为了让运用SMBus的装置能更省成本而有的作法。
了解电压后再来是电流,由于SMBus一起头就是运用在笔记型电脑内,所以低用电的表现优于I2C,只需100uA就能维持工作,I2C却要到3mA,同样的低用电特性也反应在漏电流(Leakage Current)的要求上,I2C最大的漏电流为10uA,SMBus为1uA,但是1uA似乎过度严苛,使运用SMBus的装置在验证测试时耗费过多的成本与心力,因此之后的SMBus 1.1版放宽了漏电流上限,最高可至5uA。
再者是相关限制,I2C有线路电容的限制,SMBus却没有,但也有相类似的配套规范,即是准位下拉时的电流限制,当SMBus的开集极接脚导通其闸极而 使线路接地时,流经接地的电流不得高于350uA,另外拉升电流(即相同的开集极接脚开路时)也一样有规范,最小不低于100uA,最高也是不破 350uA。
既然对电流有限制,那么也可容易地推断对提升电阻的阻值之范围要求,I2C在5V Vdd时当大于1.6k ohm,在3V Vdd时当大于1k ohm,类似的SMBus于5V Vdd时当大于14k ohm,3V Vdd时当大于8.5k ohm,不过这个定义并非牢不可破,就一般实务而言,在SMBus上也可用2.4k~3.9k ohm范畴的阻值。
附注:I2C的时脉线称SCK或SCL,资料线称SDA。 SMBus的时脉线称SMBCLK,资料线称SMBDAT。
▲图说:I2C与SMBus在逻辑位准的电压定义不尽相同,基本上I2C的定义较为宽裕、弹性,而SMBus则更专注在省电方面的要求。 (图/MAXIM-IC.com)
时序差别与考验
实体层面的空间要求完后,再来就是实体层面的时间,即是时序(Timing)方面的差别。
先以运作频率来说,I2C此方面相当宽裕,最低频可至0Hz(直流状态,等于时间暂停),高可至100kHz(Standard Mode)、400kHz(Fast Mode)、乃至3.4MHz(High Speed Mode) ,相对的SMBus就很拘限,最慢不慢于10kHz,最快不快于100kHz。很明显的,I2C与SMBus的交集运作频率即是10kHz~100kHz间。
用于笔记型电脑的电池管理或PC组态管理、用电管理的SMBus,很容易体会不需要更高运作频率的理由,只要传递小资料量的监督讯息、控制指令本就不用过 于高速,而朝向广遍运用的I2C自然希望用更高的传输以因应各种可能的需求。然而大家可能会疑惑,为何SMBus有最低速的要求?何不放宽到与I2C相同 的毫无最低速限呢?
SMBus一定要维持10kHz以上的运作时脉,主要也是为了管理监控,另一个用意是只要在保持一定传速运作的情况下加入参数,就可轻松获知汇流排目前是 否处于闲置(Idle)中,省去逐一侦测传输过程中的停断(STOP)信号,或持续保有停断侦测并辅以额外参数侦测,如此对汇流排闲置后的再取用会更有效 快速。
传速要求之后还有资料持留时间(Data Hold Time)的要求,SMBus规定SMBCLK线路的准位下降后,SMBDAT上的资料必须持续保留300nS,但I2C却没有对此有相同的强制要求。
类似的,SMBus对介面被重置(Reset)后的恢复时间(Timeout)也有要求,一般而言是35mS,I2C这方面亦无约束,可以任意延长时间。 相同的SMBus也要求无论是在主控端(Master)或受控端(Slave),其时脉处于Lo准位时的最长持续时间不得超越限制,以免因为长时间处在 Lo准位,而致收发两端时序脱轨(失去同步,造成后续误动作)。
还有,I2C与SMBus在准位的上升时间、下降时间等也有不同的细部要求,此点必要时也必须进行确认,或在验证过程中稍加留意。
▲图说:Smart Battery或ACPI的实现、监督、与操控,最底层都需要SMBus(圈处)作为后援,图为简易的多组式智慧型电池系统,图中有Smart Battery A、B两组电池。 (图/SBS-Forum.org)
「已妥」与「未妥」机制的强制性差别
不单是电气、时序有别,更高层次的协定机制也有不同。在I2C中,主控端要与受控端通讯前,会在汇流排上广播受控端的位址资讯,每个受控端都会接收到位址 资讯,但只有与该位址资讯相切合的受控端会在位址资讯发布完后发出「已妥」的回应(Acknowledge;ACK),让主控端知道对应的受控端确实已经 备妥,可以进行通讯。
但是,I2C并没有强制规定受控端非要作出回应不可,也可以默不作声,即便默不作声,主控端还是会接续工作,开始进行资料传递及下达读/写指令,如此的机制在一般运用中还是可行,但若是在一些即时(Real Time)性的应用上,任何的动作与机制都有一定的时限要求,这种可有可无式的回应法就会产生问题,可能会导致受控端无法接收资讯。
相同的情形,在SMBus上是不允许受控端在接收位址资讯后却不发出回应,每次都要回应,为何要强制回应?其实与SMBus的应用息息相关,SMBus上 所连接的受控装置有时是动态加入、动态移除的,例如换装一颗新电池,或笔记型电脑接上船坞埠等,如果接入的装置已经改变却不回应,则主控端的程式所掌握的 并非是整体系统的最新组态,就会造成误动作。
类似的情形也适用于ACPI,PC机内机外经常有一些装置可动态增入、移除,如机内风扇、外接印表机等,这些也一样该强制对主控端广发的位址资讯作出完整回应。
位址动作方面有异,资料传输方面也有异。在I2C方面,Slave虽然对Master所发出的位址作出回应,但在后续的资料传递中,可能因某些事务必须先行处理、因应而无法持续原有的传输,这时候Slave就要对Master发出「未妥」的回应(Not Acknowledge;NACK),向Master表示Slave正为他务忙碌中。
而SMBus方面,与I2C相同的,会以NACK的回讯向Master表达Slave尚未收妥传递的资讯,但是SMBus的Slave会在后续的每个 Byte传输中都发出NACK回讯,这样设计的原因是因为SMBus没有其他可向Master要求重发(Resend)的表示法。更直接说就是:NACK 机制是SMBus标准中的强制必备,任何的讯息传递都很重要,不允许有漏失。
▲图说:I2C在完成一段位址或资料资讯的传输后,受接端可发出讯息收妥(ACK)、未妥(NACK)的回应,SMBus也具相同的机制,但由于应用之故有更强制的回应要求。 (图/Semiconductors.Philips.com)
传输协定的子集、超集
互动知会机制上有强制与否的差别,协定方面也是。 SMBus的通讯协定与协定中所用的讯息格式,其实只是取自I2C规范中,对于资料传输格式定义中的子集合(Subset)而已。所以,如果将I2C与 SMBus交混连接,则I2C装置在存取SMBus装置时,只能使用SMBus范畴的协定与格式,若使用I2C的标准存取方式反而无法正确存取。
另外,I2C规范中有一种称为「General Call」的广呼方式,当发出「0000000」的位址资讯后,所有I2C上的Slave装置统统要对此作出反应,此机制适合用在Master要对所有的Slave进行广播性讯息更新与沟通上,是一种总体、批次的运作方式。
SMBus一样有General Call机制,但在此之外SMBus还多了一种特用的ALERT(警讯)机制,不过这必须于时脉线与资料线外再追加一条线(称为:SMBSUS)才能实 现,ALERT虽名为警讯但其实是中断(Interrupt)的用意,Slave可以将SMBSUS线路的电位拉低(ALERT#,#表示低准位有效), 这时就等于向Master发出一个中断警讯,要求Master尽速为某一Slave提供传输服务。
Master要回应这个服务要求,是透过I2C/SMBus的时脉线与资料线来通讯,但要如何知道此次的通讯只是Master对Slave的一般性通讯?还是特别针对Slave的中断需求而有的服务回应?
这主要是透过Master发出的位址资讯来区别,若为回应中断的服务,位址资讯必然是「0001100」,当Slave接收到「0001100」的位址资讯,就知道这是Master特为中断而提供的服务通讯。
因此,韧体工程师须留心,规划时必须让所有的Slave都不能占用「0001100」这个位址,以供ALERT机制运用(当然!若现在与未来都不会用上ALERT机制则可尽管占用)。事实上各种进阶的规范标准(如Smart Battery、ACCESS.bus、VESA DDC等)都在I2C的短定址中订立了一些为自用而保留的位址,这在最初设计与定义时就该有所留意,以免因先行占用而导致日后须改写韧体的麻烦。
补充提醒的是,SMBSUS一样是开集极外加提升电阻的线路,所以有一个Slave将电位拉下后,其余Slave侦测到电位被拉下,表示已有Slave正 在与Master进行中断需索与回应服务,须等待抢到中断服务权的Slave确实被服务完毕,重新将SMBSUS释放回高准位后,才能持续以「看谁能先将 线路准位拉低?」的方式来争取中断服务。
最后,若有进一步兴趣的读者,笔者建议可参考两份资料:
1.SMBus 2.0版规范(SMBus规格网站)
http://www.smbus.org/specs/smbus20.pdf
2.比较I2C与SMBus(MAXIM公司网站)
HTML版:http://www.maxim-ic.com/appnotes.cfm/appnote_number/356