从arduino 3v3读取的Android Things I2C

时间:2019-02-22 18:24:33

标签: arduino i2c android-things

我尝试使用Android Things从Arduino-从属设备-RPi-主设备进行通信,读取和写入。

如果i R / W具有电平转换器,从RPi到Arduino 5v(16Mhz),一切正常。

所以我决定取消电平转换器,并使用3v3 Arduino mini pro(8Mhz)。

写入工作正常,但是当我尝试从Arduino读取时,信号停止。

5v_16Mhz
设置为9后,地址为0,并读取为9,信号仍为低电平并接收到数据。没问题。

3v3_8Mhz
设置为9、0地址并读取为9之后,信号变高,数据停止。

我为奴隶使用了相同的例子:

#include <Wire.h>

byte RFID[20] = {9,8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8,9,1,2};


void setup() {
  Wire.begin(8);          // join i2c bus with address #8
  Wire.onRequest(requestEvent); // register event
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(115200);     // start serial for output
  pinMode(13, OUTPUT);
}

void loop() {
  delay(100);
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
  Serial.println("Master ask");
  digitalWrite(13, HIGH);
  delay(250);
  Wire.write(RFID, 20);
  digitalWrite(13, LOW);
}

// function should be executes whenever data is received from master
// this function is registered as an event, but it's called every time the RPi
// call the Device.
void receiveEvent(int howMany) {
  while (0 < Wire.available()) {
    byte RTC_syn = Wire.read(); // receive byte
    Serial.println(RTC_syn);
  }
}

我真的不知道如何将信号推高...
有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

  

如果i R / W具有电平转换器,从RPi到Arduino 5v(16Mhz),一切正常。

     

所以我决定取消电平转换器,并使用3v3 Arduino mini pro(8Mhz)。

     

写入工作正常,但是当我尝试从Arduino读取时,信号停止。

这是因为您在5V / 3.3V版本中使用的电平转换器所做的不仅仅是改变电压。它还可以在两个设备之间充当良好的高阻抗缓冲器,从而有助于保持信号驱动并避免负载效应。

在没有缓冲区的情况下,您的总线可能正在经历一些加载。您可以尝试通过添加更强的上拉电阻来解决这一问题。 RPi3在I2C线路上具有1.8k上拉电阻,该电阻通常可以工作,但根据从设备的输入阻抗可能很小。 Arduino Mini具有安装I2C上拉电阻的垫,但默认情况下没有。

对于纯3.3V I2C总线,推荐的上拉电阻接近1k,因此您可能只需要在SCL / SDA和+ 3.3V之间增加一些更强的上拉电阻即可。您添加的任何内容都将与RPi3电阻并联,因此请在计算中考虑。例如,添加4.7k电阻器可使有效电阻降至1.3k左右。

如果无法通过上拉解决它,则可以通过使用线路驱动器IC(random example)来实现相同的缓冲效果而无需进行电平转换。

答案 1 :(得分:-1)

如果液位转换器正常工作,则应坚持使用它。

诸如I2C之类的通信协议将数据编码为一系列逻辑高和逻辑低信号。 HIGH / LOW是什么意思?这取决于设备。对于大多数嵌入式设备,逻辑低电平将接地,即0V。

对于Arduino和Raspberry Pi,其源电压是不同的(3.3V与5V)。这种差异可能导致几个潜在的问题。

  1. 5V信号太高而无法处理Arduino,从而导致Arduino停止工作或重新启动

  2. 3.3V信号的强度不足以解释为逻辑高电平。嵌入式设备的电路会将信号四舍五入为HIGH / LOW,并且阈值可能不完全相等。 5V输入只能接受4.5V或更高电压,将其他所有内容解释为LOW或处于不确定状态。