arduino读取I2C总线上连接设备的地址

通信模块

36人已加入

描述

  Arduino之间的I2C通讯

  i2c地址设定

  i2caddress 就像是你家中的地址, 每个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),即代表这个地址有设备登记

  如果 rror = 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

  ARDUINO的I2C通信详解

  I2C是非常普通的通信方式,Arduino单片机集成了I2C库,可以直接调用几个函数实现I2C通信。Arduino MEGA2560开发板I2C接口,在班上对应的20--SDA 21--SCL。

  Arduino的I2C库是Wire.h。常用库函数如下:

  Wire.beginTransmission(Addr);

  Wire.write(data);

  Wire.endTransmission(void);

  Wire.requestFrom(Addr, num);

  Wire.available();

  Wire.read()。

  每个数据发出后,都必须有应答,只有在等到应答后,才能发出下一个数据或者指令。

  下面是一段代码:

  Wire.beginTransmission(0x01);

  Wire.write(0xAA);

  如果0x01发出后I2C器件没有应答,那么0xAA就不能发送,这时候用示波器或者逻辑分析仪看,就只能看到发出了Start信号和数据0x01。

  Wire.beginTransmission(Addr)只发送起始信号和I2C地址,Addr是I2C总线地址。

  Wire.write(data)只发送数据,data就是希望发送的数据,而且是发一次,地址就自动加一。

  Wire.endTransmission(void)发送停止信号。

  Wire.requestFrom(Addr, num)向已知地址器件获取连续num个数据,这时候需要注意,数据只是存起来了,并没有真正返回。

  Wire.read()就是用来读回前面那些存起来的数据,而且是读一次地址自动加一。

  Wire.available()则返回已经存了多少个数据。

  arduino读取I2C总线上连接设备的地址:

  这两天研究了一下I2C总线,发现有好多I2C设备的地址并不知道,当然有的可以在网上查的到,但是如果遇到用过的I2C器件,设备地址被修改过,那么通过下面的代码可以检测出设备的地址。

  操作步骤 :

  1、将一个I2C器件连接至arduino的SDA、SCL引脚(UNO R3 连接A4、A5)

  2、将如下代码烧入arduino,打开串口界面即可得到I2C设备的地址。

  #include 《Wire.h》

  void setup()

  {

  Wire.begin();

  Serial.begin(9600);

  Serial.println(“nI2C Scanner”);

  }

  void loop()

  {

  byte error, address;

  int nDevices;

  Serial.println(“Scanning.。。”);

  nDevices = 0;

  for(address = 1; address 《 127; address++ )

  {

  Wire.beginTransmission(address);

  error = Wire.endTransmission();

  if (error == 0)

  {

  Serial.print(“I2C device found at address 0x”);

  if (address《16)

  Serial.print(“0”);

  Serial.print(address,HEX);

  Serial.println(“ !”);

  nDevices++;

  }

  else if (error==4)

  {

  Serial.print(“Unknow error at address 0x”);

  if (address《16)

  Serial.print(“0”);

  Serial.println(address,HEX);

  }

  }

  if (nDevices == 0)

  Serial.println(“No I2C devices foundn”);

  else

  Serial.println(“donen”);

  delay(5000); // wait 5 seconds for next scan

  I2C设备地址无法驱动设备的解决办法:

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

全部0条评论

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

×
20
完善资料,
赚取积分