
Микросхема AT24C04BN-SH-T от Microchip – это энергонезависимая память EEPROM с интерфейсом I²C, объёмом 4 Кбит (512 байт) и рабочим напряжением от 1.7 до 5.5 В. Она применяется в устройствах, где требуется хранение настроек, калибровочных данных или логов без потери информации при отключении питания. В отличие от аналогов, таких как 24LC04, эта модель имеет встроенную защиту от записи и аппаратный адресный пин A0, что позволяет подключать до двух микросхем на одной шине без конфликтов.
Для подключения потребуется минимум компонентов: микросхема, два резистора подтяжки (4.7–10 кОм) для линий SDA и SCL, и источник питания в пределах допустимого диапазона. Распиновка: VCC (питание), GND (земля), SDA (данные), SCL (тактовый сигнал), A0 (адресный вход), WP (защита записи). При использовании нескольких микросхем на шине A0 задаёт младший бит адреса (0x50 или 0x51). Линия WP, подключённая к VCC, блокирует запись, что полезно для защиты критичных данных.
Программирование начинается с инициализации I²C на микроконтроллере. Для Arduino используйте библиотеку Wire, для STM32 – HAL_I2C. Адрес устройства формируется как 0x50 | (A0 << 1). Запись байта выполняется командой Wire.write(address), где address – внутренний адрес памяти (0x00–0xFF для первого блока, 0x100–0x1FF для второго). Чтение требует отправки адреса, а затем повторного старта с командой чтения. Тайминги: максимальная тактовая частота – 400 кГц, время записи одного байта – до 5 мс.
Особенности: микросхема поддерживает постраничную запись (до 16 байт за транзакцию), но при превышении границы страницы данные перезаписываются с начала. Для надёжности используйте контрольные суммы или дублирование данных. При отладке проверяйте сигналы осциллографом – отсутствие подтягивающих резисторов или неправильная разводка A0 приводят к ошибкам связи. В промышленных применениях рекомендуется добавить конденсатор 0.1 мкФ между VCC и GND для фильтрации помех.
Необходимые компоненты и инструменты для работы с AT24C04BN-SH-T
Для подключения и программирования AT24C04BN-SH-T потребуется микроконтроллер с поддержкой I²C (например, STM32F103C8T6, ATmega328P или ESP8266), два подтягивающих резистора на 4,7 кОм для линий SDA и SCL, а также стабильный источник питания на 1,8–5,5 В. Микросхема работает в режиме slave, поэтому для тестирования понадобится логический анализатор (Saleae Logic 8) или осциллограф с декодированием I²C (Rigol DS1054Z). Для монтажа используйте макетную плату с перемычками или паяльную станцию (например, TS100) с тонким жалом для работы с корпусом SOIC-8.
Программное обеспечение: Arduino IDE с библиотекой *Wire* для базового взаимодействия, PlatformIO для расширенной отладки или STM32CubeIDE при работе с STM32. Для низкоуровневого доступа подойдет *i2c-tools* (Linux) или *Bus Pirate* (аппаратный анализатор протоколов). При пайке рекомендуется флюс на основе канифоли (например, *Amtech NC-559*) и припой диаметром 0,5 мм. Для защиты от статического электричества используйте антистатический браслет или заземленный коврик.
Схема подключения микросхемы к микроконтроллеру по шине I2C
AT24C04BN-SH-T использует двунаправленную шину I2C с поддержкой стандартного (100 кГц) и быстрого (400 кГц) режимов. Для корректной работы требуется подтяжка линий SDA и SCL к питанию через резисторы номиналом 4,7 кОм при напряжении 5 В или 2,2 кОм при 3,3 В. Значения резисторов критичны: слишком низкое сопротивление увеличивает потребление, высокое – снижает помехоустойчивость.
| Назначение | Подключение к МК | |
|---|---|---|
| VCC | Питание (1,7–5,5 В) | +3,3 В или +5 В |
| GND | Общий провод | Земля |
| SDA | Данные | Линия SDA МК + подтяжка |
| SCL | Тактовый сигнал | Линия SCL МК + подтяжка |
| A0 | Не подключать или заземлить | |
| A1, A2 | К земле или VCC для выбора адреса | |
| WP | Защита записи | К земле (запись разрешена) или VCC (защита) |
Конденсатор ёмкостью 0,1 мкФ между VCC и GND вблизи микросхемы обязателен для фильтрации помех. При длине проводов шины более 20 см рекомендуется снизить скорость до 100 кГц или использовать экранированный кабель. В системах с высоким уровнем шумов (например, рядом с двигателями) добавьте ферритовые бусины на линии питания и I2C.
AT24C04BN-SH-T поддерживает страничную запись (до 16 байт за транзакцию) и произвольное чтение. При записи более 16 байт микросхема автоматически переходит на следующую страницу, но адрес не сбрасывается – это может вызвать перезапись данных. Для предотвращения ошибок всегда проверяйте текущий адрес перед записью.
В коде инициализация шины выполняется через Wire.begin() (Arduino) или аналогичные функции для других платформ. Перед первым обращением к микросхеме добавьте задержку 10–50 мс для стабилизации питания. При сбоях связи проверьте осциллографом сигналы SDA/SCL на наличие паразитных импульсов или падений напряжения ниже 0,7×VCC.
Настройка питания и заземления для стабильной работы AT24C04BN-SH-T

