关于Arduino I2C总线的所有信息

Arduino I2C总线

连接器 Arduino可以创建大量项目 如您所见,如果您读过Hwlibre, 以简单的方式对微控制器进行编程。但是在该板的模拟和数字连接之间 hardware libre,有些对于许多初学者来说仍然有些未知,例如 PWM 连接、SPI、串行端口的 RX 和 TX 引脚或 I2C 总线本身的真正潜力。因此,通过本条目,您至少能够了解有关 I2C 的所有信息。

连接器 I2C总线 您可以连接并使用具有这种协议类型的许多第三方设备与Arduino开发板进行通信。 借助飞利浦的这项发明,您可以在它们之间连接加速度计,显示器,计数器,指南针以及更多集成电路。

什么是I2C?

I2C是指集成电路,即,内部集成电路。 它是由飞利浦半导体公司于1982年开发的串行数据通信总线,在摆脱了这一部分之后,今天的公司是恩智浦半导体。 最初,它是为该品牌的电视创建的,用于以简单的方式传达多个内部芯片。 但是自1990年以来,I2C已经普及并被许多制造商所使用。

目前被数十家芯片制造商使用 用于多种功能。 Arduino板的微控制器的创建者Atmel出于许可目的介绍了TWI(两线接口)名称,尽管它与I2C相同。 但是在2006年,原始专利已过期,并且不再受版权保护,因此I2C一词已被重新使用(仅徽标继续受到保护,但该词的实现或使用不受限制)。

I2C总线技术细节

I2C总线

El I2C总线已成为行业标准,而Arduino已实现它 与需要它的外围设备进行通信。 它只需要两条线或电缆即可工作,一条用于时钟信号(CLK),另一条用于发送串行数据(SDA)。 与其他通信相比,与SPI总线相比,这是有利的,尽管由于需要额外的电路,其操作有些复杂。

在这辆公共汽车上 连接到它的每个设备都有一个地址 用于分别访问这些设备。 该地址由硬件固定,可以通过跳线或开关DIP修改后3位,尽管它也可以由软件完成。 每个设备都将具有唯一的地址,尽管其中一些设备可能具有相同的地址,并且可能有必要使用辅助总线以避免冲突或在可能的情况下进行更改。

此外,I2C总线具有一个 主从式架构 即主从。 这意味着当主设备启动通信时,它将能够从其从设备发送或接收数据。 从站将无法发起通信,只有主站才能进行通信,在没有主站干预的情况下,从站也不能直接相互通信。

如果你有 公共汽车上的几个老师,只有一个人可以同时担任老师。 但这是不值得的,因为更换教师需要很高的复杂性,因此不经常发生。

请记住, 主站提供时钟信号以同步总线上的所有设备。 这就消除了每个奴隶都拥有自己的手表的需要。

I2C总线协议还预见到电源电压线(Vcc)中将使用上拉电阻器,尽管这些电阻器通常不与Arduino一起使用 上拉,因为编程库 由于Wire激活内部值为20-30 k的值。 对于某些项目来说,这可能太软了,因此信号的上升沿将变慢,因此可以使用较低的速度和较短的通信距离。 为了解决这个问题,您可能需要将外部上拉电阻设置为1k至4k7。

信号

I2C信号

La 沟通框架 其中I2C总线信号由位或状态(在Arduino中使用的那些,因为I2C标准允许其他位或状态)组成:

  • 8位,其中7位 DIRECCION 您要访问以从其发送或接收数据的从设备的地址。 使用7位,最多可以创建128个不同的地址,因此理论上可以访问128个设备,但是只能访问112个设备,因为16个设备保留用于特殊用途。 以及指示您是否想要的附加位 发送或接收 从设备信息。
  • 也有 验证位,如果未激活,则通讯将无效。
  • 然后 数据字节 他们想被奴隶发送或接收。 如您所知,每个字节都由8位组成。 注意,对于发送或接收的每8位或1个字节的数据,还需要另外18位的验证,地址等,这意味着总线的速度非常有限。
  • 最后一点 验证 的沟通。

另外,时钟频率为 传输是标准的100 Mhz, 尽管有一个更快的模式,速度为400 Mhz。

I2C总线的优缺点

优点 是:

  • 简单 仅使用两行。
  • 它有 知道信号是否到达的机制 与其他通讯协议相比。

缺点 是:

  • Velocidad 传输率相当低。
  • 它不是全双工即,您不能同时发送和接收。
  • 不使用奇偶校验 也没有任何其他类型的验证机制可以知道接收到的数据位是否正确。

Arduino上的I2C

Arduino I2C总线

En Arduino,取决于型号,可以启用以使用此I2C总线的引脚会有所不同。 例如:

  • Arduino UNO,纳米,Mini Pro:A4用于SDA(数据),而A5用于SCK(时钟)。
  • Arduino的兆丰:SDA的引脚20,SCK的引脚21。

请记住,要使用它,您必须 利用图书馆 线材 用于您的Arduino IDE代码,尽管还有其他类似的代码 I2C y i2cdevlib。 您可以阅读这些库的文档或我们感兴趣的项目上的文章,以获得有关其编程方式的代码。

如何知道要与I2C一起使用的设备的地址?

最后一个警告是,当您从欧洲,日本或美国制造商那里购买IC时,您会发现 指示方向 该用于设备。 另一方面,中文有时会不详细或不正确,因此将无法使用。 使用地址扫描仪可以轻松地解决该问题,从而知道您应该在草图中参考哪个方向。

La arduino社区 创建了这个 扫描地址并识别的代码 以一种简单的方式。 尽管我在这里向您显示了代码:

#include "Wire.h"
 
extern "C" { 
    #include "utility/twi.h"
}
 
void scanI2CBus(byte from_addr, byte to_addr, void(*callback)(byte address, byte result) ) 
{
  byte rc;
  byte data = 0;
  for( byte addr = from_addr; addr <= to_addr; addr++ ) {
    rc = twi_writeTo(addr, &data, 0, 1, 0);
    callback( addr, rc );
  }
}
 
void scanFunc( byte addr, byte result ) {
  Serial.print("addr: ");
  Serial.print(addr,DEC);
  Serial.print( (result==0) ? " Encontrado!":"       ");
  Serial.print( (addr%4) ? "\t":"\n");
}
 
 
const byte start_address = 8;
const byte end_address = 119;
 
void setup()
{
    Wire.begin();
 
    Serial.begin(9600);
    Serial.print("Escaneando bus I2C...");
    scanI2CBus( start_address, end_address, scanFunc );
    Serial.println("\nTerminado");
}
 
void loop() 
{
    delay(1000);
}


成为第一个发表评论

发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责数据:MiguelÁngelGatón
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。