ArduinoI²C从站onReceive失败

时间:2015-07-01 19:58:25

标签: arduino raspberry-pi i2c raspberry-pi2

我目前在使用Arduino和Raspberry Pi 2时遇到了一些问题。

我在Arduino和Pi之间建立了一个工作I²C连接。我将Arduino配置为奴隶。

一些简单的测试有效。但是当我继续使用Arduino大约5分钟(实际时间是随机的)而不是I²C时,我在Wire.onReceive注册的函数停止被调用。 Arduino会根据请求继续发送值,但似乎完全忽略了发送给它的任何数据。

到目前为止我测试的内容:

  • 删除Arduino上的所有引脚写入和读取
  • 增加Pi的两个请求之间的延迟。这似乎增加了它的工作时间。最终仍然失败
  • 经常重新注册函数

以下是Arduino上的代码:

#include <Wire.h>

const byte ADDRESS = 0x4E;
const byte FLAG_PWM = 0x80;

byte states[22] = {OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT};
byte request;

void setup() {
  Wire.begin(ADDRESS);
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
}

void loop() {
  delay(100);
}

// At some point this function isn't called anymore. (request doesn't change)
void receiveEvent(int howMany) {
  byte byteIN = Wire.read();
  boolean pwm = byteIN & FLAG_PWM;

  byteIN &= ~FLAG_PWM;

  if (byteIN > 21)
    return;

  if (howMany == 1) {
    request = byteIN;

    if (states[byteIN] != INPUT)
      pinMode(byteIN, INPUT);
  } else if (howMany == 2) {
    if (states[byteIN] != OUTPUT)
        pinMode(byteIN, OUTPUT);

    byte value = Wire.read();

    // Disabling this does not help
    if (pwm)
      analogWrite(byteIN, value);
    else
      digitalWrite(byteIN, value);
  }
}

// This function keeps working after the other failed.
void requestEvent() {
  if (request < A0) {
    // Disabling this does not help
    byte value = digitalRead(request);

    Wire.write(&value, 1);
  } else {
    // Disabling this does not help
    int value = analogRead(request);

    Wire.write((char*)&value, 2);
  }
}

现在我无法访问Pi上的代码。但如果需要,我可以在这里发布。

Pi要求每20分钟进行一次读取。

我的想法已经不合时宜了......

1 个答案:

答案 0 :(得分:0)

我不是专家,但Wire中有一项功能可以检查是否有可读的内容:

String DecodeUri()
{
  String ret = "";
  while (1 < Wire.available())
  {
     ret += (char)Wire.read();
  }
    ret += (char)Wire.read();
 return ret;
}

除此之外,您可以查看许多人如何查看是否可以阅读。

另一个奇怪的事情是,如果我使用的电池电量不是很大,那么I2C会很奇怪。