0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

物联网嵌入式软件中的I2C总线设计详解

jf_94171069 来源:jf_94171069 作者:jf_94171069 2024-09-29 16:21 次阅读

I2C(Inter-Integrated Circuit)通信总线,作为嵌入式系统设计中的一个关键组成部分,其灵活性和高效率使其在高级应用中备受青睐。本文旨在提供关于I2C通信总线的深度解析,包括其基本概念、特点、通信协议,以及在不同场景下的高级应用和最佳实践。I2C接口只有2根信号线,总线上可以连接多个设备,硬件实现简单,可扩展性强。I2C通信协议可以用普通GPIO引脚进行软件模拟。I2C接口主要用于通讯速率要求不高,以及多个器件之间通信的应用场景。

01

I2C总线历史

I2C(Inter-Integrated Circuit)总线是一种重要的串行通信协议,它的历史可以追溯到上世纪80年代初期。以下是对I2C总线历史的详细介绍:

起源:

I2C总线技术由荷兰的飞利浦半导体(现在的恩智浦半导体)在1982年开发。最初,这项技术是为了在电视机内部实现简单、高效、低成本的通信而设计的。

设计目标:

设计I2C的初衷是减少电视机等复杂电子系统内部的布线数量,同时也降低制造成本。通过使用只有两根线的通信总线,它有效地减少了器件间连接的复杂性。

技术发展:

随着技术的成熟和普及,I2C协议得到了广泛的应用和扩展。从最初的标准模式(100kHz),发展到快速模式(400kHz)和高速模式(3.4MHz)。

标准化和开放:

虽然最初由飞利浦半导体开发,但I2C协议后来被标准化并广泛应用于多种设备中。飞利浦半导体放弃了对这项技术的专利权,使其成为开放标准。

广泛应用:

I2C技术由于其简单性和有效性,已成为嵌入式系统设计中不可或缺的一部分。

wKgaomb5DeCAG8XQAAufMwzzlhc100.jpg

02

I2C通信总线基本概念

I2C是一种多主机、两线制、低速串行通信总线,广泛用于微控制器和各种外围设备之间的通信。它使用两条线路:串行数据线(SDA)和串行时钟线(SCL)进行双向传输。

特点

两线制总线:I2C仅使用两条线——串行数据线(SDA)和串行时钟线(SCL)进行通信,有效降低了连接复杂性。

多主多从设备支持:I2C支持多个主设备和多个从设备连接到同一总线上。每个设备都有唯一的地址。

可变的时钟速率:I2C总线支持不同的速率模式,如标准模式(100kbps)、快速模式(400kbps)和高速模式(3.4Mbps)。

同步通信:I2C是一种同步通信协议,数据传输由时钟信号(SCL)来控制。

简单的连接:I2C通信对硬件的要求比较低,很容易在微控制器和外围设备间实现连接。

地址分配:每个I2C设备都通过一个7位或10位的地址来识别,这使得总线上可以连接多个设备。

阻塞传输:I2C支持阻塞传输机制,即主设备可以在传输过程中控制总线,防止其他设备发送数据。

应用广泛:由于其简单和灵活性,I2C被广泛应用于各种电子产品中,如传感器、LCD显示器、EEPROM等。

总线仲裁和冲突检测:在多主模式下,I2C能够处理多个主设备同时尝试控制总线的情况。

低功耗:I2C总线的设计使其成为低功耗的通信方式,适用于电池供电的设备。

基本特征

总线结构:

两线制:使用两条线进行通信,分别是串行数据线(SDA)和串行时钟线(SCL)。

多主多从结构:支持多个主设备和多个从设备连接到同一总线上。

通信方式:

同步串行:数据传输同步于时钟信号。

字节格式:每个字节由8位数据构成,加上开始和停止条件以及可选的应答位。

时钟速率:

支持多种速率,包括标准模式(100kbps)、快速模式(400kbps)和高速模式(3.4Mbps)。

工作原理

总线控制:

开始和停止条件:通信由主设备通过在SDA线上生成特定的信号模式来开始和结束。

地址帧:每次通信开始时,主设备发送一个地址帧来指定与之通信的从设备。

数据传输:

主从通信:主设备控制时钟信号,向从设备发送或接收数据。

应答位:每个字节后,接收方

发送一个应答位(ACK)或非应答位(NACK),以告知发送方数据是否被成功接收。

地址和仲裁

设备地址:

7位或10位地址:每个I2C设备都有一个唯一的地址,允许在同一总线上连接多个设备。

