Не работает FM24I2C

Всем привет, решил попробовать микросхемку памяти FM24I2C, просидел пару дней и не могу понят почему она не работает, код вроде простой, но не работает.
Сам код, полный:

#include <Wire.h>
#include <avr/wdt.h>
#define disk1 0x50
void scan()
  {  byte error, address;
  int nDevices;
  Serial1.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial1.print("I2C device found at address 0x");
      if (address<16)
        Serial1.print("0");
      Serial1.print(address,HEX);
      Serial1.println("  !");
      nDevices++;
    }
    else if (error==4)
    {
      Serial1.print("Unknown error at address 0x");
      if (address<16)
        Serial1.print("0");
      Serial1.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial1.println("No I2C devices found\n");
  else
    Serial1.println("done\n");
  }
// -------------- функции чтение-запись ------------

void FM24C_write_byte(byte disk, byte byteAddress, byte data) { // disk: 0x50-0x57,
  Wire.beginTransmission(disk);
  Wire.write(byteAddress);
  Wire.write(data);
  Wire.endTransmission();
  delay(1);
}

byte FM24C_read_byte(byte disk, byte byteAddress ) {
  byte rdata;
  Wire.beginTransmission(disk);
  Wire.write(byteAddress);
  Wire.endTransmission();
  Wire.requestFrom(disk, 1);
  if (Wire.available()) rdata = Wire.read();
  return rdata;
}
void setup()
{
  wdt_enable(WDTO_2S);
  Wire.begin();
  Serial1.begin(9600);
  Serial1.println("RESTART");
  //Запись в wire
  FM24C_write_byte(disk1, 0, 20);
  FM24C_write_byte(disk1, 1, 21);
  FM24C_write_byte(disk1, 2, 22);
  FM24C_write_byte(disk1, 255, 15);
}
void loop()
{
  delay(1000);
  scan();
  Serial1.println(FM24C_read_byte(disk1, 0));
  Serial1.println(FM24C_read_byte(disk1, 1));
  Serial1.println(FM24C_read_byte(disk1, 2));
  Serial1.println(FM24C_read_byte(disk1, 255));
  wdt_reset();
  Serial1.println("OK"); 
}

На выводе:

23:56:33.651 -> Scanning...
23:56:33.651 -> I2C device found at address 0x50  !
23:56:33.682 -> I2C device found at address 0x68  !
23:56:33.748 -> done
23:56:33.748 -> 
23:56:33.748 -> 0
23:56:33.748 -> 0
23:56:33.748 -> 0
23:56:33.748 -> 0
23:56:33.748 -> OK

Это она, на 0x68 часы DS3231, но они тут не используются

у 24 серии цикл записи вроде 5 мс…он не успевает возможно

Осликом, вижу что данные пролетают по SCL и SDA, может быть микра не рабочая или все же в коде ошибка?

задержку я тоже пробовал, изменений никаких

Может и там и там подтяжка, многовато для шины?

50 строка

Wire.endTransmission(false); // Stop не нужен
И адрес внутри микросхемы разве не 2 байта ? Ссылка на ДШ конкретного чипа есть ?
Вы решили написать код короче чем тут - FM24I2C/FM24I2C.cpp at master · nw-wind/FM24I2C · GitHub ?

4,7 ком всего на каждой шине, по одному резистору

Точно byte? По идее, должно быть uint16_t

код взят отсюда https://forum.amperka.ru/threads/%D0%A1%D0%BE%D0%B2%D0%B5%D1%82%D1%83%D1%8E-%D0%B4%D0%B5%D1%82%D0%B0%D0%BB%D1%8C%D0%BA%D1%83-eeprom-fram.16761/page-3

И как вы собрались 8К8 одним байтом адресовать ?
конец 6 и 8 страниц - диаграммы записи и чтения по конкретному адресу.
Адрес - 2 байта и Stop при чтении после выставления адреса ячейки не нужен !

1 лайк

спасибо, буду разбираться, думал код на форуме рабочий

Добавьте false в 50 строке и Wire.write(0); перед Wire.write(byteAddress); в двух местах.
Должно заработать в пределах 256 байт.

1 лайк

Спасибо большое, заработало, дальше разберусь, очень помогли

На старом форумы выкладывал функцию чтения и записи Фрам для атмеги328 без использования Wire.h - всего 400 байт

1 лайк

файл keywords:

#######################################
# Syntax Coloring Map for FM24_Mini
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################
FM24_Mini	KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
twi_start	KEYWORD2
transmit_byte_I2C	KEYWORD2
receive_byte_I2C	KEYWORD2
FM24C_write	KEYWORD2
FM24C_read	KEYWORD2

#######################################
# Constants (LITERAL1)
#######################################

Спасибо, не находил

Как то по индусски написано.)

Примеры?