这篇文章描述了I2C(互连集成电路,或“两线制”)接口的工作方式,特别是参考了基于ATmega328P微处理器芯片的Arduino Uno。但是,很多细节将引起人们的广泛关注。
两线接口对于连接多个设备非常有用,因为它们都可以共享相同的两个引脚(加上接地回路)。这是因为设备是“可寻址的”。每个设备都必须具有8到119范围内的唯一地址。地址0保留为“广播”地址,地址1到7保留用于其他目的,地址120到127保留以备将来使用。
因此,您可能在地址10处有一个LCD屏幕(例如),在地址11处有一个键盘,依此类推。
在Arduino Uno上,您需要的引脚是:
模拟端口4(A4)= SDA(串行数据)
模拟端口5(A5)= SCL(串行时钟)
在Arduino Mega上,SDA是数字引脚20,SCL是数字引脚21(它们在板上本身标记为SDA和SCL)。
在Arduino Leonardo上,SDA和SCL引脚是单独的引脚,因此在板上标有标记(AREF旁边)。它们还连接到D2(SDA)和D3(SCL)。
这些引脚可能需要上拉电阻(也就是说,每个引脚都通过一个4.7K电阻连接到+ 5v)。
Atmega328配置为使用内部上拉电阻器,该电阻器可能适合短电缆走线。警告:对于多个I2C器件,或更长的电缆中,4.7K的上拉电阻(每线)推荐。
有关使用不同的上拉电阻的效果的一些屏幕截图,请参见此线程的下一部分。
当然,您还需要连接GND(接地)引脚以完成电路。
引脚应连接在一起(即,如果将Arduino Unos 连接在一起,则引脚4到引脚4,引脚5到引脚5)。这是因为上拉电阻使线路保持高电平,直到其中一个设备想要通过将线路拉低来使用它为止。换句话说,您不必交换引脚(就像您在串行通信中所做的那样,在串行通信中,您将Tx连接到Rx,反之亦然)。
还要注意,Atmega规定最大总线电容为400 pf,这样可以排除较长的电缆走线。
主
// Written by Nick Gammon
// February 2012
#include <Wire.h>
const byte MY_ADDRESS = 25;
const byte SLAVE_ADDRESS = 42;
const byte LED = 13;
void setup()
{
Wire.begin (MY_ADDRESS);
Wire.onReceive (receiveEvent);
pinMode (LED, OUTPUT);
} // end of setup
void loop()
{
for (int x = 2; x <= 7; x++)
{
Wire.beginTransmission (SLAVE_ADDRESS);
Wire.write (x);
Wire.endTransmission ();
delay (200);
} // end of for
} // end of loop
void receiveEvent (int howMany)
{
for (int i = 0; i < howMany; i++)
{
byte b = Wire.read ();
digitalWrite (LED, b);
} // end of for loop
} // end of receiveEvent
从
// Written by Nick Gammon
// February 2012
#include <Wire.h>
const byte MY_ADDRESS = 42;
const byte OTHER_ADDRESS = 25;
void setup ()
{
Wire.begin (MY_ADDRESS);
for (byte i = 2; i <= 7; i++)
pinMode (i, OUTPUT);
Wire.onReceive (receiveEvent);
} // end of setup
void loop()
{
int v = analogRead (0);
Wire.beginTransmission (OTHER_ADDRESS);
Wire.write (v < 512);
Wire.endTransmission ();
delay (20);
} // end of loop
// called by interrupt service routine when incoming data arrives
void receiveEvent (int howMany)
{
for (int i = 0; i < howMany; i++)
{
byte c = Wire.read ();
// toggle requested LED
if (digitalRead © == LOW)
digitalWrite (c, HIGH);
else
digitalWrite (c, LOW);
} // end of for loop
} // end of receiveEvent
原文地址:《I2C-两线外设接口-用于ArduinoNano, uno ,Mega2560》