总线仲裁:

在多主模式下,当两个主设备同时尝试控制总线时,I2C协议包含仲裁机制以决定哪个设备获得控制权。

03

I2C数据传输流程

数据信号以8位的序列传输。所以在特殊的开始条件发生后,就会出现第一个8位序列,它指示了数据被发送到哪个从设备的地址。每个8位序列之后都会跟随一个称为确认的位。

wKgZomb5DeGAKvC7AATZnh_IHnA866.jpg

在大多数情况下,第一个确认位之后会跟着另一个寻址序列,但这次是针对从设备的内部寄存器。在寻址序列之后是数据序列,直到数据完全传输完毕,并以一个特殊的停止条件结束。

开始条件发生在数据线在时钟线仍然高电平的时候变低。之后,时钟开始,并且在每个时钟脉冲期间传输每一位数据。设备寻址序列从最重要的位开始,以最不重要的位结束,实际上是由7位组成的,因为第8位用于指示主设备是向从设备写入(逻辑低)还是从中读取(逻辑高)。

下一个确认位由从设备用来指示它是否成功接收了前一个位序列。所以这次主设备将SDA线的控制权交给从设备,如果从设备成功接收了前一个序列,它将把SDA线拉低到所谓的确认状态。

如果从设备没有把SDA线拉低,这种状态被称为不确认,意味着它没有成功接收前一个序列,这可能由多种原因造成。例如,从设备可能正忙,可能不理解接收到的数据,或者不能再接收任何数据等等。 在这种情况下,主设备决定如何继续操作。

wKgaomb5DeKAcLnrAAcK3UXOOB0479.jpg

接下来是内部寄存器的寻址。内部寄存器是从设备内存中包含各种信息或数据的位置。

wKgZomb5DeOAWjovAAemV71nqtc234.jpg

例如,ADXL345加速度计有一个独特的设备地址和额外的内部寄存器地址,用于X、Y和Z轴。 因此,如果我们首先想读取x轴的数据,我们需要发送设备地址,然后发送x轴的特定内部寄存器地址。这些地址可以从传感器的数据手册中找到。

wKgaomb5DeSAKO5wAAsERgtaV9E820.jpg

在寻址之后,数据传输序列开始,要么来自主设备,要么来自从设备,这取决于在读/写位选择的模式。

wKgZomb5DeWACSQZAAhMuoshZGU419.jpg

在数据完全发送之后,传输将以停止条件结束,当SDA线在SCL线高电平时从低变高。这就是I2C通信协议的工作原理。

wKgaomb5DeaAGAbOAAh5nlVnJnw388.jpg

上述内容出现了很多特定概念,我们下面来分别解释他们:

SDA和SCL信号

SDA和SCL都是双向线路,通过电流源或上拉电阻连接到正电源电压(见图3)。 当总线空闲时,两条线路都是HIGH。连接到总线的设备的输出级必须具有开漏极或开集电极来执行有线与功能。I2C总线上的数据可以在标准模式下以高达100 kbit/s的速度传输,在快速模式下可达400 kbit/s,在快速模式+中可达1 Mbit/s,或在高速模式下可达3.4 Mbit/s。总线电容限制了连接到总线的接口数量。

对于单个主应用程序,如果总线上没有设备会拉伸时钟,主SCL输出可以是推挽驱动器设计。

wKgZomb5DeeAP0UvAACJAob7qN8096.jpg

wKgaomb5DeeAbG58AAIxQd9ADZY084.jpg

数据有效性

SDA线上的数据必须在时钟HIGH期间保持稳定。只有当SCL线上的时钟信号为LOW时,数据线的HIGH或LOW状态才能改变(见图4)。传输的每个数据位都会产生一个时钟脉冲。

wKgZomb5DeuADFMGAAA2iypPYDU885.jpg

START和STOP条件

所有事务都以START(S)开始,并由STOP§终止(参见图5)。 SDA线上SCL为HIGH时,HIGH到LOW的转换定义了一个START条件。 SDA线上SCL为HIGH时,LOW到HIGH的转换定义了一个STOP条件。

wKgaomb5DeyAMNSoAAA-AtuxEKk285.jpg

START和STOP条件总是由主设备产生。在START条件之后,总线被认为是忙碌的。在STOP条件之后的某个时间,总线被认为是空闲的。

如果产生了重复的START(Sr)而不是STOP条件,总线保持忙碌。在这方面,START(S)和重复的START(Sr)条件在功能上是相同的。

