о том, как записать данные во весь EEprom?
Я соединил AT24c1024 EEprom с ATmega32.AT24c1024, который имеет 512 страниц по 256 байт каждая. Существует два режима записи (запись байта и запись страницы).
В режиме записи страницы он может записывать 256 байт на страницу; если мы хотим записать 258 байт, то первые два байта в начале этой страницы будут перезаписаны.
Мой вопрос: что я должен сделать, чтобы записать во всю EEprom (т.е.) если я хочу записать 300 байт, я хочу записать 256 байт на странице, затем перейти к следующей странице и так далее?
@mohamed, 👍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);
}
- о том, как разделить один внешний последовательный EEprom с помощью двух микроконтроллеров?
- Скорость последовательной связи (UART) датчика выше, чем скорость обработки микроконтроллера.
- Последовательная связь между несколькими устройствами (или ардуино)
- Arduino EEPROM сохраняет старые данные после прошивки новой программой
- Проблемы с I2C и Wire.Available()
- Параллельная связь между несколькими Ардуино
- Как работает стирание EEPROM?
- Не получается читать из / писать в EEPROM
Уважаемый сэр, я хочу использовать режим записи страницы, когда я использую его для записи 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