ARDUINO EEPROM по I2C шине.

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,652
409
Москва
Возникла необходимость работать с такой вот связкой. Я пользовался довольно известным руководством от Nick Gammon
При подключении не возникло проблем, тестовая сборка работала отлично, но при модификации начали возникать проблемы... сначала пропадали каждые 16-ые измерения. они просто не записывались на память. Потом стал как то не так читаться файл настроек. Входе разбирательств выявил такую проблему. Память состоит из страниц по 32, 64 байта, может еще по каким , пока не встречал. И если при записи данных в память встречается переход страницы, то все, данные следующей страницы пропадут или запишутся неверно. С чтением вроде бы не видел проблем. Тестировал.

Код ниже позволяет записывать данные в память , проверяя на стык страниц. работает. В функции надо указать по порядку : адрес устройства, начальный адрес записи, данные, длину данных и размер страницы. Может кому пригодиться. Я искал не долго, но те описания работы , что видел об этом умалчивают.

C++:
void MyWriteData(byte device, unsigned int addr, byte * data, byte len, byte mpage )
{
  uint16_t p1, p2;
  p1 = addr / mpage;
  p2 = (addr + len - 1) / mpage;
  if (p1 == p2)
  {
    Wire.beginTransmission(device);
    Wire.write((int)(addr >> 8));
    Wire.write((int)(addr & 0xFF));
    Wire.write(data,len);
    Wire.endTransmission();
    delay(10);
  }
  else
    {
    int lmal=p2*mpage-addr;
    Wire.beginTransmission(device);
    Wire.write((int)(addr >> 8));
    Wire.write((int)(addr & 0xFF));
    Wire.write(data,lmal);
    Wire.endTransmission();
    delay(10);

    Wire.beginTransmission(device);
    Wire.write((int)((p2*mpage) >> 8));
    Wire.write((int)((p2*mpage) & 0xFF));
    Wire.write(&data[lmal],len-lmal);
    Wire.endTransmission();
    delay(10);
 
  };
}
 

kostyamat

★★★★★★✩
29 Окт 2019
1,602
775
Я тут библиотеку, типа сделал для at24c---
http://arduino.ru/forum/programmirovanie/eeprom-24c128-1024-universalnyi-instrument
Правда я потом в ней ошибочку нашел. Если нужна исправленную версию могу скинуть позже.
Пишет все подряд, не зависимо от типа и размера данных, при этом быстро, и работает с любым типом микрухи. Проверил на 24с32 до 24с512, главное правильно дефайны установить.
 

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,652
409
Москва
спасибо, но мне видимо уже не надо) я поставленную задачу решил, знаю что исправлял, что делал. Скорость устраивает, все работает.