Инициализация шины I2C и проверка связи с микросхемой
AT24C04BN-SH-T использует двухпроводной интерфейс I2C с фиксированной тактовой частотой до 400 кГц. Перед началом работы убедитесь, что микроконтроллер поддерживает режим Fast-mode (FM) или Standard-mode (SM). Для инициализации шины в Arduino IDE достаточно вызвать Wire.begin(), но для STM32 или ESP32 потребуется явное задание пинов SDA и SCL через Wire.setPins(SDA, SCL).
В случае использования микроконтроллеров с аппаратным I2C (например, STM32) настройте тактирование шины через регистры I2C_CR2 и I2C_TIMINGR. Для частоты 100 кГц в режиме SM рекомендуемые значения: PRESC=1, SCLDEL=4, SDADEL=2, SCLH=9, SCLL=15. Эти параметры зависят от тактовой частоты ядра и требуют корректировки для других скоростей.
При работе с ESP8266 или ESP32 используйте библиотеку Wire с учётом особенностей архитектуры. Для ESP32 задайте частоту шины через Wire.setClock(400000), но помните, что реальная скорость может отличаться из-за делителей тактовой частоты. Проверку связи проводите в цикле с задержкой 100 мс между попытками, чтобы избежать ложных срабатываний при нестабильном питании.
Если микросхема не отвечает, измерьте напряжение на линиях SDA/SCL осциллографом. При нормальной работе на SCL должны наблюдаться импульсы с частотой, близкой к заданной, а на SDA – подтверждающие биты (ACK) после каждого байта. Отсутствие ACK указывает на проблему с адресацией или питанием. Проверьте также, не перепутаны ли местами SDA и SCL – это распространённая ошибка при подключении.
Для отладки используйте логический анализатор с декодированием I2C. Инструменты вроде PulseView или Saleae Logic позволяют визуализировать обмен данными и выявлять ошибки протокола. При анализе обращайте внимание на стартовые/стоповые условия, корректность адресации и тайминги. Например, задержка между стоп- и старт-условиями должна быть не менее 1,3 мкс для режима FM.
Чтение и запись данных в EEPROM с использованием стандартных библиотек

