2017-06-06 58 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); 
} 

我注意到,我被檢查我<塊大小(從閱讀部分複製)現在我跑進一些其他(小)問題,但這解決了我遇到的問題。