Arduino Uno FT24C256A

skeef
Offline
Зарегистрирован: 29.01.2019

Всех приветствую!

Сабж
Использую библиотеку

#include <Arduino.h>
#include <Wire.h>
#include <EEEPROM.h>

#define EEPROM_I2C_ADDRESS  0x50

EEEPROM eMem;

bool saveData = false;
int addr=0;

void setup() {
  Wire.begin();
  Serial.begin(9600);

  onMem();

if(saveData) {
  byte dataA[] = {  1, 2, 3, 4, 5, 6, 7, 8,
                   9,10,11,12,13,14,15,16,
                  17,18,19,20,21,22,23,24,
                  25,26,27,28,29,30,31,32
                },
      dataB[] = { 33,34,35,36,37,38,39,40,
                  41,42,43,44,45,46,47,48,
                  49,50,51,52,53,54,55,56,
                  57,58,59,60,61,62,63,64
                },
      dataC[] = { 65,66,67,68,69,70,71,72,
                  73,74,75,76,77,78,79,80,
                  81,82,83,84,85,86,87,88,
                  89,90,91,92,93,94,95,96
                };

Serial.println("Memory written from: " + String(addr) + " dataA");

  eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataA, 32); // write to EEPROM
  delay(200);
  addr +=31;
  Serial.println("Memory written from: " + String(addr) + " dataB");
  eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataB, 32); // write to EEPROM
  delay(200);
  addr +=31;
  Serial.println("Memory written from: " + String(addr) + " dataC");
  eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataC, 32); // write to EEPROM

    delay(100);
  Serial.println("Memory written");
}
else {  
  Serial.println("READ ONLY");
}
  addr = 0;

  while (addr < 100)
  {
        Serial.print(addr, HEX);
        Serial.print(": ");
        Serial.println(eMem.i2c_eeprom_read_byte(EEPROM_I2C_ADDRESS, addr), HEX);     
        addr++; 
  }

}
void loop() {
}

Вот что читаю (сгруппировал для єкономии места):

 0: 43    1: 44    2: 45     3: 46    4: 47    5: 48    6: 49    7: 4A
 8: 4B    9: 4C    A: 4D     B: 4E    C: 4F    D: 50    E: 51    F: 52
10: 53   11: 54   12: 55    13: 56   14: 57   15: 58   16: 59   17: 5A
18: 5B   19: 5C   1A: 5D    1B: 5E   1C: 1D   1D: 1E   1E: FF   1F: 21
20: 22   21: 23   22: 24    23: 25   24: 26   25: 27   26: 28   27: 29
28: 2A   29: 2B   2A: 2C    2B: 2D   2C: 2E   2D: 2F   2E: 30   2F: 31
30: 32   31: 33   32: 34    33: 35   34: 36   35: 37   36: 38   37: 39 
38: 3A   39: 3B   3A: 3C    3B: 3D   3C: 3E   3D: 3D   3E: 41   3F: 42
40: FF   41: FF   42: 41    43: 42   44: 43   45: 44   46: 45   47: 46 
48: 47   49: 48   4A: 49    4B: 4A   4C: 4B   4D: 4C   4E: 4D   4F: 4E
50: 4F   51: 50   52: 51    53: 52   54: 53   55: 54   56: 55   57: 56
58: 57   59: 58   5A: 59    5B: 5A   5C: 5B   5D: 5C   5E: 5D   5F: 5E
60: FF   61: FF   62: FF    63: FF

Что я делаю не так?

Спасибо всем

sadman41
Offline
Зарегистрирован: 19.10.2016

Помнится мне такое, что у Wire буфер в 32 байта на все, а не столь о на данные.

skeef
Offline
Зарегистрирован: 29.01.2019

Походу вы правы!

  byte dataA[] = {  1, 2, 3, 4, 5, 6, 7, 8,
                   9,10,11,12,13,14,15,16,
                  17,18,19,20,21,22,23,24
                },
      dataB[] = {
                  25,26,27,28,29,30,31,32,
                  33,34,35,36,37,38,39,40,
                  41,42,43,44,45,46,47,48
                },
      dataC[] = {
                  49,50,51,52,53,54,55,56,
                  57,58,59,60,61,62,63,64,
                  65,66,67,68,69,70,71,72
                },
      dataD[] = { 73,74,75,76,77,78,79,80,
                  81,82,83,84,85,86,87,88,
                  89,90,91,92,93,94,95,96
                };


  Serial.println("Memory written from: " + String(addr) + " dataA");

  eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataA, 24); // write to EEPROM
  delay(200);
  addr +=24;
  Serial.println("Memory written from: " + String(addr) + " dataB");
  eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataB, 24); // write to EEPROM
  delay(200);
  addr +=24;
  Serial.println("Memory written from: " + String(addr) + " dataC");
  eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataC, 24); // write to EEPROM
  delay(200);
  addr +=24;
  Serial.println("Memory written from: " + String(addr) + " dataD");
  eMem.i2c_eeprom_write_page(EEPROM_I2C_ADDRESS, addr, (byte *)dataD, 24); // write to EEPROM

Только осталась проблема с первыми 8 адресами:

  0: 41   1: 42   2: 43   3: 44   4: 45   5: 46   6: 47   7: 48
 8: 9    9: A    A: B    B: C    C: D    D: E    E: F    F: 10
10: 11  11: 12  12: 13  13: 14  14: 15  15: 16  16: 17  17: 18
18: 19  19: 1A  1A: 1B  1B: 1C  1C: 1D  1D: 1E  1E: 1F  1F: 20
. . .
4F: 50  50: 51  51: 52  52: 53  53: 54  54: 55  55: 56  56: 57
57: 58  58: 59  59: 5A  5A: 5B  5B: 5C  5C: 5D  5D: 5E  5E: 5F
5F: 60  60: FF

PS

Да, я работаю ... пытаюсь :) ... через TCA9548 - может в этом еще подводный камень

PPS

А пример из букваря нормально работает 

char somedata[] = "this is data from the eeprom";

i2c_eeprom_write_page(0x50, 0, (byte *)somedata, sizeof(somedata));

пишет с 0 адреса

sadman41
Offline
Зарегистрирован: 19.10.2016

Временно исключительно его и все будет ясно - он гадит или нет.

skeef
Offline
Зарегистрирован: 29.01.2019

Ничего не дало. Подтянул SDA и SCL 10к на 5В, поменял ардуину ... Завтра куплю новую 24С256 и попробую. Может сама память накрылась. Хотя нет же - текст нормально пишется в первые адреса

:(

sadman41
Offline
Зарегистрирован: 19.10.2016

Если текст пишется, то вместо текстовой строки в подсуньте свои данные. Чудес-то не бывает - или в функции записи ошибка или в процедуре вывода. Или адрес не тот.

В сущности-то цифири верные, только 0x40 чем-то накидывается к каждой.

skeef
Offline
Зарегистрирован: 29.01.2019

Попробовал писать побайтово - все числа от 0x00 до 0xFF пишутся нормально. Получается проблема в страничной записи.

Ищу "правильную" библиотеку

Спасибо за помощь :)

PS

Вот эта библиотека нормально сработала

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Между записью в различные страницы нужно выдержать паузу - по дэйташиту 5 мс. На практике меньше, но пауза все равно нужна.