Может так случиться, что для реализации «великих идей» не хватит того килобайта EEPROM, что скрыт в недрах ATmega328 🙁 … не стоит отчаиваться, «буржуи» давно придумали внешнее хранилище для бесценных данных. Существует множество реализаций таких микросхем, они отличаются организацией, объемом, интерфейсом. Наверно, наиболее массовым семейством «пзу-шек» являются микросхемы, имеющие в обозначении символы «24С». Это электрически стираемое перепрограммируемое ПЗУ с интерфейсом I2C.
Таких микросхем великое множество и найти их описание нетрудно. Не вдаваясь в хитрости устройства, внешне в общем случае микросхема выглядит так:
Здесь: питание подаем на VCC (обычно от 1,6В до 5,5В), VSS — это «земля».
SCL и SDA — это шина I2C (Clock и Data);
WC (Write Control) — это вход для «защиты» от случайной записи — редко когда нужный вывод — его надо либо оставить свободным, либо «посадить» на землю — в противном случае произвести запись данных в микросхему не удастся.
Три входа Е0-Е2 (в некоторых исполнениях их может и не быть) — Chip Enable — входы выбора микросхемы. Комбинация сигналов на них определяет адрес микросхемы на шине I2C. Именно эта комбинация должна быть в битах b1-b3 7-битного кода выбора устройства:
Входы можно оставить «висящими в воздухе» — это воспримется микросхемой как «0». Как видно из таблицы, адрес микросхемы в этом случае будет 0х50.
Как отмечено выше, емкость EEPROM может быть разной и узнать ее можно из цифр названия после «24С»: например в примере ниже 24C64 — это 64Кбит (именно бит! а не байт! как многим бы хотелось), т.е. 8КБайт.
Микросхему будем подключать к Arduino UNO. 
Питание (+5В) подаем на вывод 8 микросхемы, GND соединяем с 4. SDA (A4 Arduino UNO) к ножке 5, а SCL (A5 Arduino UNO) — к 6. Остальные «ножки» микросхемы оставляем не подключенными.
Корпус 24С64 имеет 8 ножек, выводы располагаются так, как показано на рисунке:
Программированием особенно не заморачиваемся — используем одну из многочисленных библиотек (берем с Github-a). Не забываем распаковать архив, убрать «master» из названия и папочку «\Eeprom24C32_64» укладываем в ..\Arduino\libraries. Для проверки берем стандартный пример WriteReadByte из примеров библиотеки (привожу код примера — тут я убрал комментарии):
/****************************************************************** * \brief EEPROM 24C32 / 24C64 library for Arduino - Demonstration * \author Copyright (C) 2012 Julien Le Sech - www.idreammicro.com * \version 1.0 * \date 20120218 *******************************************************************/ #include <Wire.h> #include <Eeprom24C32_64.h> #define EEPROM_ADDRESS 0x50 static Eeprom24C32_64 eeprom(EEPROM_ADDRESS); void setup() { // Initialize serial communication. Serial.begin(9600); // Initialize EEPROM library. eeprom.initialize(); const word address = 0; // Write a byte at address 0 in EEPROM memory. Serial.println("Write byte to EEPROM memory..."); eeprom.writeByte(address, 0xAA); // Write cycle time (tWR). See EEPROM memory datasheet for more details. delay(10); // Read a byte at address 0 in EEPROM memory. Serial.println("Read byte from EEPROM memory..."); byte data = eeprom.readByte(address); // Print read byte. Serial.print("Read byte = 0x"); Serial.print(data, HEX); Serial.println(""); } void loop() { }
Код прост: используем стандартную библиотеку для I2C из Wire и скачанное выше.
Определяем адрес микросхемы 0х50 — см.выше — так определено на выводах Е0-Е2.
Далее после инициализации микросхемы
eeprom.initialize();
(где, собственно, выполняется только вызов процедуры Wire.begin();), пишем по нулевому адресу байт 0хАА.
eeprom.writeByte(address, 0xAA);
Потом читаем эту ячейку
byte data = eeprom.readByte(address);
и выводим прочитанное на экран. Если увидим 0хАА — значит все работает нормально.
Так оно и случилось…
Пример простейший, описывает лишь побайтную запись/чтение EEPROM. На самом деле микросхема имеет более развитую структуру команд, но для большинства несложных задач — этого достаточно.
!!!ВНИМАНИЕ. Как известно, «флешки» не отличаются уж очень высокой скоростью записи информации… Так и в EEPROM 24Cxxx — есть такой параметр Internal write cyrcle. Длительность цикла записи отличается в разных микросхемах. «С запасом» можно брать его равным 10мс (бывают микросхемы и 5мс). Цикл запускается после получения всей информации о записываемых данных (адрес ячейки и байт данных). Во время записи микросхема игнорирует запросы.
Здравствуйте. Как можно с вами связаться?
оставьте сообщение здесь