I2C-两线外设接口-用于ArduinoNano, uno ,Mega2560

这篇文章描述了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值