极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20706|回复: 4

Arduino 之间的 I2C 通讯 (1) I2C 地址设定 及 I2C 地址扫瞄

[复制链接]
发表于 2015-8-1 21:12:50 | 显示全部楼层 |阅读模式
本帖最后由 Super169 于 2015-8-1 21:12 编辑

相关指令:

指令发出者作用
Wire.begin([<address>]);        master / slave启动 Wire (由於 i2c 是用 Wire 的, 这就等同启动 i2c 了)
Wire.beginTransmission(<address>);master开始对 <address> 的连线
Wire.endTransmission();master 关闭之前的连线



i2c 地址设定

i2c address 就像是你家中的地址, 每个 slave 都有自己的地址, 由於线路上只有一个 master, 加上 slave 只可以向 master 通讯, 所以 master 是不需地址的.

设定 i2c 地址, 基本上是没有限制的, 只要同一线路上, 没有重复就可以了.
要设定 slave 板子的地址, 只需要执行 Wire.begin(<地址>); 而 master 因为不需要地址, 只要 Wire.begin() 就可以了,.

以下是一个 slave 设定的例子, 把 slave 板子的地址设定为 0x12, 上载到 slave 板子上去执行就可以了.

[pre lang="arduino" line="1" file="slave_01.ino"]#include <Wire.h>

#define SLAVE_ADDRESS 0x12

void setup() {
  Wire.begin(SLAVE_ADDRESS);    // join I2C bus as a slave with address 0x12
}

void loop() {
}[/code]



i2c 地址扫瞄

slave 建立後, 就要看看 master 如果找到它了.
i2c scanner 可以说是 master 板子的最基本例子, 可以用作测试线路上连接了的设备的存在 (只测试存在性, 并非测试其功能).
i2c_scanner 其实也很简单, 由 master 向所有地址发出 beginTransmission 再 endTransmission, 尝试建立连线.  在 beignTransmission 中输入 slave 的地址, 就可以测试该地址的装置了.

如果 error = 0 (没 error), 即代表这个地址有设备登记
如果 error = 4 (这是 Wire 库的设定, 不要问我为什麽是 4), 即代表这个地址可能有设备, 但有错误.
否则, 就代表该地址没有设备使用了.

以下是一个简单的 i2c scanner 程式:

[pre lang="arduino" line="1" file="i2c_scanner.ino"]#include <Wire.h>

#define SERIAL_BAUD 57600

void setup()
{
  Wire.begin();

  Serial.begin(SERIAL_BAUD);
  Serial.println("I2C Scanner started");
  Serial.println();
}


void loop()
{
  uint8_t error, i2cAddress, devCount, unCount;

  Serial.println("Scanning...");

  devCount = 0;
  unCount = 0;
  for(i2cAddress = 1; i2cAddress < 127; i2cAddress++ )
  {
    Wire.beginTransmission(i2cAddress);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at 0x");
      if (i2cAddress<16) Serial.print("0");
      Serial.println(i2cAddress,HEX);
      devCount++;
    }
    else if (error==4)
    {
      Serial.print("Unknow error at 0x");
      if (i2cAddress<16) Serial.print("0");
      Serial.println(i2cAddress,HEX);
      unCount++;
    }   
  }

  if (devCount + unCount == 0)
    Serial.println("No I2C devices found\n");
  else {
    Serial.print(devCount);
    Serial.print(" device(s) found");
    if (unCount > 0) {
      Serial.print(", and unknown error in ");
      Serial.print(unCount);
      Serial.print(" address");
    }
    Serial.println();
  }
  Serial.println();
  delay(5000);
}
[/code]

在这个例子中, 应该可以得到以下的结果:
I2C Scanner started

Scanning...
I2C device found at 0x12
1 device(s) found


I2C Scanner 是非常有用的, 当你买了一个新装置, 如果送来的程式不成功, 先看看相关地址是否可找到装置, 可简单测试装置是否有问题.

相關程式下載:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-10-4 17:59:59 | 显示全部楼层
受教了~~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2015-10-4 23:57:53 | 显示全部楼层
谢谢~受教了~是个好方法
回复 支持 反对

使用道具 举报

发表于 2015-10-13 19:20:59 | 显示全部楼层
一直用i2c,但没用过查找地址功能,又学一招
回复 支持 反对

使用道具 举报

发表于 2016-5-8 00:26:00 | 显示全部楼层
这个教程真是太及时了,谢谢楼主。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-29 15:08 , Processed in 0.051747 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表