因此,对于本文档的其余部分,S符号被用作代表START和重复的START条件的通用术语,除非Sr是特别相关的。

如果连接到总线的设备合并了必要的接口硬件,则检测START和STOP条件是容易的。然而,没有这种接口的微控制器必须在每个时钟周期内对SDA线采样至少两次,以感知转换。

字节格式

每一个放在SDA线上的字节必须是8位长。每次传输可以传输的字节数是没有限制的。每一个字节后面必须跟一个确认位。数据以最有效位(MSB)为首进行传输(见图6)。如果一个从机在执行其他一些功能之前不能接收或传输另一个完整的字节数据,例如处理一个内部中断,它可以保持时钟线SCL LOW,迫使主机进入等待状态。当从机准备好接收另一个字节数据并释放时钟线SCL时,数据传输继续进行。

wKgaomb5De6ARO-pAAEP6dzmnmM606.jpg

Acknowledge(ACK)和Not Acknowledge(NACK)

确认发生在每个字节之后。确认位允许接收端向发送端发出信号,表示字节被成功接收,可以发送另一个字节。主设备产生所有的时钟脉冲,包括确认的第九个时钟脉冲。

确认信号定义如下:发送端在确认时钟脉冲期间释放SDA线,这样接收端就可以拉SDA线LOW,并且在该时钟脉冲的HIGH期间保持稳定的LOW(参见图4)。设

当SDA在第九个时钟脉冲期间保持HIGH时,这被定义为不确认信号。主设备然后可以产生一个STOP条件来中止传输,或者重复的START条件来启动一个新的传输。有五个条件导致NACK的产生:

没有接收器在总线上传输地址,所以没有设备响应确认。

接收器无法接收或发送,因为它正在执行一些实时功能,并且还没有准备好与主服务器进行通信。

在传输过程中,接收方收到了它无法理解的数据或命令。

在传输过程中,接收方不能接收到任何更多的数据字节。

主接收机必须向从发送机发出传输结束的信号。

时钟同步

两个主控器可以同时在一个空闲总线上开始传输,必须有一种方法来决定哪个主控器控制总线并完成传输。这是通过时钟同步和仲裁来实现的。在单主控器系统中,时钟同步和仲裁是不需要的。

时钟同步是通过I2C接口到SCL线的有线与连接来实现的。这意味着SCL线上的HIGH到LOW转换会导致相关的主控器开始计数他们的LOW周期,一旦主控器时钟变为LOW,它会保持SCL线处于该状态,直到时钟达到HIGH状态(见图7)。然而,如果另一个时钟仍然在它的LOW周期内,这个时钟的LOW到HIGH转换可能不会改变SCL线的状态。因此,SCL线被具有最长LOW周期的主控器保持为LOW。具有较短LOW周期的主控器在这段时间内进入HIGH等待状态。

wKgZomb5De-AAPnuAACd2ldX9HE503.jpg

当所有主控机都结束了低周期时,SCL线释放并变为高电平。此时主控机时钟与SCL线的状态没有区别,所有主控机开始计算它们的高周期。第一个完成高周期的主控机再次拉低SCL线。

这样,一个同步SCL时钟就产生了,它的低周期由低周期最长的主控机决定,而它的高周期由高周期最短的主控机决定。

仲裁

仲裁,像同步一样,是指只有在系统中使用多个主设备时才需要的协议部分。从设备不参与仲裁过程。只有总线空闲时,主设备才可以开始传输。两个主设备可以在最小保持时间(tHD; STA)内产生一个START条件,这会导致总线上产生一个有效的START条件。然后需要仲裁来决定哪个主设备将完成它的传输。

仲裁逐位进行。在每个位期间,当SCL为HIGH时,每个主设备检查SDA电平是否与它所发送的相匹配。这个过程可能需要许多位。两个主设备实际上可以无误地完成整个事务,只要传输是相同的。第一次一个主设备试图发送HIGH,但检测到SDA电平为LOW,主设备知道它已经失去了仲裁并关闭SDA输出驱动器。另一个主设备继续完成它的事务。

在仲裁过程中没有信息丢失。一个失去仲裁的主设备可以产生时钟脉冲,直到它失去仲裁的字节结束,并继续产生时钟脉冲。必须在总线空闲时重新开始它的事务。

如果一个主设备也包含一个从设备功能,并且它在寻址阶段失去仲裁,有可能是获胜的主设备试图寻址它。因此,失败的主设备必须立即切换到它的从设备模式。

