I2C

γ
贡献者: 纺织工
受宠的 最喜欢的 81

介绍

在本教程中,你会学到关于I的一亚博在线娱乐官网切2C通信协议,你为什么要用它,以及如何实现。

I2C系统的框图

集成电路(I)2C)协议是旨在允许多个”奴隶数字集成电路薯条与一个或多个通信“大师”炸薯条。与串行外围接口(SPI)类似,它只用于单个设备内的短距离通信。类似于异步串行接口(如RS-232或UART),它只需要两条信号线来交换信息。

建议阅读

在阅读本教程之前了解一些有用的信息:

串行通信

异步串行通信概念:分组,信号电平,波特率,UART和更多!啊!

串行外围接口(SPI)

SPI通常用于将微控制器连接到诸如传感器的外围设备,移位寄存器,和SD卡。

二元的

二进制是电子学和程序设计的数字系统,所以学习二进制很重要。亚博在线娱乐官网但是,二进制是什么?它如何转化为其他数字系统,如十进制?是吗?

移位寄存器

介绍移位寄存器和潜在的用途。

逻辑层次

亚博在线娱乐官网学习3.3V和5V设备与逻辑级别的区别。

为什么使用I2C?是吗?

为了弄清楚为什么有人想通过I进行交流2C您必须首先将其与其他可用选项进行比较,以了解其差异。

串行UART端口有什么问题?是吗?

异步串行系统的框图。

因为串行端口是异步的(不发送时钟数据)使用它们的设备必须提前就数据速率达成一致。这两个设备还必须具有接近相同速率的时钟,而且会保持这样——两端的时钟速率之间的过大差异将导致数据混乱。

异步串行端口需要硬件开销——两端的UART相对复杂,如果需要的话,很难在软件中精确实现。至少一个开始和停止位是每帧数据的一部分,这意味着每发送8比特的数据需要10比特的传输时间,这会影响数据速率。

异步串行端口的另一个核心故障是它们固有地适合于两个端口之间的通信,只有两个,设备。虽然它是可能的将多个设备连接到单个串行端口,,总线争用(其中两个设备试图同时驱动同一线路)始终是一个问题,必须仔细处理以防止对所述设备的损坏,通常通过外部硬件。

最后,数据速率是一个问题。虽然没有理论的限制异步串行通信,大多数UART设备仅支持某一组固定波特率,亚博国际官网其中最高的通常大约是每秒230400位。

SPI有什么问题?是吗?

SPI系统的框图。

SPI最明显的缺点是需要的引脚数量。用SPI总线将单个主设备连接到单个从设备需要四条线路;每个额外的从机需要一个额外的芯片选择I/O引脚的主机。在许多设备必须从属于一个主设备的情况下,引脚连接的快速增长使得它不受欢迎。也,在紧凑的PCB布局情况下,每个设备的大量连接会使路由信号更加困难。但它确实支持任意数量的从亚博国际官网机(仅取决于连接到总线的设备的驱动能力和可用的芯片选择引脚的数量)。

SPI有利于提高数据速率全双工(同时发送和接收数据)连接,亚博国际官网支持10MHz以上的时钟速率(因此,1,000万比特每秒)对于一些设备,而且速度也相当快。两端的硬件通常是一个非常简单的移位寄存器,允许在软件中轻松实现。

输入我2C-两全其美!啊!

I2C系统的框图

2只需要两根电线,像异步串行,但是这两条线可以支持多达1008个从设备。亚博国际官网也,不像SPI,我2C可以支持多亚博国际官网主系统,允许不止一个主设备与总线上的所有设备通信(尽管主设备不能通过总线相互通信,并且必须轮流使用总线线)。

数据速率介于异步串行和SPI之间;我最2C设备可以以100kHz或400kHz进行通信。我有一些开销2C;对于要发送的每8位数据,一个额外的元数据位(ACK/NACK”钻头,我们将在后面讨论)必须被传送。

实现I所需的硬件2C比SPI更复杂,但少于异步串行。它可以在软件中相当容易地实现。

2C-简史