Запись одного байта выполняется через функцию Wire.write() после передачи адреса устройства и внутреннего адреса ячейки. Пример кода для записи значения 0xAA в ячейку 0x05:
- Инициализируйте I²C:
Wire.begin(); - Начните передачу:
Wire.beginTransmission(0x50); - Отправьте адрес ячейки:
Wire.write(0x05); - Запишите данные:
Wire.write(0xAA); - Завершите передачу:
Wire.endTransmission(); - Добавьте задержку
delay(5);для завершения внутреннего цикла записи.
Для записи массива данных используйте цикл, но учитывайте ограничение на размер страницы (16 байт для AT24C04). Превышение этого лимита приведёт к переполнению и потере данных. Пример записи 8 байт:
- Создайте массив:
byte data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; - Отправьте адрес ячейки:
Wire.write(0x10); - Запишите данные в цикле:
for (byte i = 0; i < 8; i++) Wire.write(data[i]); - Завершите передачу и добавьте задержку.
Чтение данных требует двухэтапного процесса: сначала передаётся адрес ячейки, затем выполняется запрос на чтение. Пример чтения одного байта из ячейки 0x05:
- Начните передачу:
Wire.beginTransmission(0x50); - Отправьте адрес ячейки:
Wire.write(0x05); - Завершите передачу:
Wire.endTransmission(); - Запросите 1 байт:
Wire.requestFrom(0x50, 1); - Считайте данные:
byte value = Wire.read();
Для чтения массива данных используйте аналогичный подход, но запрашивайте нужное количество байт. Пример чтения 8 байт:
- Передайте адрес ячейки:
Wire.write(0x10); - Запросите данные:
Wire.requestFrom(0x50, 8); - Считайте в массив:
while (Wire.available()) data[i++] = Wire.read();
Ошибки при работе с AT24C04 часто связаны с неверной адресацией или игнорированием задержек. Если запись не выполняется, проверьте:
- Подключение линий SDA и SCL (должны быть подтянуты к VCC через резисторы 4.7 кОм).
- Корректность адреса устройства (используйте сканер I²C для проверки).
- Наличие задержки после записи (
delay(5)минимум).
Для работы с большими объёмами данных разделите запись на страницы. Например, при записи 32 байт в ячейки с 0x00 по 0x1F выполните две операции по 16 байт, начиная с адресов 0x00 и 0x10. Это предотвратит переполнение буфера микросхемы.
При использовании других платформ (STM32, ESP32) библиотека Wire заменяется на аналогичную, но принцип остаётся тем же. Например, в STM32 HAL используйте HAL_I2C_Mem_Write() и HAL_I2C_Mem_Read() с указанием адреса устройства, внутреннего адреса и размера данных. Убедитесь, что тактовая частота I²C не превышает 400 кГц для стабильной работы.
Обработка ошибок при работе с AT24C04BN-SH-T и их устранение

При записи данных в AT24C04BN-SH-T часто возникает ошибка NACK на этапе передачи адреса или байта данных. Это указывает на отсутствие подтверждения от микросхемы, что может быть вызвано неправильным подключением линий SDA или SCL, обрывом шины I²C либо некорректным уровнем напряжения питания. Проверьте сопротивление подтягивающих резисторов на линиях I²C – для AT24C04BN-SH-T рекомендуется использовать резисторы 4,7 кОм при напряжении питания 5 В и 2,2 кОм при 3,3 В. Если ошибка сохраняется, измерьте осциллографом сигналы на шине: фронты должны быть четкими, без дребезга.
При чтении данных возможна ситуация, когда возвращаемые значения не соответствуют записанным. Это часто связано с неверной адресацией страниц памяти. AT24C04BN-SH-T имеет 512 байт памяти, организованных в 2 блока по 256 байт (страницы). При записи за границу страницы происходит переполнение адреса, и данные записываются в начало текущей страницы. Например, попытка записи по адресу 0xFF приведет к записи в 0x00. Решение – разбивать данные на блоки по 16 байт (размер страницы) и использовать функцию последовательной записи с автоматическим инкрементом адреса.
Нестабильная работа микросхемы при высоких скоростях обмена (более 400 кГц) может вызывать ошибки контрольной суммы или потерю данных. AT24C04BN-SH-T поддерживает стандартный режим I²C (100 кГц) и быстрый режим (400 кГц), но при переходе на 400 кГц необходимо уменьшить длину проводников шины до 20 см и использовать экранированный кабель. Если ошибки сохраняются, снизьте тактовую частоту до 100 кГц или добавьте задержку в 5 мкс между операциями чтения/записи. Также проверьте стабильность питания: микросхема критична к пульсациям напряжения, допустимый диапазон – 1,7–5,5 В с отклонением не более ±5%.
При многократных циклах записи/стирания (более 1 млн циклов) возможно появление битых ячеек памяти. AT24C04BN-SH-T гарантирует 1 млн циклов записи, но на практике деградация начинается раньше при отсутствии механизма выравнивания износа. Для продления срока службы реализуйте алгоритм распределения записей по всей памяти, избегая частого перезаписывания одних и тех же адресов. При обнаружении ошибки чтения используйте ECC (код коррекции ошибок) или резервные копии данных. Если микросхема перестала отвечать, проверьте ее заменой – физические повреждения (например, от статического электричества) необратимы.
Примеры кода для Arduino и STM32 с комментариями по операциям

