2017-06-06 213 views
0

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

I2C写入也不会显示在我的I2C调试器中。

I2c Debug trace

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

“写I2C”总是给出相同的值,并它似乎总是直接撞上。

+0

与您的问题无关,但'wrBuf'是一个指针,这意味着您应该使用['(s)printf'](http://en.cppreference.com/w/c/io/fprintf)格式' “%p”'。使用不匹配的格式说明符和参数类型会导致*未定义的行为*。此外,编译器和标准库的所有作用域中都保留以下划线开头且后跟大写字母的符号。不要自己定义这些符号,即使是预处理器宏。 –

+0

什么是您的EEPROM芯片类型?它是一个字节还是两个字节的地址集成电路?你的代码只处理一个字节的地址。可能是造成这个问题。或者,正如已经指出的那样,这个问题可能与滥用'sprintf'函数有关。 – putu

+0

注意这些eeproms需要总是命令“写入启用”,然后是真正的写入,然后是命令“写入禁止” – Yoan

回答

0

错误似乎设在环路输出

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); 
} 

我注意到,我被检查我<块大小(从阅读部分复制)现在我跑进一些其他(小)问题,但这解决了我遇到的问题。