У меня EEPROM контроллер FT5316 с интерфейсом i2c slave mode. По спецификации, я должен отправить 6бит адреса, затем еще бит - флаг чтения/записи. Нашел простой способ читать с девайса данные: Код (Text): #include <Wire.h> void setup() { Wire.begin(); // join i2c bus (address optional for master) Serial.begin(9600); // start serial for output } int i=56; void loop() { //Serial.print(i); //Serial.print(": "); Wire.requestFrom(i, 64); // request 64 bytes from slave device int r=0; while(Wire.available()) // slave may send less than requested { r++; char c = Wire.read(); // receive a byte as character Serial.print(c,HEX); // print the character } if(r>0)Serial.println(" "); delay(1000); } Где 56 - адрес, найденный перебором. Этот код выдает 16 нулевых байт. Вот мне не понятно, реальные ли это данные.. Даташит здесь: http://wenku.baidu.com/view/51ad225c69eae009581becb8.html
У меня EEPROM контроллер FT5316 с интерфейсом i2c slave mode. По спецификации, я должен отправить 6бит адреса, затем еще бит - флаг чтения/записи. Нашел простой способ читать с девайса данные: Код (Text): #include <Wire.h> void setup() { Wire.begin(); // join i2c bus (address optional for master) Serial.begin(9600); // start serial for output } int i=56; void loop() { //Serial.print(i); //Serial.print(": "); Wire.requestFrom(i, 64); // request 64 bytes from slave device int r=0; while(Wire.available()) // slave may send less than requested { r++; char c = Wire.read(); // receive a byte as character Serial.print(c,HEX); // print the character } if(r>0)Serial.println(" "); delay(1000); } Где 56 - адрес, найденный перебором. Этот код выдает 16 нулевых байт. Вот мне не понятно, реальные ли это данные.. Даташит здесь: http://wenku.baidu.com/view/51ad225c69eae009581becb8.html
Да, по идее вообще лучше использовать Wire.write(), чтобы передать управляющие биты, а затем что-то читать. Насколько понимаю, мне нужно подключиться к EEPROM по адресу, который нашел, а затем передать (записать) адрес например 0x0, затем флаг и потом сразу читать (чтобы сдампить определенный кусок или байт)? Нашел пример подходящий, попробую вечерком https://www.pjrc.com/teensy/td_libs_Wire.html Только непонятно, как можно передать именно 7 бит Или просто писать байт, а контроллер сожрет сколько надо?
Добавьте в setup() вызов Wire.begin() и Wire.beginTransmission(), Wire.endTransmission() в начале и конце обмена данными с устройством. В противном случае библиотека Wire не будет работать корректно.
Теперь делаю так: Код (Text): #include <Wire.h> #define DEV_ADDR 0x38 void setup() { Wire.begin(); Serial.begin(9600); } void loop() { byte num; Wire.beginTransmission(DEV_ADDR); Wire.write(0); // address byte Wire.endTransmission(); // read 1 byte, from address 0 Wire.requestFrom(DEV_ADDR, 1); while(Wire.available()) { num = Wire.read(); } Serial.print("num = "); Serial.println(num, DEC); // increment num num = num + 1; // write "num" to 24C256 eeprom at address zero Wire.beginTransmission(DEV_ADDR); Wire.write(0); // address byte Wire.write(num); // any more send starts writing Wire.endTransmission(); // next time loop runs, it should retrieve the // same number it wrote last time... even if you // shut off the power delay(1000); } И все равно не пишется, при чем WAKE пин замыкал как на землю, так и на V+
Нашел библиотеку для похожего девайса, прогнал запись-чтение, все равно нули.. https://github.com/adafruit/Adafruit_FT6206_Library/blob/master/Adafruit_FT6206.cpp