目前,协议在嵌入式系统设计中起着至关重要的作用。在不涉及协议的情况下,如果您想扩展微控制器的外围功能,则复杂性和功耗将增加。有不同类型的总线协议可用,如USART、SPI、CAN、I2C总线协议等,用于在两个系统之间传输数据。


I2C协议

什么是I2C总线?

在两个或两个以上的设备之间传输和接收信息需要称为总线系统的通信路径。I2C总线是一种双向双线串行总线,用于在集成电路之间传输数据。I2C代表“内部集成电路”。它于1982年由飞利浦半导体公司首次引入。I2C总线由三种数据传输速度组成,如标准模式、快速模式和高速模式。I2C总线支持7位和10位地址空间设备,其操作因低电压而异。

ding="async" class="size-medium wp-image-24399" src="https://uploads.9icnet.com/images/aritcle/20230519/12-300x92.jpg" alt="I2c Bus Protocol" width="300" height="92" sizes="(max-width: 300px) 100vw, 300px">
I2c总线协议

I2C信号线

I2C Signal Lines
I2C信号线

I2C是一种串行总线协议,由两条信号线组成,如SCL和SDL线,用于与设备通信。SCL代表“串行时钟线”,此信号始终由“主设备”驱动。SDL代表“串行数据线”,该信号由主设备或I2C外围设备驱动。当I2C外围设备之间没有传输时,这些SCL和SDL线都处于漏极开路状态。

开路漏极输出

漏极开路是FET晶体管的概念,其中晶体管的漏极端子为开路状态。主设备的SDL和SCL引脚设计为晶体管处于开路状态,因此只有当这些晶体管导通时,数据传输才有可能。因此,这些线路或漏极端子通过上拉电阻器连接到VCC以用于导通模式。

I2C接口

许多从设备在I2C总线的帮助下通过I2C电平移位器IC与微控制器接口,用于在它们之间传输信息。I2C协议用于连接最多128个设备,这些设备都被连接以与主单元的SCL和SDL线路以及从设备进行通信。它支持多主机通信,这意味着两个主机用于与外部设备通信。

I2C数据传输速率

I2C协议操作三种模式,如:快速模式、高速模式和标准模式,其中标准模式数据速度范围为0Hz至100Hz,快速模式数据可以以0Hz至400KHz的速度传输,高速模式可以以10KHz至100KHz的速率传输。针对每次传输发送9比特数据,其中8比特由发射机MSB发送到LSB,并且第9比特是接收机发送的确认比特。

I2C Data Transfer Rates
I2C数据传输速率

I2C通信

I2C总线协议最常用于主设备和从设备通信,其中主设备称为“微控制器”,从设备称为其他设备,如ADC、EEPROM、DAC和嵌入式系统中的类似设备。在I2C总线的帮助下,从设备的数量连接到主设备,其中每个从设备都由一个唯一的地址组成以进行通信。以下步骤用于将主设备通信到从设备:

第1步:首先,主设备发出启动条件以通知所有从设备,以便它们在串行数据线上侦听。

第2步:主设备发送目标从设备的地址,该地址与连接到SCL和SDL线的所有从设备的寻址进行比较。如果有任何地址匹配,则选择该设备,并断开其余所有设备与SCL和SDL线路的连接。

第3步:具有从主设备接收的匹配地址的从设备以对主设备的确认进行响应,此后在数据总线上的主设备和从设备之间建立通信。

第4步:主设备和从设备都根据通信是读还是写来接收和发送数据。

步骤5:然后,主设备可以向接收器发送8比特的数据,接收器以1比特的确认进行应答。

I2C教程

相对于时钟脉冲一步一步串行地发送和接收信息被称为I2C协议。它是一种系统间短距离协议,也就是说,它在电路板内用于主设备和从设备之间的通信。

I2C协议基础

通常,I2C总线系统由两条线组成,这两条线很容易用于扩展输入和输出外围功能,如ADC、EEROM和RTC,以及其他基本组件,以使系统的复杂性非常低。

例子:由于8051微控制器没有内置ADC,因此,如果我们想将任何模拟传感器连接到8051微处理器,我们必须使用ADC设备,如ADC0804-1通道ADC、ADC0808-8通道ADC等。通过使用这些ADC,我们可以将模拟传感器连接至微控制器。

在不使用该协议扩展任何微控制器或处理器的I/O功能的情况下,我们可以使用8255 ICit 8引脚设备。8051微控制器是一个40引脚的微控制器;通过使用8255 IC,我们可以扩展3个I/O端口,每个端口有8个引脚。通过使用所有设备,如RTC、ADC、EEPROM、定时器等,为了扩展外围电路,复杂性、成本、功耗和产品尺寸也会增加。

为了克服这个问题,协议概念被引入到画面中,以降低硬件复杂性和功耗。通过使用此I2C协议,我们可以扩展更多的功能,如I/O外围设备、ADC、T/C和内存设备,最多可扩展128个设备。
I2C协议中使用的术语

变送器:将数据发送到总线的设备称为发送器。

接收人:从总线接收数据的设备被称为接收器。

大师:启动传输以生成时钟信号并终止传输的设备称为主设备。

从设备:由主设备寻址的设备称为从设备。

多主控器:多个主控器可以同时尝试控制总线而不会损坏该消息,称为多主控器。