图8显示了两个主设备的仲裁过程。可能涉及更多内容,这取决于总线连接了多少主设备。当产生DATA1的主设备的内部数据电平与SDA线上的实际电平之间存在差异时,DATA1输出被关闭。这不影响由获胜的主设备发起的数据传输。

wKgaomb5DfCAfGKGAACloyCGyK0330.jpg

由于I2C总线的控制完全由竞争主设备发送的地址和数据决定,所以没有中心主设备,总线上也没有任何优先顺序。

如果仲裁程序仍在进行,当一个主设备发送重复的START或STOP条件,而另一个主设备仍在发送数据时,则存在一个未定义的条件。换句话说,以下组合会导致一个未定义的条件:

主设备1发送重复的START条件,主设备2发送一个数据位。

主设备1发送STOP条件,主设备2发送一个数据位。

主设备1发送重复的START条件,主设备2发送一个STOP条件。

时钟拉伸

时钟拉伸通过保持SCL线LOW暂停事务。事务无法继续,直到该线再次释放为HIGH。时钟拉伸是可选的,事实上,大多数从设备不包括SCL驱动程序,因此它们无法拉伸时钟。

在字节级,设备可能能够以较快的速度接收字节数据,但需要更多的时间来存储接收到的字节或准备传输另一个字节。从设备可以在接收和确认一个字节后保持SCL线LOW,以迫使主设备进入等待状态,直到从设备准备好在一种握手过程类型中进行下一个字节传输(见图7)。

在位级,设备如微控制器,具有或不具有I2C总线有限的硬件,可以通过延长每个时钟LOW周期来减慢总线时钟。任何主设备的速度都适应于该设备的内部运行速率。

从地址和R/W位

数据传输遵循图9所示的格式。在START条件(S)之后,发送一个从地址。这个地址是7位长,后面跟着第八位,这是一个数据方向位(R/W)——“0”表示传输(WRITE),“1”表示数据请求(READ)(参见图10)。数据传输总是由master生成的STOP条件§终止。然而,如果master仍然希望在总线上通信,它可以生成一个重复的START条件(Sr)并在没有首先生成STOP条件的情况下寻址另一个从设备。在这样的传输中,各种读/写格式的组合是可能的。

wKgZomb5DfCAeXIPAAC1ak5pDCE120.jpg

wKgaomb5DfGATYHXAABDmXWHKTE671.jpg

10位寻址

10位寻址扩展了可能的地址数。具有7位和10位地址的设备可以连接到同一个I2C总线,并且7位和10位寻址都可以在所有总线速度模式下使用。目前,10位寻址还没有被广泛使用。 10位从属地址是由一个START条件(S)或重复的START条件(Sr)之后的前两个字节组成的。 第一个字节的前7位是组合1111 0XX,其中最后两个位(XX)是10位地址的两个最有效位(MSB);第一个字节的第八位是R/W位,它决定了消息的方向。 虽然有8个可能的保留地址位1111 XXX的组合, 但只有四个组合1111 0XX用于10位寻址。其余四个组合1111 1XX被保留用于未来的I2C总线增强。

所有先前描述的7位寻址的读/写格式组合都可能用10位寻址。这里详细介绍两种格式:

主发送器用一个10位从属地址向从属接收器发送。 传输方向不变(见图14)。当一个10位地址跟随一个START条件时,每个从属比较从属地址第一个字节的前7位(1111 0XX)与自己的地址,并测试第八位(R/W方向位)是否为0。可能有多个设备找到一个匹配并产生一个确认(A1)。所有找到匹配的从属比较从属地址第二个字节的八位(XXXX XXXX)与自己的地址,但只有一个从属找到一个匹配并产生一个确认(A2)。匹配的从属仍然由主寻址,直到它接收到一个STOP条件§或重复的START条件(Sr),后面跟着一个不同的从属地址。

主接收器用一个10位从属地址读取从属发送器。 传输方向在第二个R/W位之后改变(图15)。直到并包括确认位A2,过程与前面描述的用于一个从属发送器的程序相同。主发送器寻址从接收器。在重复的START条件(Sr)之后,匹配的从设备记住它之前被寻址过。这个从设备然后检查Sr之后的从地址的第一个字节的前7位是否与它们在START条件(S)之后是相同的,并测试第八位(R/W)是否为1。 如果有匹配,从设备认为它被作为一个发送器寻址,并产生确认A3。从发送器保持寻址状态,直到它接收到一个STOP条件§或接收到另一个重复的START条件(Sr)后跟随一个不同的从地址。在重复的START条件(Sr)之后,所有其他从设备也将比较从地址(1111 0XX)的第一个字节的前7位与它们自己的地址,并测试第八位(R/W)。 然而,它们中没有一个被寻址,因为R/W=1(10位设备),或者1111 0XX从地址(7位设备)不匹配。

