当前位置:  开发笔记 > 编程语言 > 正文

Arduino作为具有多个i2c地址的从站

如何解决《Arduino作为具有多个i2c地址的从站》经验,为你挑选了1个好方法。

我想使用Arduino作为i2c奴隶.但我要求Arduino通过向多个i2c地址注册来充当多个设备.

这可能不是人们通常会做的事情,但这是我做这件事的原因:

我想用Arduino作为Spektrum遥测的遥测传感器.遥测接收器有一些i2c插头,连接到多个传感器(电流0x02,电压0x03,空速0x11等),每个传感器都具有遥测接收器所需的固定i2c地址.

我想使用一个 Arduino作为所有这些设备,通过注册所有上述地址,并适当地响应读数.

我可以使用每个传感器一个Arduino,这看起来很傻,因为我可以使用一个Arduino pro-mini执行所有这些读数.

我知道你可以使用注册Arduino

Wire.begin(0x02); 

但是我需要类似的东西(伪代码)

Wire.begin(0x02, 0x03, 0x11);

当收到请求时,我需要知道Arduino被查询的地址.

例如(伪代码)

void receiveEvent(byte address, int bytesReceived){
  if(address == 0x02){
    // Current reading
  }
  else if(address == 0x03){
    // Voltage reading
  }
  else if(address == 0x11){
    // Airspeed reading
  }
}

任何意见,将不胜感激.



1> vega8..:

由于Wire.begin()只允许传递单个从地址,因此无法通过使用Wire库使Arduino监听多个从地址.


即使是大多数Arduinos所基于的Atmel ATmega微控制器也只允许其硬件2线串行接口(TWI)通过其2线地址寄存器设置为单个7位地址TWAR.但是,可以通过使用TWI地址屏蔽寄存器屏蔽一个或多个地址位来解决此限制TWAMR,如本文ATmega数据表第22.9.6节中所述(有些简要):

TWAMR可以加载7位Salve(sic!)地址掩码.TWAMR中的每个位都可以屏蔽(禁用)TWI地址寄存器(TWAR)中的相应地址位.如果屏蔽位设置为1,则地址匹配逻辑忽略输入地址位与TWAR中相应位之间的比较.

因此,我们首先必须根据我们想要响应的所有I2C地址设置掩码位,方法是对它们进行"或"运算并向右移位以匹配TWAMR寄存器布局(TWAMR在bit7:1中保持掩码,未使用bit0):

TWAMR = (sensor1_addr | sensor2_addr | sensor3_addr) << 1;

这里的主要问题是找出查询的特定I2C地址(我们只知道它与地址掩码匹配).如果我正确解释第22.5.3节,说明

TWDR包含要传输的地址或数据字节,或接收的地址或数据字节.

我们应该能够从TWDR寄存器中检索未屏蔽的I2C地址.

ATmega TWI操作是基于中断的,更具体地说,它利用单个中断向量来处理由TWSR状态寄存器中的状态代码指示的过多的不同TWI事件.在TWI中断服务程序中,我们必须这样做

    确保我们进入ISR的原因是因为我们已经被查询过了.这可以通过检查TWSR状态代码0xA8(已收到自己的SLA + R)来完成

    通过检查总线上的最后一个字节,根据实际查询的I2C地址,决定将哪些传感器数据发送回主站TWDR.

ISR的这一部分可能看起来像这样(未经测试):

if (TWSR == 0xA8) { // read request has been received
  byte i2c_addr = TWDR >> 1; // retrieve address from last byte on the bus
  switch (i2c_addr) {
    case sensor1_addr:
      // send sensor 1 reading
      break;
    case sensor2_addr:
      // send sensor 2 reading
      break;
    case sensor3_addr:
      // send sensor 3 reading
      break;
    default:
      // I2C address does not match any of our sensors', ignore.
      break;
  }
}

感谢您提出这个有趣的问题!

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有