仲裁:确保在多个主机同时试图控制总线的情况下,只允许一个主机这样做的程序;获胜消息没有被破坏。

同步:同步两个或多个设备的时钟信号的过程称为同步。

I2C基本命令序列

  1. 起始位条件
  2. 停止位条件
  3. 确认条件
  4. 主到从写入操作
  5. 从设备到主机的读取操作

启动和停止位条件

当主设备(微控制器)希望与从设备(例如ADC)通话时,它通过在I2C总线上发出启动条件来开始通信,然后发出停止条件。I2C启动和停止逻辑电平如图所示。

I2C启动条件定义为当SCL线为高时SDA线的高到低转换。当SDA线从低切换到高,而SCL线为高时,会出现I2C停止条件。

I2C主机总是生成S和P条件。一旦I2C主机启动START条件,I2C总线就被认为处于繁忙状态。

Start and Stop Bit Condition
启动和停止位条件

编程:

启动条件:

sbit SDA=P1^7;//初始化微控制器的SDA和SCL引脚//
sbit SCL=P1^6;
无效延迟(unsigned int);
空心总管()
{
SDA=1//处理数据//
SCL=1//时钟高//
延迟();
SDA=0//发送了数据//
延迟();
SCL=0//时钟信号低//
}
无效延迟(int p)
{
未染色蛋白塔,b;
对于(a=0;a<255;a++)//延迟函数//
对于(b=0;b<p;b++);
}

停止条件:

空心总管()
{
SDA=0;//停止处理数据//
SCL=1//时钟高//
延迟();
SDA=1//已停止//
延迟();
SCL=0//时钟信号低//
}
无效延迟(int p)
{
未染色蛋白塔,b;
对于(a=0;a<255;a++)//延迟函数//
对于(b=0;b<p;b++);
}

确认(ACK)和无确认(NCK)条件

在I2C总线上传输的每个字节之后都有来自接收器的确认条件,这意味着,在主机将SCL拉低以完成8位的传输之后,SDA将由接收器拉低到主机。如果在接收器的传输没有拉动之后,SDA线路LOW被认为是NCK状态。

Acknowledgement (ACK)
确认(ACK)

编程

确认
void main()无效
{
SDA=0//SDA线路变低//
SCL=1//时钟从高到低//
延迟(100);
SCL=0;
}
无确认:
void main()无效
{
SDA=1//SDA线路变高//
SCL=1//时钟从高到低//
延迟(100);
SCL=0;
}

主到从写入操作

I2C协议以数据包或字节的形式传输数据。每个字节后面跟着一个确认位。

数据传输格式

Data Transfer Format
数据传输格式

开始时间:主要是由生成启动条件的主机启动的数据传输序列。

7位地址:之后,主设备以两种8位格式而不是单个16位地址发送从设备地址。

转速:如果读取和写入位为高,则执行写入操作。

确认:如果在从设备中执行写入操作,则接收器向微控制器发送1位ACK。

停止:在从设备中完成写入操作之后,微控制器向从设备发送停止条件。

编程

写入操作

voidwrite(无符号字符d)
{
无符号字符k,j=0x80;
对于(k=0;k<8;k++)
{
SDA=(d&j);
J=J>>1;
SCL=1;
延迟(4);
SCL=0;
}
SDA=1;
SCL=1;
延迟(2);
c=SDA;
延迟(2);
SCL=0;
}

主到从读取操作

数据以位或字节的形式从从属设备读回——先读最高有效位,最后读最低有效位。

数据读取格式

Data Read Format
数据读取格式

开始时间:数据传输序列主要由生成启动条件的主机启动。

7位地址:之后,主设备以两种8位格式而不是单个16位地址发送从设备地址。

转速:如果读取和写入位为低,则执行读取操作。

确认:如果在从设备中执行写入操作,则接收器向微控制器发送1位ACK。

停止:在从设备中完成写入操作之后,微控制器向从设备发送停止条件。

编程

无效读数()
{
无符号字符j,z=0x00,q=0x80;
SDA=1;
对于(j=0;j<8;j++)
{
SCL=1;
延迟(100);
flag=SDA;
如果(标志==1)
{
z=(z | q);
q=q>>1;
延迟(100);
SCL=0;
}

ADC与8051微控制器接口的实际示例

ADC是一种用于将模拟数据转换为数字和数模形式的设备。8051微控制器没有内置ADC,因此我们必须通过I2C协议从外部添加。PCF8591是基于I2C的模数转换器和数模转换器。该设备最多可支持4个模拟输入通道以及2.5至6伏电压。

模拟输出

模拟输出以电压的形式出现。例如,5v模拟传感器提供0.01v至5v的输出逻辑。
5v的最大数字值为=256。
根据最大电压值,2.5v的值为=123。

模拟输出的公式为:

数字输出公式:

Interfacing ADC to the 8051 Microcontroller
ADC与8051微控制器的接口

上图显示了使用I2C协议从ADC设备到8051微控制器的数据传输。SCL和SDA的ADC引脚连接到微控制器的引脚1.7和1.6,用于在它们之间建立通信。当传感器向ADC提供模拟值时,它会转换为数字值,并通过I2C协议将数据传输到微控制器。

这是关于I2C总线协议教程和适当的程序。我们希望给定的内容能为您提供使用I2C通信将多个设备与微控制器接口的实用概念。如果您对本协议的接口程序有任何疑问,您可以通过下面的评论联系我们。