wKgZomb5DfOARmRfAAD3pHVlVTA061.jpg

具有10位寻址的从设备对“通用调用”的反应与具有7位寻址的从设备相同。硬件主设备可以在“通用调用”后传输其10位地址。在这种情况下,“通用调用”地址字节后面跟着两个连续的字节,其中包含主发送器的10位地址。格式如图15所示,第一个数据字节包含主地址的最低有效位8位。

开始字节0000 0001 (01h)可以以与7位地址相同的方式出现在10位地址之前。

通用调用地址

通用调用地址用于同时寻址连接到I2C总线的每个设备。然而,如果一个设备不需要通用调用结构中提供的任何数据,它可以通过不发出确认来忽略这个地址。如果一个设备确实需要来自通用调用地址的数据,它会确认这个地址并表现为从接收器。如果一个或多个设备响应,主设备实际上不知道有多少设备确认。第二个字节和后续字节被每一个能够处理此数据的从接收器确认。一个不能处理这些字节之一的从设备必须通过不确认来忽略它。同样,如果一个或多个从设备确认,主设备将不会看到不确认。通用调用地址的含义总是在第二个字节中指定(见图16)。

wKgaomb5DfSARqXUAABWNtm-mcI577.jpg

有两种情况需要考虑:

当最低有效位B为“0”时。

当最低有效位B为“1”时。

当位B为“0”时,第二个字节有以下定义:

0000 0110 (06h):硬件复位并写入从地址的可编程部分。在接收到这个2字节序列时,所有设计用于响应通用调用地址的设备都复位并接收其地址的可编程部分。

必须采取预防措施,以确保设备在施加电源电压后没有拉下SDA或SCL线,因为这些低电平会阻塞总线。

0000 0100 (04h):硬件写入从地址的可编程部分。 行为与上述相同,但设备不复位。

0000 0000 (00h):此代码不允许用作第二个字节。

编程过程的序列在适当的设备数据表中公布。其余代码尚未固定,设备必须忽略它们。

当位B为“1”时,2字节序列是“硬件通用调用”。这意味着该序列由硬件主设备传输,例如键盘扫描器,

它可以被编程来传输所需的从地址。由于硬件主设备事先并不知道消息必须被传输到哪个设备,它只能生成这个硬件通用调用和它自己的地址 — 向系统标识它自己(参见图 17)。

wKgZomb5DfaAUFOlAABom7aLvKk084.jpg

第二个字节中剩下的七位包含硬件主机的地址。

这个地址被连接到总线的智能设备(例如,微控制器)识别,然后接受来自硬件主机的信息。如果硬件主机也可以充当从机,从机地址与主机地址相同。

在某些系统中,另一种方法是将硬件主发射机在系统复位后设置为从接收机模式。这样,系统配置主可以告诉硬件主发射机(现在处于从接收机模式)必须发送数据到哪个地址(见图18)。在编程程序之后,硬件主保持在主发射机模式。

wKgaomb5DfeAPmwYAADlmgrjH84635.jpg

开始字节

微控制器可以以两种方式连接到I2C总线。带有片上硬件I2C总线接口的微控制器可以被编程为只被总线请求中断。当设备没有这样的接口时,它必须通过软件不断地监视总线。显然,微控制器监视或轮询总线的次数越多,它执行预定功能的时间就越少。

因此,在快速的硬件设备和相对较慢的依赖于软件轮询的微控制器之间存在速度差异。

在这种情况下,数据传输可以先由一个比正常情况长得多的启动过程(见图19)。启动过程包括:

一个开始条件(S)

一个开始字节(0000 0001)

一个确认时钟脉冲(ACK)

一个重复的开始条件(Sr)

wKgZomb5DfiAIDDaAACBoooUrX0686.jpg

在需要总线访问的主机传输了START条件S之后,

传输START字节(0000 0001)。另一个微控制器因此可以以低采样率对SDA线进行采样,直到检测到START字节中的7个零之一。在检测到SDA线上的LOW电平后,微控制器可以切换到更高的采样率,以找到重复的START条件Sr,然后用于同步。

硬件接收器在接收到重复的START条件Sr后重置,因此忽略START字节。

在START字节后生成一个与确认相关的时钟脉冲。这只是为了符合总线上使用的字节处理格式。不允许任何设备确认START字节。