Для работы с AT24C04BN-SH-T на Arduino используйте библиотеку Wire. Пример записи и чтения байта:
#include <Wire.h>
#define EEPROM_ADDR 0x50 // Базовый адрес микросхемы (A0-A2 на GND)
void setup() {
Wire.begin(); // Инициализация I2C
Serial.begin(9600);
// Запись байта по адресу 0x0010 (страница 0, смещение 0x10)
Wire.beginTransmission(EEPROM_ADDR | 0x00); // Выбор страницы 0
Wire.write(0x10); // Указание смещения
Wire.write(0xAA); // Запись данных
Wire.endTransmission();
delay(5); // Ожидание завершения записи (max 5 мс)
// Чтение байта
Wire.beginTransmission(EEPROM_ADDR | 0x00);
Wire.write(0x10);
Wire.endTransmission();
Wire.requestFrom(EEPROM_ADDR | 0x00, 1);
byte data = Wire.read();
Serial.print("Прочитано: 0x");
Serial.println(data, HEX);
}
void loop() {}
- Адрес страницы (0x00 или 0x01) добавляется к базовому адресу через побитовое ИЛИ.
- Максимальный размер страницы – 256 байт; при превышении смещения запись начнется с начала страницы.
- Для записи массива данных используйте цикл с паузой
delay(5)между байтами.
На STM32 с HAL пример записи блока данных через DMA (для повышения производительности):
#include "stm32f4xx_hal.h"
I2C_HandleTypeDef hi2c1;
void writeEEPROM(uint16_t memAddr, uint8_t *data, uint16_t size) {
uint8_t page = (memAddr >> 8) & 0x01; // Определение страницы (0 или 1)
uint8_t addr = EEPROM_ADDR | page; // Формирование полного адреса
uint8_t offset = memAddr & 0xFF; // Смещение внутри страницы
// Передача адреса и данных
HAL_I2C_Mem_Write_DMA(&hi2c1, addr, offset, I2C_MEMADD_SIZE_8BIT, data, size);
HAL_Delay(5); // Ожидание завершения записи
}
void readEEPROM(uint16_t memAddr, uint8_t *data, uint16_t size) {
uint8_t page = (memAddr >> 8) & 0x01;
uint8_t addr = EEPROM_ADDR | page;
uint8_t offset = memAddr & 0xFF;
HAL_I2C_Mem_Read(&hi2c1, addr, offset, I2C_MEMADD_SIZE_8BIT, data, size, HAL_MAX_DELAY);
}
- Для DMA требуется предварительная настройка канала в CubeMX (режим
I2C_Mode_DMA). - При записи более 8 байт за раз используйте
HAL_I2C_Master_Transmitс ручным разбиением на страницы. - Ошибки I2C обрабатывайте через
HAL_I2C_GetError(&hi2c1)(коды:HAL_I2C_ERROR_AF,HAL_I2C_ERROR_BERR).