【问题标题】:Arduino stops responding after writing to I2CArduino 在写入 I2C 后停止响应
【发布时间】:2017-06-06 09:55:06
【问题描述】:

我目前正在尝试通过 I2C 写入 EEPROM。阅读顺利,我获得了出色的吞吐量。但是,当我尝试写入设备时,Arduino 停止响应,我必须重置它才能让它再次工作。

I2C 写入也没有显示在我的 I2C 调试器中。

void i2cWrite(unsigned char device, unsigned char memory, const char *wrBuf, unsigned short len) {
  int i = 0;
  ushort bytesWritten = 0;
  ushort _memstart = memory;
  ushort blockSize = 4;
  #ifdef DEBUG_MSGS
  char serialBuf[255] = { '\0'};
  Serial.print("Writing To i2c: ");
  sprintf(serialBuf, "%p", wrBuf);
  Serial.println(serialBuf);
  #endif //DEBUG_MSGS
  while (bytesWritten < len) {
    Wire.beginTransmission((int)device);
    Wire.write((unsigned char)_memstart);
    for (int j = 0; i < blockSize; j++) {
      Wire.write(wrBuf[bytesWritten + j]);
    }
    Wire.endTransmission();
    bytesWritten += blockSize;
    _memstart += blockSize;
    delay(25);
  }
  #ifdef DEBUG_MSGS
  Serial.println("\mDone writing.");
  #endif //DEBUG_MSGS
}

我很不确定自己做错了什么。我通过串行连接得到以下输出:

收到写请求:安迪

写入 i2c:0xa800fd98

“Writing to i2c”总是给出相同的值,而且它似乎总是在之后立即崩溃。

【问题讨论】:

  • 与您的问题无关,但wrBuf 是一个指针,这意味着您应该使用(s)printf 格式"%p"。使用不匹配的格式说明符和参数类型会导致未定义的行为。此外,以下划线后跟大写字母的符号在编译器和标准库的所有范围内都保留。不要自己定义这样的符号,即使作为预处理器宏。
  • 你的 EEPROM 芯片类型是什么?是一个字节还是两个字节地址IC?您的代码仅处理一个字节地址。可能是导致问题的原因。或者,正如已经指出的,问题可能与滥用sprintf 函数有关。
  • 请注意,这些 eeprom 始终需要命令“write enable”,然后是真正的写入,然后是命令“write disable”
  • Eeprom 芯片采用 7 位地址,这应该是一个透明的接口。调用该函数的代码中先写了eeprom密码

标签: c++ arduino


【解决方案1】:

错误似乎位于循环中,因为输出是

Write Request Received: Andy
Writing To i2c: 0xa800fd98

I'm working here
I wrote the memory adress
I wrote a byte of data
I wrote a byte of data
I wrote a byte of data
I wrote a byte of data
I wrote a byte of data
....

这似乎无止境地继续下去。

在添加了一些调试语句并更改了点之后,一些程序员老兄注意到了

{
    Wire.beginTransmission((int)device);
    Serial.println("I'm working here");
    Wire.write((unsigned char)_memstart);
    Serial.println("I wrote the memory adress");
    for (int j = 0; j < blockSize; j++) {
        Wire.write(wrBuf[bytesWritten + j]);
        Serial.println("I wrote a byte of data");
        //Serial.write(wrBuf[bytesWritten + j]);
    }
    Wire.endTransmission();
    Serial.println("I ended the transmission");
    bytesWritten += blockSize;
    _memstart += blockSize;
    delay(25);
}

我注意到我正在检查 I

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2022-08-09
    • 1970-01-01
    相关资源
    最近更新 更多