设备ID

设备ID字段(见图20)是一个可选的3字节只读(24位)字,提供以下信息:

12位制造商名称,每个制造商(例如NXP)都是唯一的

9位部件标识,由制造商指定(例如PCA9698)

3位模具修订,由制造商指定(例如RevX)

wKgaomb5DfmADHUOAABHcrgQkWk261.jpg

设备ID是只读的,硬连接在设备中,可以按如下方式访问:

START 条件

主控器发送保留设备ID I2C总线地址,后面跟着设置为‘0’的R/W位(写入):“1111 1000”。

主设备发送它必须识别的从设备的I2C总线从地址。LSB是一个“不关心”的值。只有一个设备必须确认这个字节(具有I2C总线从地址的设备)。

主设备发送一个Re-START条件。

备注:一个STOP条件跟随一个START条件重置从设备的状态机,设备ID读取无法执行。同样,一个STOP条件或一个Re-START条件跟随访问另一个从设备重置从设备的状态机,设备ID读取无法执行。

主控器发送保留设备ID I2C总线地址,后面跟着设置为‘1’的R/W位:‘1111 1001’。

设备ID读取可以完成,从12个制造商位(第一个字节+第二个字节的四个MSB)开始,接下来是9个部件识别位(第二个字节的四个LSB+第三个字节的五个MSB),然后是三个模具修正位(第三个字节的三个LSB)。

主设备通过ACK最后一个字节结束读取序列,从而重置从设备的状态机并允许主设备发送STOP条件。

备注:设备ID的读取可以通过发送一个ACK在任何时候停止。

如果主设备继续ACK第三个字节后的字节,从设备回滚到第一个字节并继续发送设备ID序列,直到检测到一个ACK。

wKgZomb5DfqAOHHuAAHlq_h-eyI381.jpg

04

I2C传输数据的格式

4.1 写操作

流程如下:

芯片要发出一个start信号

然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)

从设备回应(用来确定这个设备是否存在),然后就可以传输数据

主设备发送一个字节数据给从设备,并等待回应

每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。

数据发送完之后,主芯片就会发送一个停止信号。

下图:白色背景表示"主→从",灰色背景表示"从→主"

wKgaomb5DfuAcLjXAAA3IJI5Bww766.jpg

4.2 读操作

流程如下:

主芯片要发出一个start信号

然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)

从设备回应(用来确定这个设备是否存在),然后就可以传输数据

从设备发送一个字节数据给主设备,并等待回应

每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。

数据发送完之后,主芯片就会发送一个停止信号。

下图:白色背景表示"主→从",灰色背景表示"从→主"

wKgaomb5DfyATCT-AABEW-nYQ-w667.jpg

4.3 I2C信号

I2C协议中数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。

开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。

结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA

SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化

I2C协议信号如下:

wKgZomb5Df2AcpzLAAHpqefVT5Y635.jpg

4.4 协议细节

如何在SDA上实现双向传输?

主芯片通过一根SDA线既可以把数据发给从设备,也可以从SDA上读取数据,连接SDA线的引脚里面必然有两个引脚(发送引脚/接受引脚)。

主、从设备都可以通过SDA发送数据,肯定不能同时发送数据,怎么错开时间?

在9个时钟里,

前8个时钟由主设备发送数据的话,第9个时钟就由从设备发送数据;

前8个时钟由从设备发送数据的话,第9个时钟就由主设备发送数据。

双方设备中,某个设备发送数据时,另一方怎样才能不影响SDA上的数据?

设备的SDA中有一个三极管,使用开极/开漏电路(三极管是开极,CMOS管是开漏,作用一样),如下图:

wKgaomb5Df2AIfNOAAA960yPjII606.jpg

真值表如下:

wKgZomb5Df-AMV79AAAirsZ-6QI111.jpg

从真值表和电路图我们可以知道:

当某一个芯片不想影响SDA线时,那就不驱动这个三极管

想让SDA输出高电平,双方都不驱动三极管(SDA通过上拉电阻变为高电平)

想让SDA输出低电平,就驱动三极管

4.5 示例:主设备发送(8bit)给从设备

从下面的例子可以看看数据是怎么传的(实现双向传输)。

举例:主设备发送(8bit)给从设备

前8个clk

从设备不要影响SDA,从设备不驱动三极管

主设备决定数据,主设备要发送1时不驱动三极管,要发送0时驱动三极管

第9个clk,由从设备决定数据

主设备不驱动三极管

