Работаем с внешней EEPROM (24C64)

Может так случиться, что для реализации «великих идей» не хватит того килобайта EEPROM, что скрыт в недрах ATmega328 🙁 … не стоит отчаиваться, «буржуи» давно придумали внешнее хранилище для бесценных данных. Существует множество реализаций таких микросхем, они отличаются организацией, объемом, интерфейсом. Наверно, наиболее массовым семейством «пзу-шек» являются микросхемы, имеющие в обозначении символы «24С». Это электрически стираемое перепрограммируемое ПЗУ с интерфейсом I2C.24C64WP-image

Таких микросхем великое множество и найти их описание нетрудно. Не вдаваясь в хитрости устройства, внешне в общем случае микросхема выглядит так:24C64WPcx

Здесь: питание подаем на VCC (обычно от 1,6В до 5,5В), VSS — это «земля».

SCL и SDA — это шина I2C (Clock и Data);

WC (Write Control) — это вход для «защиты» от случайной записи — редко когда нужный вывод — его надо либо оставить свободным, либо «посадить» на землю — в противном случае произвести запись данных в микросхему не удастся.

Три входа Е0-Е2 (в некоторых исполнениях их может и не быть) — Chip Enable — входы выбора микросхемы. Комбинация сигналов на них определяет адрес микросхемы на шине I2C. Именно эта комбинация должна быть в битах b1-b3 7-битного кода выбора устройства:24C64WPtb3

Входы можно оставить «висящими в воздухе» — это воспримется микросхемой как «0». Как видно из таблицы, адрес микросхемы в этом случае будет 0х50.

Как отмечено выше, емкость EEPROM может быть разной и узнать ее можно из цифр названия после «24С»: например в примере ниже 24C64 — это 64Кбит (именно бит! а не байт! как многим бы хотелось),  т.е. 8КБайт.

Микросхему будем подключать к Arduino UNO. DSCF1386

Питание (+5В) подаем на вывод 8 микросхемы, GND соединяем с 4. SDA (A4 Arduino UNO) к ножке 5, а SCL (A5 Arduino UNO) — к 6. Остальные «ножки» микросхемы оставляем не подключенными.arduino_24c64

Корпус 24С64 имеет 8 ножек, выводы располагаются так, как показано на рисунке:24C64WPpin

Программированием особенно не заморачиваемся — используем одну из многочисленных библиотек (берем с 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хАА — значит все работает нормально.24C64WPcom

Так оно и случилось…

Пример простейший, описывает лишь побайтную запись/чтение EEPROM. На самом деле микросхема имеет более развитую структуру команд, но для большинства несложных задач — этого достаточно.

!!!ВНИМАНИЕ. Как известно, «флешки» не отличаются уж очень высокой скоростью записи информации… Так и в EEPROM 24Cxxx — есть такой параметр Internal write cyrcle. Длительность цикла записи отличается в разных микросхемах. «С запасом» можно брать его равным 10мс (бывают микросхемы и 5мс). Цикл запускается после получения всей информации о записываемых данных (адрес ячейки и байт данных). Во время записи микросхема игнорирует запросы.

Работаем с внешней EEPROM (24C64): 2 комментария

Добавить комментарий

Ваш e-mail не будет опубликован.

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".