2C最初是由飞利浦于1982年为各种飞利浦芯片开发的。最初的规范只允许100kHz的通信,并且仅提供7位地址,将总线上的设备数量限制为112(有多个保留地址,永远不能用于有效的I2C地址)。1992,第一份公开说明书已经出版,添加400kHz的快速模式以及扩展的10位地址空间。大部分时间(例如,在许多Arduino兼容电路板上的ATMega328设备中,I.的设备支持亚博国际官网2C在此结束。指定了另外三种模式:快速模式加,在1MHz;高速模式,在3.4MHz;以及超快模式,在5MHz。

除了“香草我2C英特尔在1995年引入了一个变体系统管理总线(SMBus)。SMBus是一种更严格控制的格式,旨在最大化PC主板上支持IC之间的通信的可预测性。亚博国际官网SMBus之间最显著的区别是它限制了从10kHz到100kHz的速度,而我2C可以支持从亚博国际官网0kHz到5MHz的设备。SMBus包括使低速操作非法的时钟超时模式,尽管许多SMBus设备无论如何都会支持它以最大化与嵌入式I的互操作亚博国际官网性2C系统。

硬件级的I2C

信号

每一个我2C总线由两个信号组成:SCL和SDA。SCL是时钟信号,SDA是数据信号。时钟信号总是由当前总线主控器产生;一些从设备有时会迫使时钟变低,以延迟主设备发送更多数据(或在主设备试图将其计时之前需要更多时间准备数据)。这叫做“拉钟并且在协议页面上进行描述。

与UART或SPI连接不同,I2公共汽车司机是"开沟排水",意味着它们可以将相应的信号线拉低,但不能把车开得高。因此,当一个设备试图将线路拉高,而另一个设备试图拉低时,就不存在总线争用,消除了驱动器损坏或系统中过度功耗的可能性。每个信号线具有上拉电阻在上面,当没有设备断言信号为低时,将信号恢复为高。

I2C系统的等效内部电路图。

注意两条通信线路上的两个上拉电阻。

电阻器的选择随总线上的设备而变化,但是,一个好的经验法则是从4.7k开始,必要时向下调整。我2C是一个相当健壮的协议,并可用于短线运行(2-3米)。长距离跑,或者具有许多设备的系统,电阻越小越好。

信号电平

由于总线上的设备实际上没有将信号驱动得高,我2C允许在连接具有不同I/O电压的设备时有一定的灵活性。一般来说,在一个装置处于比另一个装置更高的电压的系统中,可以通过I连接两个设备2C之间没有任何电平转换电路。诀窍是将上拉电阻连接到两个电压中的较低电压。这只在某些情况下有效,其中两个系统电压中的较低电压超过较高电压系统的高电平输入电压——例如,5VArduino和3.3V加速度计。

如果两个系统之间的电压差太大(例如,5V和2.5V)亚博官网SparkFun提供简单我2C级移位板.由于该板还包括启用线,它可以用来禁用到选定设备的通信。这在多个具有相同地址的设备要连接到单个主设备的情况下很有用——WiiNunchuck就是一个很好的例子。

协议

通过I进行通信2C比UART或SPI解决方案更复杂。信令必须遵守某种协议,以便总线上的设备将其识别为有效的I2C通信。幸运的是,大多数设备会为您处理所有繁琐的细节,允许您专注于希望交换的数据。

基础

标准7位地址传输消息。

消息被分成两类帧:地址帧,其中,主设备指示正在向其发送消息的从设备,以及一个或多个数据帧,它们是8位数据消息,由主机传递到从机,反之亦然。在SCL变低之后,数据被放置在SDA线上,在SCL线变高之后进行采样。时钟边缘和数据读/写之间的时间由总线上的设备定义,并且随着芯片的不同而不同。

启动条件

启动地址帧,主设备使SCL高而SDA低。这使所有从设备注意到传输即将开始。如果两个主设备希望同时拥有总线的所有权,无论哪个设备将SDA拉低,首先都会赢得比赛,并获得对总线的控制。可以重复启动,在不将总线的控制权放弃给其他主机的情况下启动新的通信序列;我们以后再谈。

地址帧

在任何新的通信序列中,地址帧总是第一个。对于7位地址,地址首先被定时输出最高有效位(MSB),接着是R/W位,指示这是读(1)操作还是写(0)操作。

帧的第9位是NACK/ACK位。这是所有帧(数据或地址)的情况。一旦帧的前8位被发送,接收设备被给予对SDA的控制。如果接收设备在第9时钟脉冲之前没有将SDA线拉低,可以推断,接收设备没有接收数据或不知道如何解析消息。在那种情况下,交易所停止营业,而如何进行则取决于系统的主控者。

数据帧

在发送地址帧之后,可以开始传输数据。主控器将继续以规则的间隔产生时钟脉冲,数据将由主机或从机放置在SDA上,取决于R/W位是否指示读或写操作。数据帧的数量是任意的,并且大多数从设备将自动递增内部寄存器,这意味着随后的读或写将来自行中的下一个寄存器。

停止条件

一旦发送了所有数据帧,主控程序将生成停止条件。停止条件由SDA上的0->1(从低到高)跃迁定义之后SCL上的0->1跃迁,SCL维持高水平。在正常数据写入操作期间,SDA上的值应该当SCL高时改变,避免错误的停止条件。

高级协议主题

10位地址

10位地址帧示例。

在10位寻址系统中,传输从地址需要两个帧。第一帧将包括代码b11110xyz,其中“x”是从地址的MSB,y是从地址的第8位,z是如上所述的读/写位。第一帧的ACK位将由匹配地址前两位的所有从机断言。和普通的7位传输一样,另一个转移立即开始,这个传输包含地址的7:0位。在这一点上,被寻址的从机应该用ACK位进行响应。如果没有,故障模式与7位系统相同。

注意,10位地址设备可以与7位地址设备共存,因为地址的前导“11110”部分不是任何有效7位地址的一部分。

重复启动条件

重复的开始状态。

有时,重要的是允许主设备一次交换多个消息,不允许总线上的其他主设备干扰。由于这个原因,定义了重复启动条件。

重复开始,允许SDA升高而SCL降低,允许SCL变高,然后当SCL较高时,SDA再次降低。因为公共汽车上没有停车条件,以前的通信没有真正完成,当前的主控维护总线的控制。

在这一点上,下一条消息可以开始传输。这个新消息的语法与任何其他消息相同——地址帧后跟数据帧。允许多次重复启动,并且主控器将保持对总线的控制,直到它发出停止条件。

时钟拉伸

从机使用时钟扩展来延迟下一个数据帧。

有时,主数据速率将超过从数据提供该数据的能力。这可能是因为数据还没有准备好(例如,从机尚未完成模数转换,或者因为之前的操作尚未完成(例如,一个EEPROM,它尚未完成对非易失性存储器的写入,并且需要在它能够服务其他请求之前完成写入)。

在这种情况下,一些从设备将执行所谓的拉钟.名义上,,全部的时钟由主设备驱动——从设备简单地将数据放在总线上,或者根据主时钟脉冲从总线上取出数据。在数据传输过程的任何点,在主机释放SCL线之后,寻址从机可以将SCL线保持在低位。要求主控端在从控端释放SCL线之前不要进行额外的时钟脉冲或数据传输。

资源与进一步发展

2C是一个相对复杂的接口,还有很多资源可以帮助你解决这个问题。下面是一些更有益的信息。

  • 维基百科关于I的文章2C-不太好,但不是一个糟糕的起点。
  • 标准文档-几年前,菲利普斯半导体公司成为NXP公司;这是我的官方标准文档2C.
  • 2C引物-关于I的官方介绍2C及相关技术。
  • Linux工具2C-一套很好的工具,可以和我一起工作2C以及嵌入式Linux环境中的相关总线,比如pcDuino或覆盆子皮。

使用I2C长距离飞行,检查专用PCA9615差分I2C总线扩展器。

Qwiic差分I2C总线扩展器(PCA9615)挂机指南

5月31日,二千零一十八

亚博在线娱乐官网了解如何用Qwiic差分I2C总线扩展器(PCA9615)突破板扩展I2C通信总线的范围。

或者看看我们的SPI和I2C教程,附带一个覆盆子Pi。

覆盆子皮SPI与I2C教程

10月29日,二千零一十五

亚博在线娱乐官网了解如何使用串行I2C和SPI总线在您的树莓PI使用WiRIPPI I/O库的C/C++和PyDef/SMBus的Python。

你的下一个项目需要一些灵感吗?亚博官网看一些相关的教程:

Qwiic人类存在传感器(AK9753)挂机指南

如何开始使用启用了Qwiic的AK9753人类存在传感器。
新!啊!

亚博官网SparkFun Pro nRF52840迷你挂车指南

SparkFun Pro nRF52840 Mini的硬件概述和连接指南——这是北欧不可思亚博官网议的酷蓝牙/ARM Cortex M4 SoC的突破。

亚博官网SparkFun LoRa网关1通道挂机指南

如何在Arduino中设置和使用LoRa网关1-Channel。
新!啊!

Qwiic UV传感器(VEML6075)挂钩指南

亚博在线娱乐官网了解如何连接你的VEML6075紫外线传感器,并计算出你何时应该涂一些防晒霜。

寻找更多的灵感?看看这些博客上的一些想法吧: