Irinka
18.Август.2023 18:38:09
1
Здравствуйте.
Хочу разобраться с микросхемой памяти 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 байт?
Irinka
18.Август.2023 19:09:05
2
“За раз” можно записать максимально 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);
}
Green
18.Август.2023 19:23:05
3
Вы когда научитесь “ЧЛЕНОРАЗДЕЛЬНО” выражаться? Не первый день замужем, небось?
Green
18.Август.2023 19:24:42
4
“За раз” можно записать максимально 30 байт…
Кому можно? Проблема в чём?
Irinka
18.Август.2023 19:35:34
5
По “умолчанию” в ячейке памяти микросхемы находится число 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("");
}
}
Или я неправильно делаю?
Green
18.Август.2023 19:40:58
6
Ну вы должны следить за границами страницы. 128 байт у 24с512 только. А больше и ничего.
1 лайк
Irinka
18.Август.2023 19:49:13
7
Не поняла, честно говоря.
6-2
Запись от 0 до 127
У буфера Wire размер 30 байт. Так за раз оно и пишет.
1 лайк
Нет. R/W посылает библиотека, в зав-ти от операции. А вход WP на микросхеме - защита от записи (Write Protect), его надо выставить аппаратно.
1 лайк
Irinka
19.Август.2023 07:00:56
12
Поняла. Спасибо.
Но позже ещё будут вопросы…)
Green
19.Август.2023 07:53:26
13
Ну вот. Если библиотеки используете, желательно и с ними слегка подразобраться, дабы понимать чего они делают, как работают. Иначе так очень долго можно гадать почему пишутся 30 байт из 40-ка…
Irinka
19.Август.2023 18:18:45
16
Мне необходимо записывать и читать тип 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 в память без ардуино.
Из оборудования только
//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() {}
Записать откуда?
Из файла(в каком формате, где хранится)?
Из другого устройства?
Irinka
20.Август.2023 08:51:54
19
Сейчас все числа, которые нужно записать, хранятся в экселе.
В какой формат нужно конвертировать и как записать?
Для программатора нужен формат .BIN
Irinka
20.Август.2023 09:02:48
21
А я то думаю, как же…а тут переименовать .xlsx в .bin )))))))) (сарказм)
Передавать через сериал в ардуино из сторонней программы “поштучно” как-то долговато и глупо.
Я в ожидании…))))