从设备决定数据,要发出回应信号的话,就驱动三极管让SDA变为0

从这里也可以知道ACK信号是低电平

从上面的例子,就可以知道怎样在一条线上实现双向传输,这就是SDA上要使用上拉电阻的原因。

4.6 为何SCL也要使用上拉电阻?

在第9个时钟之后,如果有某一方需要更多的时间来处理数据,它可以一直驱动三极管把SCL拉低。

当SCL为低电平时候,大家都不应该使用IIC总线,只有当SCL从低电平变为高电平的时候,IIC总线才能被使用。

当它就绪后,就可以不再驱动三极管,这是上拉电阻把SCL变为高电平,其他设备就可以继续使用I2C总线了。

对于IIC协议它只能规定怎么传输数据,数据是什么含义由从设备决定。

05

I2C通信的高级应用

在嵌入式系统设计中,I2C应用广泛,如:

5.1 传感器网络

在多传感器系统中,I2C用于读取各种环境参数,如温度、湿度、光照强度等。这些数据可以被用于自动化控制系统或数据监测。

5.2 多设备控制

在复杂的嵌入式系统中,如机器人无人机,I2C用于控制和监测多个执行器和传感器,实现精确的运动控制和环境反馈。

5.3 嵌入式通信网络

I2C也常用于建立微控制器和各种外围设备(如显示屏、存储设备等)之间的通信网络。

本文章源自奇迹物联开源的物联网应用知识库Cellular IoT Wiki,更多技术干货欢迎关注收藏Wiki:Cellular IoT Wiki 知识库(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf)

欢迎同学们走进AmazIOT知识库的世界!

这里是为物联网人构建的技术应用百科,以便帮助你更快更简单的开发物联网产品

Cellular IoT Wiki初心:

在我们长期投身于蜂窝物联网 ODM/OEM 解决方案的实践过程中,一直被物联网技术碎片化与产业资源碎片化的问题所困扰。从产品定义、芯片选型,到软硬件研发和测试,物联网技术的碎片化以及产业资源的碎片化,始终对团队的产品开发交付质量和效率形成制约。为了减少因物联网碎片化而带来的重复开发工作,我们着手对物联网开发中高频应用的技术知识进行沉淀管理,并基于 Bloom OS 搭建了不同平台的 RTOS 应用生态。后来我们发现,很多物联网产品开发团队都面临着相似的困扰,于是,我们决定向全体物联网行业开发者开放奇迹物联内部沉淀的应用技术知识库 Wiki,期望能为更多物联网产品开发者减轻一些重复造轮子的负担。

Cellular IoT Wiki沉淀的技术内容方向如下:

wKgaombqoM2AYL2RAAQrZ8e-uz8392.jpg

奇迹物联的业务服务范围:基于自研的NB-IoT、Cat1、Cat4等物联网模组,为客户物联网ODM/OEM解决方案服务。我们的研发技术中心在石家庄,PCBA生产基地分布在深圳、石家庄、北京三个工厂,满足不同区域&不同量产规模&不同产品开发阶段的生产制造任务。跟传统PCBA工厂最大的区别是我们只服务物联网行业客户。

连接我们,和10000+物联网开发者一起降低技术和成本门槛

让蜂窝物联网应用更简单~~

哈哈你终于滑到最重要的模块了,

千万不!要!划!走!忍住冲动!~

欢迎加入飞书“开源技术交流群”,随时找到我们哦~

