о том, как записать данные во весь EEprom?

Я соединил AT24c1024 EEprom с ATmega32.AT24c1024, который имеет 512 страниц по 256 байт каждая. Существует два режима записи (запись байта и запись страницы).

В режиме записи страницы он может записывать 256 байт на страницу; если мы хотим записать 258 байт, то первые два байта в начале этой страницы будут перезаписаны.

Мой вопрос: что я должен сделать, чтобы записать во всю EEprom (т.е.) если я хочу записать 300 байт, я хочу записать 256 байт на странице, затем перейти к следующей странице и так далее?

, 👍1


1 ответ


Лучший ответ:

1

В этом случае вы пишете две страницы, первая страница содержит первые 256 байтов, а вторая страница содержит следующие 34 байта.

Вы можете проверить скорость, чтобы увидеть, быстрее ли запись 34 байтов второй страницы с использованием байтовой записи, но я сомневаюсь в этом.

Если вы хотите сохранить со второй страницы оставшиеся 34 байта (последующие 256-34 байта), вы сначала прочитаете вторую страницу, затем измените первые 34 байта, а затем запишите их обратно.

Также обратите внимание, что существует ограничение на количество записей на странице. Это называется ношение страницы. Так что, если вы пишете эти 2 страницы очень часто, вы можете придумать алгоритм для циклического перебора всех доступных страниц в вашем EEPROM, а не записи каждый раз на одни и те же 2 страницы.

ПРИМЕР

Предположим, вы хотите написать totalBytesToWrite:

// Рассчитываем количество страниц для записи, округляем в большую сторону.
int pagesToWrite = int((totalBytesToWrite + 255) / 256;

for (int page = 0; page < pagesToWrite; page++) // Текущая страница для записи
{
    // Подсчитаем количество байтов, которое нужно записать на этой странице, для последней страницы запишем оставшиеся байты, иначе 256
    int pageBytesToWrite = (page == pagesToWrite - 1 ? totalBytesToWrite % 256 : 256; 

    // Запись страницы (кстати, я не знаю, что означает второй аргумент char deviceAddress)
    page_write(n / 256, ??, &memory[n], pageBytesToWrite);
}
,

Уважаемый сэр, я хочу использовать режим записи страницы, когда я использую его для записи 300 байт, он запишет первые 256 байт на этой странице, а затем перезапишет первые 34 байта на той же странице, чтобы записать остальные 34 байта. ..мой вопрос..как дальше писать эти 34 байта на следующей странице?, @mohamed

Если вы перезапишете 34 байта на той же странице, вы потеряете ранее записанные 256 байт (это то, что вы хотите?) ... в функции записи данных на страницу я думаю, есть номер страницы, можете дать ссылку API (функций) для этой EEPROM (библиотеки, которую вы используете)?, @Michel Keijzers

Функция, содержащая начальный адрес, с которого вы хотите писать..., @mohamed

Написать "к" вы имеете в виду?, @Michel Keijzers

Адрес, с которого вы хотите начать запись данных, @mohamed

Можете ли вы дать мне ссылку на библиотеку, которую вы используете?, @Michel Keijzers

void page_write (длинный начальный_адрес_памяти без знака, char device_address, char x[],int len){ беззнаковый длинный темп; temp=начальный_адрес_памяти>>8; temp >>=8;//осталось P0 тви_старт(); twi_write_address(device_address|(((unsigned char)temp)<<1)); twi_write_data (начальный_адрес_памяти>>8); twi_write_data (начальный_адрес_памяти); for(int i=0;i<len;i++) {twi_write_data(x[i]); _delay_ms(10);} twi_stop(); }, @mohamed

Так что я предполагаю, что start_memory_address должен быть установлен в 0 при записи на первую страницу, и 256 при записи на вторую страницу... более подробно должна рассказать документация библиотеки., @Michel Keijzers

Означает ли это, что я должен сделать условие, если количество байтов больше 256, тогда начальный_адрес_памяти должен быть увеличен на 255?, @mohamed

Я бы сделал цикл for, перебирая каждые 256 байтов и записывая страницу за страницей, увеличивая адрес для записи (в EEPROM) и исходную память (данные, которые вы хотите сохранить) на одно и то же значение итератора., @Michel Keijzers

ОК .. не могли бы вы написать мне простой псевдокод для этого ... спасибо, @mohamed

Я пробовал (но не могу проверить, так как у меня нет ни библиотеки, ни EEPROM)., @Michel Keijzers

Спасибо, сэр.... Я очень благодарен вам....мой привет..., @mohamed

Не за что ... вы можете проголосовать и принять ответ, если он помог, пожалуйста. (рядом с моим ответом находится цифра (0) и стрелка вверх и вниз. Нажимая стрелку вверх, вы голосуете за ответ (это означает, что он полезен) или против (если это плохой ответ). В случае нескольких ответов вы можете «принять» один ответ, который решает вашу проблему, нажав кнопку «принять ответ» (или аналогичный текст)., @Michel Keijzers