I2C通信是如何工作?

通信网络

650人已加入

描述

MSP430是德州仪器为嵌入式项目提供的强大平台,其多功能性使其能够找到进入许多应用的方法,并且该阶段仍在进行中。从现在开始,我们已经介绍了我们可以进入更有趣的东西(如通信门户)的基础知识。

在庞大的嵌入式应用中,没有微控制器可以自行执行所有活动。在某个阶段,它必须与其他设备通信以共享信息,有许多不同类型的通信协议来共享这些信息,但最常用的是USART,IIC,SPI和CAN。每种通信协议都有自己的优点和缺点。现在让我们专注于I2C 部分,因为这是我们将在本教程中学习的内容。

什么是 I2C 通信协议?

IIC一词代表“内部集成威廉希尔官方网站 ”。它通常表示为 I2C 或 I 平方 C,甚至在某些地方表示为 2 线接口协议 (TWI),但含义相同。I2C是一种同步通信协议,意味着共享信息的两台设备必须共享一个共同的时钟信号。它只有两根线来共享信息,其中一根用于翘起信号,另一根用于发送和接收数据。

I2C 通信如何工作?

I2C通信最初是由菲利普斯引入的。如前所述,它有两根电线,这两根电线将跨两个设备连接。在这里,一个设备称为主设备,另一个设备称为从设备。通信应该而且将始终发生在两个主站和从站之间。I2C通信的优点是可以将多个从机连接到一个主站。

通信协议

完整的通信通过这两根线进行,即串行时钟(SCL)和串行数据(SDA)。

串行时钟 (标准式高标准显示):与从机共享主站产生的时钟信号

串行数据 (SDA):在主站和从站之间发送数据。

在任何给定时间,只有主机才能启动通信。由于总线中有多个从站,因此主站必须使用不同的地址来引用每个从站。当寻址时,只有具有该特定地址的从站会回复信息,而其他人则退出。这样,我们可以使用相同的总线与多个设备进行通信。

I2C 的电压电平不是预定义的。I2C 通信非常灵活,意味着由 5v V 供电的设备可以使用 5v 进行 I2C,3.3v 设备可以使用 3v 进行 I2C 通信。但是,如果两个以不同电压运行的器件需要使用I2C进行通信,该怎么办?5V I2C 总线不能与 3.3V 设备连接。在这种情况下,电压转换器用于匹配两个I2C总线之间的电压电平。

有一些条件可以框定交易。传输的初始化从SDA的下降沿开始,在下图中定义为“START”条件,其中主控器在将SDA设置为低电平时使SCL保持高电平。

通信协议

如下图所示,

SDA 的下降沿是 START 条件的硬件触发器。在此之后,同一总线上的所有设备都将进入侦听模式。

以同样的方式,SDA的上升沿停止传输,在上图中显示为“停止”条件,其中主站离开SCL高电平,也释放SDA以达到高电平。因此,SDA的上升沿会停止传输。

通信协议

R/W 位表示后续字节的传输方向,如果为 HIGH 表示从机将传输,如果为 LOW 表示主站将传输。

每个位在每个时钟周期传输,因此传输一个字节需要 8 个时钟周期。在发送或接收每个字节后,ACK/NACK(已确认/未确认)保持第九个时钟周期。此ACK位由从机或主站根据情况生成。对于 ACK 位,SDA 由主站或从机设置为 9 时为低电平千时钟周期。所以它被认为是 ACK 否则 NACK。

通信协议

在哪里使用 I2C 通信?

I2C通信仅用于短距离通信。它在一定程度上肯定是可靠的,因为它具有同步时钟脉冲以使其智能。该协议主要用于与传感器或其他必须向主站发送信息的设备进行通信。当微控制器必须使用最少的电线与许多其他从模块通信时,它非常方便。如果您正在寻找远程通信,则应尝试RS232,如果您正在寻找更可靠的通信,则应尝试SPI协议。

MSP430 中的 I2C:控制数字电位计 AD5171

Energia IDE是最简单的MSP430编程软件之一。它与Arduino IDE相同。您可以在此处了解有关使用 Energia IDE 开始使用 MSP430 的更多信息。

因此,要在Energia IDE中使用I2C,我们只需要包含wire.h头文件。引脚声明(SDA 和 SCL)位于导线库内,因此我们不需要在设置函数中进行声明。

可以在 IDE 的“示例”菜单中找到示例示例。下面解释其中一个示例:

本例说明如何控制ADI公司AD5171数字电位计,该电位计通过I2C同步串行协议进行通信。使用MSP的I2C线库,数字电位器将逐步通过64级电阻,使LED衰减。

首先,我们将包括负责 i2c 通信的库,即线库

#include

在设置函数中,我们将通过.begin()函数启动线库。

void setup() {

Wire.begin();                       

}

然后初始化一个变量val以存储电位器的值

byte val = 0;

在环路功能中,我们将通过指定IC数据表中给出的器件地址,开始向i2c从器件(在本例中为数字电位器IC)传输。

void loop() {

Wire.beginTransmission(44); // transmit to device #44 (0x2c)

随后,队列字节,即您要发送到IC的数据,以便使用write()函数进行传输。

Wire.write(byte(0x00));            

// sends instruction byte

Wire.write(val);

// sends potentiometer value byte

然后通过调用 endTransmission() 来传输它们。

Wire.endTransmission();

// stop transmitting

val++;

// increment value

if (val == 64)

{       // if reached 64th position (max)

val = 0;

// start over from lowest value

}

delay(500);

}

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分