前言 对许多电子电机工程师而言,「 I2C 」并不是个陌生的名词,甚至可说是相当基础的接口技术,然而就因为基础,因此也容易造成忽略,根据笔者过往的经验,在校的微控器应用课程中,多半还是教导以并列、寻址、译码、致能等逻辑程序来联系外围芯片(最典型的示范即是 i8255 I/O 扩充芯片),这是 80 年代最普遍的芯片间沟通方式,然而往后的嵌入控制应用领域中,几乎都尽可能改采简易的串行方式。 串行接口在控制类的电子应用中逐渐兴盛,包括 RS-232/422/485 、 CAN-bus 、 SPI 等,就连 PC 也逐渐倾向实行串行,包括 USB 、 1394 ,乃至今日的 SerialATA (串行式 ATA )、 PCI Express (串行式 PCI )等,都是以串行为主的传输接口,而本文将仔细讨论的 I2C 亦是其一。 由于在此我们无法逐一说明各种串行接口的运作方式,但这又是真正离开课堂后所必须面临的实务,所以在此先以最普遍运用的 I2C 接口为例,希望能因此让各位对串行方式的设计有更大的兴趣。 I2C 的起源与发展简历 如同 CAN-bus 由德国 BOSCH 公司所提出, SPI 由美国 Motorola 公司所提出, I2C 是由荷兰 Philips 半导体所提出。 Philips 早在 80 年代即摸索、尝试此一串行传输技术,最初是为了用在电视应用的相关设计( TV Set )上,能让 CPU 与外围芯片间获得速简的连通,之后于 1992 年正式发表 I2C-bus ( 1.0 版)。 ▲Philips 半导体的 I2C 标志,书写时当写成「 I 平方 C , I2C 」。(图片来源/ Semiconductors.Philips.com ) I2C 全名为 Inter-IC , IC 即集成电路, I2C 有跨芯片的「芯片际」之意,至于念法, Philips 半导体的官方网站如此写着:「 eye-squared-see 」。 I2C 1.0 即提供两种寻址模式与三种传速模式,寻址方面分成 10-bit 长寻址与 7-bit 短寻址,表示在同一个 I2C-bus 上能允许的芯片连接数(长寻址为 1,024 个,短寻址为 128 个,但实际上极难用至如此多的连接数,原因将于后述),传速方面则有 10kbps 的低速模式、 100kbps 的标准模式、及 400kbps 的快速模式。 附注:低速模式甚少使用,因此在多数文件中也极少提及。 附注: I2C 一个频率传送一个位,所以 400kbps 传输率,其意思等同于 400kHz 运作频率。 到了 1998 年, Philips 提出 I2C-bus 2.0 (至此时已有超过 50 家业者取得 I2C 技术授权,并用于超过 1,000 种不同的芯片上),追加了 3.4Mbps 的高速模式,之后 2000 年提出 I2C-bus 2.1 ,针对高速模式进行一些修订,以避免可能的误动作,并放宽部分与时序参数有关的规范。 I2C 除了用于许多嵌入式的电子设计外,在信息领域其实也有使用,在 USB 尚未兴盛前, Philips 曾以 I2C 为基础提出 Access.bus (简称: A.b ),与 USB 相同,希望竞逐取代遗旧( Legacy ) I/O 埠之用,其中 A.b 鼠标、 A.b 键盘曾流行一小段时间,不过最后还是被 USB 所一统,主要的败因当是在传输速度。不过 I2C 仍有地方优于 USB , I2C 装置相互间没有绝对的主控( Master )、受控( Slave )设定,这表示任两个 I2C 装置可以互接运用, USB 则必然是 PC 为主,其余为仆。 虽然 Access.bus 未成风气,但之后 I2C 却被 VESA 所用,用于 PC 上的模拟视讯接口( D-sub )中,让显示器与显示卡间能相互沟通,好协调出最佳的输出组态,运用在此的 I2C 被称为 DDC ( Display Data Channel ),并有单向的 DDC (显示器传至显示卡)、双向的 DDC2 、 DDC2B 、 DDC2AB 等版本演进,即便是今日的 DVI 、 HDMI 等数字视讯接口也都持续使用 DDC 。 附注:各位今日的 Windows 操作系统,在初接显示器或换接不同的新显示器时,会显示「随插即用显示器」的信息,有时甚至直接显示厂牌与型号,此背后其实就是 PC 透过 DDC ( I2C )接口对显示器进行侦测、辨识、协调沟通的作用。 另外 1995 年 Intel 因应笔记型计算机省电设计所用的智能型电池系统( Smart Battery System )而提出 SMBus ( System Management Bus ),也与 I2C 相当高程度的近似, SMBus 今日亦成为 PC 的组态、电源管理(即 ACPI , Advanced Configuration and Power Interface , 1997 年提出)所用的基础接口。 I2C 的实体层面 I2C 在实体连接上相当简单,仅有两条线路: SDA ( Serial Data Line )数据线、 SCL ( Serial Clock Line ,有些也写成 SCK )频率线,所有 I2C 装置(多半是指一颗独立封装的芯片)都并接这两条线路,同时各连接都是开汲极( Open Drain )式的 I/O 接脚,亦即接脚内部的开关在导通时为接地的逻辑低准位( Low , Lo ),而不导通时则形同断线浮接,不过 I2C 并不是要使用浮接状态,而是要使用真正的逻辑高准位,所以在 SDA 、 SCL 两在线都加入提升电阻( Pull-up resister ),使未导通状态下线路会处于逻辑高准位( High , Hi )状态。 ▲ 典型的 I2C 接口连接法,各装置以开汲极输出的方式与 SDA 、 SCL 线路并接,并在线路上加入提升电阻。(图片来源/ Semiconductors.Philips.com ) 很快面临第一个问题:提升电阻的阻值该多少?一般工程师可能直接依据参考设计( Reference Design )上的信息来给定,即是按图施工,但今日若希望增减 I2C-bus 上的连接数目呢?阻值可能就有必要重新考虑或调整。 一般而言,若 I2C 所用的 Vdd 为传统 5V ,则提升电阻必须在 1.6k ohm (奥姆)以下, 1992 年 I2C 刚提出时,当时的 486 计算机也都还在用 5V 。不过,今日 3.3V 已是主流,若 Vdd 为 3V 左右,则阻值勿超过 1k ohm 。 阻值有上限,那么是否有下限?其实是有的,但却是间接性的要求,其下限来自于 I2C-bus 上的电流值,当 I2C-bus 为 Hi 时,其接脚内的 FET 开关未导通,但即便如此线路上的电流也不得高于 0.4mA ,相对的处在 Lo 的导通状态时电流量会增大,但也不能超过 3mA 。所以设计一个 I2C-bus 系统时,必须先试行 Hi 、 Lo 运作,并在过程中量测电流表现,若电流大于规范则必须修正电阻,增加阻值。 进一步的,我们要确认 Hi 、 Lo 的逻辑准位认定, I2C-bus 是以 Vdd 为依据的比例认定,其 Hi 必须是 Vdd 的 0.7 倍以上, Lo 必须是 Vdd 的 0.3 倍以下,例如今日 Vdd 为 5V ,则 Hi 最低必须有 3.5V , Lo 最高不能破 1.5V 。 附注: I2C 另也有一种不依据 Vdd 比例式的固定式电压准位定义,直接以 3V 为 Hi 、 1.5V 为 Lo 。 此外也有最低 Lo 准位与最高 Hi 准位限制,最低 Lo 不得低于 -0.5V ,最高 Hi 不得高于 Vdd+0.5V ,在这里 Lo 与典型电气规范无异,但 Hi 的 Vdd+0.5V 就很特别,这其实是为了准位偏移( Level Shift )才特许的,若 Vdd 为 5V 则可至 5.5V ,关于准位偏移将于后述。 接着是重点:一个 I2C-bus 上可以连接多少个装置?虽然更上层的逻辑协议以长短寻址来看,可有 128 ~ 1024 个装置,但实际上受限于 I2C 线路上的电容值, I2C 规格书中明订不得超过 400pF (法拉),如此就一般设计而言,约在 10m 的线箔( PCB 印刷电路板上)内,或者约连接 20 ~ 30 个装置,就无法再扩增。而订定 bus 上的最大允许电容值,实是与前述的电流限制相应关连。同样地,最好在验证阶段能测试所设计的 I2C-bus 之电容值。 如果坚持要再扩增呢?希望有更大的连接长度(跳脱仅在 PCB 上运用的拘限,让 I2C 成为跨板的接线,或其它更长距离的运用,甚至可转成红外线传输)、更高的连接数目,就必须用上变通方法,过去许多工程师尝试用 Latch-up (准位拴锁)、 Opto-Isolate (光隔离,如光耦合器、光敏晶体管)、降低线路阻值(好允许更大的电容值)等技术来实现,不过都并非很牢靠,最后 Philips 自己提出了可双向式缓冲器( Bi-Directional Buffer )作为较合适的延伸方案。 还是确认一下位升、位降的反应时间 上述的部分大体只是简易的量测,例如量测线路电容值,简易的 Hi 、 Lo 状态尝试,并验证 Hi 、 Lo 过程中的电压、电流是否合乎标准,并对应测试结果来调修提升电阻的阻值等,若有余裕,则可再添入防静电保护( Electrostatic Discharge , ESD )或过电流保护( Over-current Protection )等设计。 更进一步的,将需要验证 Hi 、 Lo 于实际运作时的准位上升时间( Rise-Time )、下降时间( Fall-Time ),在标准模式下,上升时间不能慢过 1,000nS (即 1mS ),下降则不能慢过 300nS ,而快速模式则是上升、下降都不能慢过 300nS ,但是也不能太快,至少要超过 20 + 0.1Cb ( nS )才行,所谓 Cb 即是单一线路( SDA 或 SCL )上的电容值,假若为 200pF ,则 200pF 的 0.1 倍为 20pF ,取 20 , 20 + 20 = 40 ,表示必须要超过 40nS 才行,若 10nS 就完成准位的上升、下降程序也是不行,因此不可提早完成,唯一的例外是在混接高速装置时,允许有更快的下降时间。 若是在高速模式下,信号时间的要求就更为严苛,且已经与前述的 bus 电容值密切关连,以规格书上所言,在 10pF ~ 100pF 与 400pF 两种情形为例,在 10pF ~ 100pF 时,升降时间不能慢于 40nS ,也不能快于 10nS :若是 400pF 且电流达 3mA (电流与电容要求都近极致)则不能慢于 80nS 、亦不能快于 20nS 。 完成这样的确认后,大体上已经完成所有的硬件设计工作,除非韧体、软件在验证时一直找不到错误,怀疑是信号层面的问题,这时就需要用上记忆型示波器、逻辑分析仪,对更细部的时序( Timing )运作进行记录、分析,且先从慢速开始尝试,特别是 I2C 没有慢速下限, 0Hz 的直流都可行。 而前述的上升、下降时间量测,只要让芯片反复 Hi 、 Lo 变化,用一般示波器即可量出(最破的机种都有 20MHz 取样率),无需波形记忆或逻辑记录。 如何持续强化 I2C 的实体面? 若往 I2C 的协议层面讨论,则须从 Master (主控者)、 Slave (受控者)、 Transmitter (发送者)、 Receiver (接收者)、 Multi-master (多主控者)、 Arbitration (仲裁)、 Synchronization (同步) 等基础概念开始说明,本文在此无法详述,因此我们就实体层面进行更多的强化。 首先, I2C 系统不见得非要用提升电阻,部分情况中只要用「电流源, Current Source 」便可达到拉升效果而省去电阻。另外,也不见得整个 I2C 系统中就只倚赖两个提升电阻,每个 I2C 装置还可以在「自家门前」再行串接电阻(通常称为 Rs , Series Resistor ),如此可防止峰值电压出现时的大电流伤害。 ▲ 在 I2C 装置的近处(原文称为: Leg ,意指总 bus 下的各「腿」)再串接一个电阻,与原有的提升电路串联,可因应峰值电压的电流。(图片来源/ Semiconductors.Philips.com ) 此外,从前述已可知,在高速模式下 I2C 的许多电气特性、要求都更严苛,几乎与原有标准模式、快速模式不同(连接脚名称也改成 SDAH 、 SCLH ,以示区别),然而若有需要将高速与标准/快速一同连接(并且希望可在高速、标准/快速间切换运作),则多半需要桥接动作,透过额外的晶体管与电阻搭配,使其能够匹配运作、互通。 ▲ 让高速模式( Hs-Mode , Hs 即 High-speed )的 I2C 接口与标准/快速模式( F/S-Mode , Fast-speed/Standard-Mode )的 I2C 接口之桥接作法。(图片来源/ Semiconductors.Philips.com ) 再者,若要将不同 Vdd 准位的 I2C-bus 系统共容运作,这时就会用上前述所提及的 Level Shift 技巧,一样用上晶体管,以进行逻辑准位( Level )的转变,如此便可实现互通运作。 最后, I2C 其实也可以接线化使用,作法是将 Vdd 、 SDA 、 SCL 、 GND 等 4 条线路同时拉伸。或者,若希望长距离传输,可先连接至 Buffer 缓冲器,之后将信号电压准位拉高(例如 15V ),并于传输过程中将线路进行成对双绞,以抵抗干扰。 ▲ 在 SDA 、 SCL 线路上各接上一个晶体管,以实现 Level Shift ,让不同 Vdd 准位的 I2C 接口能共容运作。(图片来源/ Semiconductors.Philips.com ) ▲ 若想实现 I2C 的长距传输,先透过 Buffer (针对此 Philips 提出 P82B96 的 I2C-bus Buffer )进行电压准位转换,将准位从 5V 提升至 15V ,以利长程传输,并在路程中运用成对双绞方式,降低噪声的干扰程度。同时在极长程传送时,当在收发端用上萧特基二极管或基纳二极管,以抑制假性信号。(图片来源/ Semiconductors.Philips.com ) |