Чтение/запись 24LC512

Здравствуйте.
Хочу разобраться с микросхемой памяти 24LC512 (даташит)

С формированием i2c адреса микросхемы и адреса ячейки всё понятно

Бит R/W как я поняла формируется автоматически в зависимости от 1 или 0 на входе WP ?

Функции чтения и записи
void write_to_emory(uint16_t adress, uint8_t val) {
  Wire.beginTransmission(I2C_ADRESS);
  Wire.write(adress >> 8);
  Wire.write(adress & 0xFF);
  Wire.write(val);
  Wire.endTransmission();
  delay(5);
}


void read_from_memory(uint16_t adress) {
  Wire.beginTransmission(I2C_ADRESS);
  Wire.write(adress >> 8);
  Wire.write(adress & 0xFF);
  Wire.endTransmission();
  Wire.requestFrom(I2C_ADRESS, 1);
  Serial.println(Wire.read());
}

“За раз” я могу записать до 127 байт?

“За раз” можно записать максимально 30 байт?

Спойлер
write_to_emory(0, 30, 11);
write_to_emory(30, 50, 22);

void write_to_emory(uint16_t adress, uint8_t count, uint8_t val) {
  Wire.beginTransmission(I2C_ADRESS);
  Wire.write(adress >> 8);
  Wire.write(adress & 0xFF);
  for (int i = adress; i < count; i++) {
    Wire.write(val);
  }
  Wire.endTransmission();
  delay(5);
}

Вы когда научитесь “ЧЛЕНОРАЗДЕЛЬНО” выражаться? Не первый день замужем, небось?

“За раз” можно записать максимально 30 байт…
Кому можно? Проблема в чём?

По “умолчанию” в ячейке памяти микросхемы находится число 255 (В протеусе)

void write_to_memory() {
  const uint16_t adress = 0;
  Wire.beginTransmission(I2C_ADRESS);
  Wire.write(adress >> 8);
  Wire.write(adress & 0xFF);
  for (int i = adress; i < 40; i++) {
    Wire.write(i);
  }
  Wire.endTransmission();
  delay(5);
}

Выбираю ячейку номер 0
Записываю 40 байт
Пишутся только 30 байт

И прочитать, получается, аналогично

void read_from_memory(uint16_t adress) {
  Wire.beginTransmission(I2C_ADRESS);
  Wire.write(adress >> 8);
  Wire.write(adress & 0xFF);
  Wire.endTransmission();
  Wire.requestFrom(I2C_ADRESS, 30);
  static uint8_t count = 0;
  while (Wire.available()) {
    Serial.print("Adress - ");
    Serial.print(count++);
    Serial.print(" Val = ");
    Serial.print(Wire.read());
    Serial.println("");
  }
}

Или я неправильно делаю?

Ну вы должны следить за границами страницы. 128 байт у 24с512 только. А больше и ничего.

1 лайк

Не поняла, честно говоря.


6-2
Запись от 0 до 127

Это Вы про ?
image

У буфера Wire размер 30 байт. Так за раз оно и пишет.

1 лайк
  1. 2 байта отжирает адрес, в остальные 30 пиши что хочешь.

Нет. R/W посылает библиотека, в зав-ти от операции. А вход WP на микросхеме - защита от записи (Write Protect), его надо выставить аппаратно.

1 лайк

Поняла. Спасибо.
Но позже ещё будут вопросы…)

Ну вот. Если библиотеки используете, желательно и с ними слегка подразобраться, дабы понимать чего они делают, как работают. Иначе так очень долго можно гадать почему пишутся 30 байт из 40-ка…

Оптимистка! :slight_smile:

Мне необходимо записывать и читать тип uint32_t
На старом форуме нашла как записывать/читать в EEPROM
Как понимать данные строки, как происходит конвертация uint32_t в массив uint8_t temp?

(uint32_t &)temp = number;
uint32_t &number = (uint32_t &)temp;

В микросхема 64 кБ, значит поместится 16384 переменных типа uint32_t (64*1024/4)
Для организации записи в последнюю свободную ячейку памяти, необходимо хранить адрес последней занятой ячейки?
То есть первая запись в 0 ячейку, вторая запись в 4 и т.д.
А для организации поиска, аналогично, проверять с 0 ячейки до последней записанной,
0,4,8,12…Такой принцип?
Ииии уж сразу ещё вопрос.
Как записать большое количество переменных uint32_t в память без ардуино.
Из оборудования только
image

//24LC512 512 килоБит = 64 килоБайт
//64 * 1024 = 65536 Байт
#include <Wire.h>
#define I2C_ADRESS 0x50

void setup() {
  Wire.begin();
  Serial.begin(9600);
  write_number(0, 123456789);
  read_number(0);
}

void write_number(uint16_t adress, uint32_t number) {
  uint8_t temp[4];
  (uint32_t &)temp = number;
  Wire.beginTransmission(I2C_ADRESS);
  Wire.write(adress >> 8);
  Wire.write(adress & 0xFF);
  for (uint8_t i = 0; i < 4; i++) Wire.write(temp[i]);
  Wire.endTransmission();
  delay(50);
}

void read_number(uint16_t adress) {
  uint8_t temp[4];
  uint8_t count = 0;
  Wire.beginTransmission(I2C_ADRESS);
  Wire.write(adress >> 8);
  Wire.write(adress & 0xFF);
  Wire.endTransmission();
  Wire.requestFrom(I2C_ADRESS, 4);

  while (Wire.available()) {
    temp[count++] = Wire.read();
  }
  uint32_t &number = (uint32_t &)temp;
  Serial.println(number);
}


void loop() {}

Программатором

Записать откуда?
Из файла(в каком формате, где хранится)?
Из другого устройства?

Сейчас все числа, которые нужно записать, хранятся в экселе.
В какой формат нужно конвертировать и как записать?

Для программатора нужен формат .BIN

А я то думаю, как же…а тут переименовать .xlsx в .bin )))))))) (сарказм)
Передавать через сериал в ардуино из сторонней программы “поштучно” как-то долговато и глупо.

Я в ожидании…))))