I2C bus
I²C (Inter-Integrated Circuit )字面上的意思是積體電路之間 ,它其實是I²C Bus 簡稱,所以中文應該叫集成电路总线 ,它是一種串列通訊匯流排 ,使用多主從架構,由飛利浦 公司在1980年代為了讓主機板 、嵌入式系統 或手機 用以連接低速週邊裝置而發展。I²C的正確讀法為“I平方C”("I-squared-C"),而“I二C”("I-two-C")則是另一種錯誤但被廣泛使用的讀法。自2006年10月1日起,使用I²C協定已經不需要支付專利費,但製造商仍然需要付費以取得I²C從屬裝置位址[ 1] 。
設計概說
(啟始)-[控制]-[指令]-[資料]-(結束)
(啟始)-[控制0]-[指令]-(r啟始)-[控制1]-[資料]-(結束)
I²C-Bus
一個由單一主控端(一個微控制器 )及三個從屬節點(一個類比數位轉換器 )、一個數位類比轉換器 以及一另一個微控制器)所構成,並使用了上拉電阻 Rp 。
I²C只使用兩條雙向漏极开路 (Open Drain)线,其中一条线为传输数据的串列資料线(SDA, Serial DAta line),另一条线是启动或停止传输以及发送时钟序列的串列時脈(SCL, Serial CLock line)线,这两条线上都有上拉電阻 [ 2] 。I²C允許相當大的工作電壓範圍,但典型的電壓準位為+3.3V或+5v。
I²C的參考設計使用一個7位元長度的位址空間 但保留了16個位址,所以在一組匯流排最多可和112個節點通訊[ a] 。常見的I²C匯流排依傳輸速率的不同而有不同的模式:標準模式 (100 kbit/s)、低速模式 (10 kbit/s),但時脈頻率可被允許下降至零,這代表可以暫停通訊。而新一代的I²C匯流排可以和更多的節點(支援10位元長度的位址空間)以更快的速率通訊:快速模式 (400 kbit/s)、快速+模式 (1 Mbit/s)高速模式 (3.4 Mbit/s)超高速模式 (5 Mbit/s)。
雖然最大的節點數目是被位址空間所限制住,但實際上也會被匯流排上的總電容 所限制住,一般而言為400 pF。
Data transfer sequence
参考设计
I²C仅使用两个双向开漏线,串列数据线(SDA)和串列时钟线(SCL),以及上拉电阻。使用的典型电压是+5 V或+3.3 V(虽然其他电压系统也是允许的)。
在I²C参考设计中,使用7或10位(取决于所使用的设备)地址空间。普通I²C总线速度为100 kbit / s的标准模式和10 kbit / s的低速模式,但任意低时钟频率也是允许的。 I²C的最新修订可以承载更多的节点,并以更快的速度运行[ b] 。这些速度被更广泛地使用在嵌入式系统中而不是PC上。I²C也有其他的特性,例如16位寻址。
请注意,这里引用的比特率为主节点和从节点之间没有时钟延长或其他硬件开销的传输比特率。协议开销包括一个字节从地址(或许还有从设备内部寄存器地址)以及每个字节的ACK / NACK比特。因此这意味着,用户数据的实际传输速率要低于峰值比特率。例如,如果与从设备以低效的每次仅一个字节数据进行传输,数据率将比峰值比特率少于一半(因为其余的时钟需要发送一个字节地址和ACK比特)。
节点的最大数量受限于地址空间以及400 pF 的总总线电容 。400 pF总电容也限制了实际通訊距离只有几米。
如上所述,参考设计为使用串列数据线(SDA)和串列时钟线(SCL)、拥有7位元寻址空间的总线。
总线上有两种类型角色的节点:
主节点 - 产生时钟并发起与从节点的通訊
从节点 - 接收时钟并响应主节点的寻址
该总线是一种多主控总线 ,即可以在总线上放置任意多主节点。此外,在停止位元 (STOP)发出后,一个主节点也可以成为从节点,反之亦然。
总线上有四种不同的操作模式,虽然大部分设备只作为一种角色和使用其中两种操作模式:
主节点发送 - 主节点发送数据给从节点
主节点接收 - 主节点接收从节点数据
从节点发送 - 从节点发送数据给主节点
从节点接收 - 从节点接收主节点数据
一开始,主节点处于主节点发送模式,发送起始位元 (START),跟着发送希望与之通訊的从节点的7位元地址,最后再发送1位读写位元,该位元表示主节点想要与从节点进行读(1)还是写(0)操作。
如果从节点在总线上,它将以ACK字元 应答(低態觸發)该地址。主节点收到应答后,根据它发送的读写位元,处于发送模式或者接收模式,从节点则处于对应的相反模式(接收或发送)。
地址和数据首先发送最高有效位 。
起始位元在SCL为高时,由SDA上準位从高变低表示;停止位元在SCL为高时,由SDA上準位从低变高表示。其他SDA上的準位变化在SCL为低时发生。
如果主节点想要向从节点写数据,它将发送一个字节,然后从节点以ACK位元应答,如此重复。此时,主节点处于主节点发送 模式,从节点处于从节点接收 模式。
如果主节点想要读取从节点数据,它将不断接收从节点发送的一个个字节,在收到每个字节后发送ACK进行应答,除了接收到的最后一个字节。此时,主节点处于主节点接收 模式,从节点处于从节点发送 模式。
此后,主节点不是发送停止位元终止传输,就是发送另一个起始位元以发起另一次传输(即“组合消息”)。
修訂
I2 C规范的历次修订
年份
版本
最高速度
注解
PDF
1982
Original
100 kbit/s
当时的I²C系統是一種簡單的內部匯流排系統,當時主要的用途在於控制由飛利浦所生產的晶片。
n/a
1992
1
400 kbit/s
新增了傳輸速率為400 kbit/s的快速模式 及長度為10位元的定址模式,该模式下可容納最多1008個節點。这是最初的標準版本。
n/a
1998
2
3.4 Mbit/s
新增了傳輸速率為3.4Mbit/s的高速模式 ,並減小总线需要的電壓及電流以節省能源。
n/a
2000
2.1
3.4 Mbit/s
仅對2.0版做一些小修正,功能并无变化。
[ 3]
2007
3
3.4 Mbit/s
新增了高速+ 模式,这一模式需要20 mA的电流来驱动。添加设备ID机制。
[ 4]
2012
4
5 Mbit/s
增加5 MHz的超快速模式(UFM),这种模式是单工模式 。使用带有推挽输出 的新型USDA和USCS线,这两条线上不再有上拉电阻 。增加了制造商指定的ID表。
[ 5]
2012
5
5 Mbit/s
修正错误。
[ 6]
2014
6
5 Mbit/s
修正两幅图。这是目前最新的标准。
[ 2]
應用
STMicroelectronics 24C08: Serial EEPROM with I2 C bus[ 7]
A 16-bit ADC board with I2 C interface
I²C被應用在构造簡單且可以牺牲傳輸速度来降低製造成本的週邊上。一些常見的應用如下:
I²C的一個优势在於其接腳数少。通过两个接腳 以及相应的软件,微控制器 就可以控制某一个网络内的设备,而使用其他技术则需要更多的接腳。而且,较少的接腳数可以减小封装尺寸,进而減少重量及電源的消耗,這對於行動電話 及手持式電腦而言格外重要。由于電腦工程師發現到對於整合電路設計而言,許多的製造成本源自於封裝尺寸及接腳數量,因而像I²C這樣的匯流排受到了广泛应用。
週邊可以在系統仍然在運作的同時加入或移出匯流排,這代表對於有熱插拔 需求的裝置而言是個理想的匯流排。
arduino mega上的pin腳
raspberry pi 4 上的pin腳
可參考arduino mega 轉 raspberry pi 4 i2c 3v轉5v的轉換電路
操作系統的支援
在Linux 中,I²C已經列入了核心模組的支援了,更進一步的說明可以參考核心相關的文件及位於/usr/include/linux/i2c.h 的這個標頭檔 。OpenBSD 則在最近的更新中加入了I²C的架構(framework)以支援一些常見的主控端控制器及感應器。
工具开发
I²C主机适配器
I²C协议分析仪
逻辑分析仪
限制
i2c在容易線長導致訊號品質不佳,速度越快能用的距離越短(一般約在10公分上下),上拉電阻用小一點可能有幫助
i2c阻抗50,usb阻抗100在做訊號轉換時阻抗不匹配會造成訊號極差
衍生技术
參見
參考資料
註釋
^ 應該為27 =128個,但是其中16個指令具有特殊定義,所以剩下112。
^ 400 kbit / s的快速模式,1 Mbit / s的快速模式加上或FM +和3.4 Mbit / s的高速模式
外部連結
一般 标准 存储 外围 音訊 可移动 嵌入式
注:接口依大致速度增序排列,每节最后列出的接口应该是最快的