点击链接如何加入奇迹物联技术话题群(https://rckrv97mzx.feishu.cn/docx/Xskpd1cFQo7hu9x5EuicbsjTnTf)可以获取加入技术话题群攻略

Hey 物联网从业者,

你是否有了解过奇迹物联的官方公众号“eSIM物联工场”呢?

这里是奇迹物联的物联网应用技术开源wiki主阵地,欢迎关注公众号,不迷路~

及时获得最新物联网应用技术沉淀发布

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 物联网
    +关注

    关注

    2909

    文章

    44534

    浏览量

    372684
  • 总线
    +关注

    关注

    10

    文章

    2877

    浏览量

    88049
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1484

    浏览量

    123600
  • 通信总线
    +关注

    关注

    0

    文章

    44

    浏览量

    9853
收藏 人收藏

    评论

    相关推荐

    为什么嵌入式调试经常用UART,却很少用SPI、I2C或USRT?

    嵌入式调试中经常使用 UART(通用异步收发传输器)而较少使用 SPI(串行外设接口)、I2C(集成电路总线)或 USRT(通用同步 / 异步收发传输器)主要有以下原因
    的头像 发表于 12-18 09:58 115次阅读
    为什么<b class='flag-5'>嵌入式</b>调试经常用UART,却很少用SPI、<b class='flag-5'>I2C</b>或USRT?

    详解I2C总线与SPI总线的区别

    I2C(Inter-Integrated Circuit)表示集成电路互连,是一种用于线路板内部芯片之间通信的总线
    的头像 发表于 10-16 15:16 3738次阅读
    <b class='flag-5'>详解</b><b class='flag-5'>I2C</b><b class='flag-5'>总线</b>与SPI<b class='flag-5'>总线</b>的区别

    了解I2C总线

    电子发烧友网站提供《了解I2C总线.pdf》资料免费下载
    发表于 10-08 11:13 2次下载
    了解<b class='flag-5'>I2C</b><b class='flag-5'>总线</b>

    I2C总线上拉电阻计算

    电子发烧友网站提供《I2C总线上拉电阻计算.pdf》资料免费下载
    发表于 10-08 09:54 1次下载
    <b class='flag-5'>I2C</b><b class='flag-5'>总线</b>上拉电阻计算

    嵌入式常用总线有哪些

    嵌入式系统中常用的总线种类繁多,它们各自具有不同的特点和应用场景。以下将详细介绍几种嵌入式开发中常用的总线,包括UART、I2C、SPI、R
    的头像 发表于 09-10 11:34 587次阅读

    I2C总线协议的工作原理和寻址格式

    等特点,在嵌入式系统设计得到了广泛应用。本文将详细介绍I2C总线协议的工作原理和寻址格式,帮助读者深入理解该协议。
    的头像 发表于 05-27 15:47 1711次阅读

    SPI和I2C通信协议:应用与区别

    /DAC芯片等场合。SPI和I2C在连接方式、传输速率和设备支持等方面有显著差异,但随着联网和智能设备的发展,它们都将在嵌入式系统中发挥重要作用。
    的头像 发表于 04-22 16:45 1793次阅读

    什么是I2C协议 I2C总线的控制逻辑

    在实际使用过程I2C比较容易出现的一个问题就是死锁 ,死锁在I2C主要表现为:I2C死锁时表现为SCL为高,SDA一直为低。
    发表于 03-12 09:17 1043次阅读
    什么是<b class='flag-5'>I2C</b>协议 <b class='flag-5'>I2C</b><b class='flag-5'>总线</b>的控制逻辑

    详解I2C接口协议

    I2C总线是由荷兰皇家飞利浦Philips公司(现恩智浦NXP半导体)开发的一种简单的双向两线制总线协议标准。
    发表于 03-07 10:22 2094次阅读
    <b class='flag-5'>详解</b><b class='flag-5'>I2C</b>接口协议

    给大家讲讲嵌入式系统I²C总线的时序

    I²C总线嵌入式系统很常见,今天就来给大家讲讲I²C
    的头像 发表于 02-23 09:47 1627次阅读
    给大家讲讲<b class='flag-5'>嵌入式</b>系统<b class='flag-5'>中</b><b class='flag-5'>I</b>²<b class='flag-5'>C</b><b class='flag-5'>总线</b>的时序

    GD32 MCU硬件I2C不可靠不如软件I2C?来看看红枫派开发版的硬件I2C驱动如何做到稳得一批

    在一个评论,看到网友对硬件I2C的讨论,硬件I2C Busy找不到原因、软件I2C稳得一批。
    的头像 发表于 02-23 09:37 2775次阅读
    GD32 MCU硬件<b class='flag-5'>I2C</b>不可靠不如<b class='flag-5'>软件</b><b class='flag-5'>I2C</b>?来看看红枫派开发版的硬件<b class='flag-5'>I2C</b>驱动如何做到稳得一批

    蓝牙串口通讯总线——I2C/SPI/UART

    嵌入式工程师在做串口通信调试工作的时候,会经常用到I2C、SPI、UART这3条总线I2C、SPI、UART这三种通信总线
    的头像 发表于 01-22 09:41 1604次阅读
    蓝牙串口通讯<b class='flag-5'>总线</b>——<b class='flag-5'>I2C</b>/SPI/UART

    关于I2C总线的6个问题分析

    I2C总线上的上拉电阻范围是多少? 回答: 总线电容是走线部分、连接部分、管脚部分的电容的总和。总线电容限制了上拉电阻(Rp) 的最大值,因为
    发表于 12-25 09:19 1672次阅读