Работа с eeprom m24c02 по i2c

Теория I2C, EEPROM от Atmel.

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

  • Теория интерфейса I2C.
  • EEPROM, описания моей микросхемы(AT24C256) и подключение.
  • Написание библиотеки для работы с памятью.

Часть первая, I2C и библиотека «Wire».

Последовательный протокол обмена данными IIC (также называемый I2C — Inter-Integrated Circuits, межмикросхемное соединение). Разработана фирмой Philips Semiconductors в начале 1980-х как простая 8-битная шина внутренней связи для создания управляющей электроники. Так как право на использование его стоит денег фарма Atmel назвала его TWI, но смысл от этого не меняется.

Как это работает ?

Для передачи данных используются две двунаправленные лини передачи данных. SDA (Serial Data) шина последовательных данных и SCL (Serial Clock) шина тактирования. Обе шины подтянуты резисторами к плюсовой шине питания. Передача/Прием сигналов осуществляется прижиманием линии в 0, в единичку устанавливается сама, за счет подтягивающих резисторов.

В сети есть хотя бы одно ведущее устройство (Master), которое инициализирует передачу данных и генерирует сигналы синхронизации и ведомые устройства (Slave), которые передают данные по запросу ведущего. У каждого ведомого устройства есть уникальный адрес, по которому ведущий и обращается к нему. Конечно понятно что Ведущий это наш микроконтроллер , а ведомый наша память. Ведущее устройство начинает прижимать шину SCL к нулю с определенной частотой, а шину SDA прижимать или отпускать на определенное число тактов передавая Единичку или Нолик. Передача данных начинается с сигнала START потом передается 8 бит данных и 9-тым битом Ведомое устройство подтверждает прием байт прижимая шину SDA к минусу. Заканчивается передача сигналом STOP .

Библиотека «Wire».

Для облегчения обмена данными с устройствами по шине I2C для Arduino написана стандартная библиотека Wire которая есть уже в комплекте IDE. Она имеет следующие основные функции:

Wire.begin(Address) вызывается один раз для инициализации и подключения к шини как Ведущий или Ведомое устройство. Если Address не задан подключаемся как Мастер устройство.

Wire.beginTransmission(address) начинает передачу на ведомое I2C устройство с заданным адресом.

Wire.endTransmission() прекращает передачу данных ведомому. Функция возвращает значение типа byte :

  • 0 — успех.
  • 1- данные слишком длинны для заполнения буфера передачи.
  • 2 — принят NACK при передаче адреса.
  • 3 — принят NACK при передаче данных.
  • 4 — остальные ошибки.

Wire.write() запись данных от ведомого устройства в отклик на запрос от ведущего устройства, или ставит в очередь байты для передачи от мастера к ведомому устройству.Фактически записывает данные в буфер. Размер буфера 32 байт а ( минус 2 байта адрес, фактически 30 байт ), а передает буфер функция Wire.endTransmission().

  • Wire.write(value) — value : значение для передачи, один байт.
  • Wire.write(string) — string : строка для передачи, последовательность байтов.
  • Wire.write(data, length) — data : массив данных для передачи, байты. length : количество байтов для передачи.

Wire.read() Считывает байт, который был передан от ведомого устройства к ведущему или который был передан от ведущего устройства к ведомому. Возвращаемое значение byte : очередной принятый байт.

Это самые основные функции библиотеке, остальные мы рассмотрим по ходу пьесы ))

Часть вторая, EEPROM.

EEPROM (англ. Electrically Erasable Programmable Read-Only Memory ) — электрически стираемое перепрограммируемое ПЗУ (ЭСППЗУ), один из видов энергонезависимой памяти (таких, как PROM и EPROM). Память такого типа может стираться и заполняться данными до миллиона раз.

Мне прислали уже готовый модуль EEPROM с микросхемой AT24C256 фирмы Atmel объемом 32 кбайт. Что бы разобраться с этим чудом нам придется проштудировать datasheet который очень скучный и на английском. Так что я вам выдам уже готовый результат моих мук.

Характеристики :

  • Низковольтные и стандартные питание. VCC = 1.7V to 5.5V.
  • 400kHz (1.7V) and 1MHz (2.5V, 2.7V, 5.0V) совместим с частотой синхронизации.
  • Выносливость: 1,000,000 Циклов Записи.
  • Внутренне организованный как 32 768 страниц x 8 бит.

выводы :

  • WP — защита от записи. Если вывод подключен к GND то можно записывать данные в память.
  • A0…A2 — выводы задающие адрес устройства.
  • Vcc — питание плюс.
  • GND — питание минус.
Адрес памяти:

Задается тремя ногами A0..A2. Если нога прижата к Gnd то значение бита 0, если к Vcc то 1. Микросхема использует восьми битный адрес, последний бит отвечает за выбор операции . Если значение бита высокий то инициализируется операция чтения, если низкий(ноль) то операция записи.

То есть если все три вывода прижаты к GND и мы хотим записать в память, адрес устройства будет выглядеть как 10100000 (в библиотеке «Wire» используется 7-ми битный адрес, сдвигаем все в право на один бит 01010000 0x50).

Запись данных в память:

Для записи мы с начало обращаемся к памяти с битом Записи в адресе . Потом посылаем два 8-ми битных адреса(то есть у нас 0x8000 адресов) , затем байт данных и сигнал STOP . После этого EEPROM входит во внутренне синхронизированный цикл записи tWR(Write Cycle Time 5 ms) в энергонезависимую память. Все входные сигналы
отключено во время этого цикла записи, и EEPROM не ответит, пока запись не будет завершена .

Копаемся дальше и находим в datasheet что память микросхемы организована как 512 страниц по 64 байта . То есть мы может записать сразу до 64 байт информации за одну команду. Для этого мы передаем все 64 байта информации и только после этого посылаем сигнал STOP .

Чтение данных :

С чтением данных все интересней. Память поддерживает три варианта чтения:

  • Читать текущий адрес;
  • Читать случайный адрес;
  • Последовательное чтение;

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

Что бы прочитать случайный адрес нам нужно с начало отправить команду на запись и передать адрес который хотим прочитать( не забывайте что адрес состоит из двух 8-ми битных частей ). За тем отправить команду на чтение и получить искомый байт, завершив все командой STOP.

Последовательное чтение может выполняться как с текущего адреса так и со случайного и будет продолжаться пока микроконтроллер не отправит сигнал СТОП. При переполнении адреса память ее сбросить и адресация начнется с начала.

Ну что же пришло время попробовать что нибудь записать:

Wire.requestFrom(address, quantity) — Используется мастером для запроса байтов от ведомого устройства. Эти байты могут быть получены с помощью методов available() и read() . Размер буфера такой же 32 байта .

  • address : 7-битный адрес устройства, у которого запрашиваются байты;
  • quantity : количество запрашиваемых байтов;

Wire.available() — Возвращает количество байтов, доступных для получения с помощью read() .

Ну и пример с записью в память строки «Hello Word» :

Организация памяти:

Так как в datasheet об этом написано смутно. Я на практике пытался разобраться с этим. В datasheet написано что память микросхемы организована как 512 страниц по 64 байта . Что это значит ? Если мы захотим записать больше 64 байт сразу ,скажем по адресу 0x40( адрес начало второй страницы), при выходе адреса за границы страницы внутренний счетчик микросхемы сбросит адрес на начало страницы . А лишние байты будут записаны в начало страницы и сотрут данные которые были там записаны.

Для чтения таких ограничений нету, в даташипе написано только то что когда вы достигнете конца адресов вас автоматически перекинет на начало ( адрес 0х00).

Читайте также  Автоматический выключатель освещения

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Примеры аппаратных решений решения для беспроводных сетей различных технологий

RFID-устройства

Интересной разновидностью мобильных беспроводных устройств является класс устройств, не требующих для своего функционирования собственного источника питания. Их питание осуществляется за счет получения энергии от внешнего электромагнитного поля. Они становятся активными в некоторой области вблизи источника радиоволн определенной частоты. Возможно, когда-нибудь, они достигнут возможностей, описанных в романе В. Винджа «Глубина в небе» (создание полноценной сети с возможностью передачи звука и изображений). На данный момент устройства с питанием от радиоимпульсов, так называемые радиочастотные метки, или RFID -метки, способны передавать в ответ на запрос некоторую идентифицирующую их информацию с возможностью занесения в них новых данных.

Идентификационные данные и показатели работы, передаваемые RFID -устройствами в зависимости от объекта автоматизации и решаемых задач могут использоваться как самостоятельно, так и совместно с информационными ресурсами внешних информационных систем.

На территории Российской Федерации разрешены для свободного использования диапазоны рабочих частот:

  • НЧ — 125-134 кГц;
  • ВЧ — 13,56 МГц;
  • УВЧ — 865-868 и 915-921 МГц;
  • микроволны — 2,4 ГГц.

Рабочая частота выбирается из диапазонов, разрешенных к свободному использованию частот с учетом следующих факторов:

  • максимального расстояния считывания:
  • для НЧ — несколько сантиметров;
  • для ВЧ — 0,5-0,6 м;
  • для УВЧ — до нескольких метров;
  • для микроволн — до 200-300 м;
  • типа прикладной системы идентификации;
  • условий эксплуатации;
  • цены устройств.

Основные области применения RFID лежат в системах:

  • обеспечения безопасности:
  • идентификация личности;
  • ключ допуска в помещение;
  • отслеживание перемещений товара или оборудования;
  • системы «анти вор»;
  • сбора данных — т.н. «даталоггеры»;
  • логистики.

Можно также выделить и новые тенденции — смена режима работы мобильных вычислительных устройств в зависимости от окружения. В частности, появляются приложения для устройств на платформе Android с поддержкой NFC (Near Field Communications ), позволяющие в зависимости от расположенной рядом метки активировать те или иные приложения. Данную идею вполне можно расширить и на более серьезные задачи, например, запрет или разрешение на доступ к данным или приложениям в зависимости от окружения — офис , удаленный офис , конференц-зал, дом.

В нашей стране пока наиболее распространены RFID -системы использующие диапазоны НЧ и ВЧ (125-134 КГц и 13.56МГц соответственно), считается, что в системах контроля доступа, отслеживания выноса товара и т.п. они менее чувствительны к попыткам блокировки их работы.

Семейство EEPROM c двойным интерфейсом доступа

Обычно RFID устройства представляют собой электрически стираемую энергонезависимую память с доступом по радиоканалу. S™icroelectronics предлагает оригинальное семейство EEPROM M24LRxxх c двойным интерфейсом доступа — данные доступны по интерфейсу I2C и по радиоинтерфейсу стандарта ISO 15693, работающему на частоте 13.56 МГц [56, 57]. По каждому из интерфейсов данные защищены 32-битным паролем доступа — один пароль для I2C шины и четыре пароля для доступа по радиоканалу. Данные, записанные в EEPROM по интерфейсу I2C могут быть прочитаны смартфоном со встроенным ISO 15693-совместимым NFC-интерфейсом или обычным RFID-считывателем (Рис. 4.37).

Память с двойным интерфейсом, хотя и проигрывает обычным RFID-устройствам, не имеющим корпуса, в размерах, открывает целый спектр новых возможностей, сочетая достоинства внешней энергонезависимой памяти и памяти с бесконтактным доступом.

В семейство M24LRxxx входят микросхемы EEPROM емкостью от 4 до 64 Кбит (таблица 14 [56]). Серии M24LRxxE имеют выход индикации наличия поля и выход индикации обращения к памяти по радиоканалу, в серии M24LRxx вместо данных выводов расположения выводы выбора адреса (Рис. 4.38) [57].

Таблица 4.7. Семейство микросхем EEPROM с двойным интерфейсом S™icroelectronics M24LRxxx

Микросхема Емкость, Кбит Корпус
M24LR04E-R 4096 SO-8; TSSOP8; UFDFPN 8 2x3x0.6
M24LR16E-R 16384 SO-8; TSSOP8; UFDFPN 8 2x3x0.6
M24LR64-R 65536 SAWN WAFER F 8; SO-8; TSSOP8; UFDFPN 8 2x3x0.6
M24LR64E-R 65536 SO-8; TSSOP8; UFDFPN 8 2x3x0.6

Структурная схема M24LRxxx представлена на Рис. 4.39.

  • диапазон напряжений питания — от 1.8 до 5.5В;
  • ток потребления (при питании со стороны I2C интерфейса):
    • в режиме чтения 50 ( Vcc =1.8, f_scl =100 КГц) — 400 ( Vcc =5.5, f_scl =400 КГц) мкА;
    • в режиме записи 220 мкА;
    • в режиме ожидания 30 — 40 мкА.

    Одним из наиболее простых, но функциональных отладочных наборов является набор M24LR-DISCOVERY [63], включающий в себя две платы (Рис. 4.44) M24LR board с памятью и плату с приемопередатчиком CR95HF:

    Плата M24LR board содержит микросхему памяти с двойным интерфейсом M24LR04E-RMN6T/2 (4 Кбита, корпус SO8N), контроллер STM8L152C6T6 c 8 Кбайтами флеш-памяти, датчик температуры STTS751-0WB3F, печатную антенну 20 х 40 мм, ЖК-индикатор. Имеет разъемы для программирования EEPROM (I2C) и для программирования и отладки программ контроллера (SWIM).

    M24LR board также может работать с телефонами и коммуникаторами на базе Android с поддержкой NFC. Соответствующее приложение NfcV-Reader доступно в репозитарии приложений Google Play и позволяет пользователям, используя свой телефон, просматривать данные, зафиксированные платой.

    Плата приемопередатчика (RF transceiver board) включает в себя трансивер CR95HF-VMD5T 13.56 МГц, контроллер STM32F103CB с 128 Кбайтами флеш-памяти, печатную антенну 47 х 34 мм. Интерфейс с хост компьютером и питание платы осуществляет через USB.

    Программные продукты для работы с отладочным набором доступны по адресу www.st.com/m24lr04e-discovery и включают в себя программу для хост-компьютера, скомпилированный образ приложения для STM8L. Отладочные платы набора также содержат запрограммированные образы демонстрационных приложений.

    Учитывая возможности EEPROM M24LRxxx взаимодействовать практически параллельно по двум независимым каналам и значительные для RFID-памяти объемы хранимых данных, можно рассмотреть возможность применения её в системах безопасности, нацеленных на обеспечение конфиденциальности и целостности информации.

    В частности, большая емкость памяти позволяет хранить достаточно большое количество событий (например, доступ в те или иные помещения), что может помочь при расследовании инцидентов. Возможно также использование связки контроллер+CH95HF и M24LRxxx в качестве:

    • аппаратных ключей для активации оборудования или приложений на рабочем месте сотрудника для предотвращения несанкционированного доступа во время его отсутствия;
    • возможного хранилища ключей шифрования, исключающее возможность его перехвата или копирования;
    • хранилища контрольных сумм важных документов или системных файлов для отслеживания нежелательной программной активности или контроля целостности документов.

    Наличие интерфейса I2C позволяет создавать интеллектуальные регистраторы событий на основе микроконтроллером, фиксирующие, в зависимости от периферийных датчиков различный набор параметров или событий. Кроме того, данная возможность имеет большие перспективы в области отслеживания движения грузов и товара — фиксация температурного режима, условий перевозки, отслеживание перемещений по складу или территории магазина. Снятие этих данных при приеме товара от перевозчика позволит разрешить ряд вопросов, связанных с выявлением дефектов товара (появление при производстве, погрузке или транспортировке).

    Записки программиста

    Микроконтроллеры STM32: работа с внешним EEPROM

    28 февраля 2018

    Одна из проблем с микроконтроллерами STM32 заключается в том, что большинство из них не имеют встроенного EEPROM. Исключением являются только микроконтроллеры серий STM32L0 и STM32L1 с ультра низким энергопотреблением. Это довольно странно после работы с AVR, где EEPROM есть у всех микроконтроллеров. Существует несколько решений, но в рамках этой заметки мы рассмотрим самое очевидное — использование внешнего EEPROM на примере чипа с I2C-интерфейсом 24LC64.

    Дополнение: Альтернативное решение заключается в том, чтобы воспользоваться встроенной backup memory микроконтроллеров STM32. Подробности по этой теме вы найдете в посте Микроконтроллеры STM32: использование встроенных RTC.

    Цифра 64 в названии говорит о том, что устройство имеет 64 килобит памяти, или 8 Кбайт. Есть аналогичные чипы от разных производителей и с разными объемами памяти — я видел от 128 байт (например, M24C01 от компании ST) до 256 Кбайт (AT24CM02 производства Atmel). В плане распиновки и интерфейса все они абсолютно взаимозаменяемы. Далее я буду говорить о 24LC64, производимом компанией Microchip, так как сам использовал именно его.

    Распиновка 24LC64 выглядит так (даташит [PDF]):

    VSS и VCC, понятно, представляют собой минус и плюс питания, а SDA и SCL — это I2C шина. Устройство имеет I2C-адрес 0b1010zyx, где значения x, y и z определяются тем, к чему подключены пины A0, A1 и A2. Если пин подключен к земле, соответствующий бит адреса равен нулю, если же к плюсу — то единице. Таким образом, устройство может иметь адрес от 0 x 50 до 0 x 57. Наконец, пин WP — это write protection. Если пин подключен к земле, разрешено как чтение, так и запись. Если же пин подключен к плюсу, устройство доступно только на чтение.

    Создаем новый проект в STM32CubeMX для вашей отладочной платы. Лично я все также использую плату Nucleo-F411RE, но если вы используете другую, отличия в проекте должны быть минимальными. В Peripherals включаем устройство I2C1, выбрав в выпадающем списке «I2C» вместо «Disable». Также мы будем передавать что-то компьютеру, поэтому включаем устройство USART2, как делали это в заметке Микроконтроллеры STM32: обмен данными по UART. Чтобы плату можно было использовать с Arduino-шилдами, несущими какие-то I2C-устройства, пины I2C1 нужно переназначить на PB9 и PB8 (по умолчанию будут назначены другие: PB7 и PB6). В итоге должна получиться такая картинка:

    Затем генерируем код и подправляем Makefile, как обычно. Я лично просто взял Makefile из исходников к заметке про UART и дописал недостающие файлы в C_SOURCES, а именно:

    Для подключения 24LC64 к плате Nucleo я воспользовался Proto Shield от Arduino. Пришлось прорезать в нем отверстие Dremel’ем, чтобы иметь доступ к кнопкам на отладочной плате. В итоге у меня получился вот такой сэндвич:

    Кто-то из читателей мог обратить внимание на то, что в I2C-шине должны использоваться резисторы, подтягивающие SCL и SDA к плюсу, но в этом проекте мы их не используем. Дело в том, что для моей платы и использованного в ней микроконтроллера STM32CubeMX автоматически включает встроенные подтягивающие резисторы на соответствующих пинах.

    Убедиться в этом несложно, посмотрев код процедуры HAL_I2C_MspInit в файле ./Src/stm32f4xx_hal_msp.c:

    Правда, не так очевидно, почему процедура HAL_I2C_MspInit вообще откуда-то вызывается. Ответ можно найти в файле stm32f4xx_hal_i2c.c, где эта процедура объявляется с атрибутом __weak и вызывается из процедуры HAL_I2C_Init. Атрибут __weak работает таким образом, что при сборке не-weak процедура из кода нашего проекта подменяет собой weak-процедуру из HAL, за счет чего она и будет вызвана.

    Заметьте, однако, что встроенные подтягивающие резисторы доступны не во всех микроконтроллерах STM32. Насколько мне известно, для серии STM32F1 это работать не будет, и придется все-таки использовать внешние подтягивающие резисторы.

    Наконец, рассмотрим основной код прошивки:

    void init ( ) <
    const char wmsg [ ] = «Some data» ;
    char rmsg [ sizeof ( wmsg ) ] ;
    // HAL expects address to be shifted one bit to the left
    uint16_t devAddr = ( 0x50 1 ) ;
    uint16_t memAddr = 0x0100 ;
    HAL_StatusTypeDef status ;

    if ( memcmp ( rmsg , wmsg , sizeof ( rmsg ) ) == 0 ) <
    const char result [ ] = «Test passed! r n » ;
    HAL_UART_Transmit ( & huart2 , ( uint8_t * ) result , sizeof ( result ) — 1 ,
    HAL_MAX_DELAY ) ;
    > else <
    const char result [ ] = «Test failed 🙁 r n » ;
    HAL_UART_Transmit ( & huart2 , ( uint8_t * ) result , sizeof ( result ) — 1 ,
    HAL_MAX_DELAY ) ;
    >
    >

    Для работы с внешней памятью в HAL предусмотрены специальные процедуры HAL_I2C_Mem_Read и HAL_I2C_Mem_Write. Заметьте, что эти процедуры работают с I2C адресами, сдвинутыми на 1 бит влево. Связано это с тем, что в протоколе I2C семибитный адрес устройства и бит операции (чтение или запись) передаются в одном байте. Использование «сдвинутых» адресов позволяет выполнять чуть меньше ассемблерных инструкций, что нередко бывает важно в разработке встраиваемых систем. Еще стоит обратить внимание на то, что перед чтением с устройства мы должны дождаться его готовности с помощью процедуры HAL_I2C_IsDeviceReady. Наконец, здесь я забил на коды возврата большинства использованных процедур, чего в боевом коде, пожалуй, делать не стоит.

    Fun fact! Вдумчивый читатель, конечно же, обратил внимание на тот факт, что адрес памяти имеет тип uint16_t . Спрашивается, как можно адресовать им более 64 Кбайт памяти, например, те же 256 Кбайт у AT24CM02? Само собой разумеется, никак. Чипы, имеющие более 64 Кбайт памяти, начинают использовать для адресации младшие биты I2С-адреса устройства. То есть, с точки зрения нашего кода, они будут выглядеть, как 2 или более отдельных I2C-устройства. Соответствующие пины, определяющие адрес устройства, при этом являются NC, то есть, ни к чему не подключаются.

    При работе с EEPROM нужно учитывать еще пару важных моментов:

    • 24LC64 и его родственники хранят данные в страницах по 32 байта. За один вызов HAL_I2C_Mem_Write вы можете записать только одну страницу, причем нужно учитывать не только размер данных, но и их выравнивание. Если требутеся записать больше одной страницы, процедуру нужно вызывать в цикле. На чтение, насколько я смог выяснить, таких ограничений нет — читать можно сколько угодно и по любым смещениям;
    • Запись в EEPROM может быть прервана в любой момент (сел аккумулятор, пользователь выдернул кабель питания, …). Поэтому в боевом коде стоит хранить вместе с данными их контрольную сумму. В случае, если будет записана только часть данных, это позволит обнаружить проблему и использовать хотя бы параметры по умолчанию, а не какой-то мусор.

    Полную версию исходников к этой заметке вы найдете на GitHub. В качестве небольшого домашнего задания можете модифицировать прошивку так, чтобы она дампила все содержимое EEPROM и передавала его по UART. Код форматирования бинарных данных в стиле того, как это делает hexdump, можно взять из поста Перехват сетевого трафика при помощи библиотеки libpcap (процедура print_data_hex). В итоге должен получиться приятный такой отладочный инструмент — простенький, но со вкусом.

    А доводилось ли вам работать с внешней памятью, и если да, то с какой именно?

    Digitrode

    цифровая электроника вычислительная техника встраиваемые системы

    • Вычислительная техника
      • Микроконтроллеры микропроцессоры
      • ПЛИС
      • Мини-ПК
    • Силовая электроника
    • Датчики
    • Интерфейсы
    • Теория
      • Программирование
      • ТАУ и ЦОС
    • Перспективные технологии
      • 3D печать
      • Робототехника
      • Искусственный интеллект
      • Криптовалюты

    Чтение RSS

    Подключаем к Arduino внешнюю EEPROM память 24C04

    EEPROM (электрически стираемое программируемое постоянное запоминающее устройство) это модифицируемое пользователем постоянное запоминающее устройство (ПЗУ), которое можно многократно стирать и перепрограммировать, прикладывая более высокое, чем обычно, электрическое напряжение. EEPROM широко используется в микроконтроллерных проектах, в том числе в Arduino.

    Впрочем, иногда внутренней EEPROM не хватает, тогда подключают микросхему внешней памяти EEPROM, например, 24C04.

    24C04 – это двухпроводная последовательная EEPROM. Объем памяти составляет 512 слов. Каждое слово имеет 8 бит. Память состоит из 32 страниц по 16 байт каждая и использует адрес слова из 9-битных данных для случайной адресации слова из памяти. Модуль использует протокол связи I2C для связи с другими микроконтроллерами или цифровыми устройствами.

    Распиновка микросхемы 24C04:

    A0, A1, A2 – эти три вывода являются адресными входами. Контакты A2 и A1 предназначены для аппаратной адресации. Вы можете адресовать четыре устройства в одной системе шин, тогда как вывод A0 является выводом без подключения, и обычно мы соединяем этот вывод с землей.

    SDA – вывод последовательных данных позволяет реализовать двунаправленную передачу последовательных данных и адресов.

    SCL – это входной контакт синхронизации, который вводит данные в каждое устройство EEPROM по положительному фронту тактовой частоты и при отрицательном переходе, он отправляет данные на выходной контакт каждого устройства.

    WP – вывод защиты от записи защищает данные аппаратного обеспечения. Он разрешает операции чтения/записи, при подключении его к заземляющему контакту. И только операция записи будет активна при подключении к Vcc.

    GND и Vcc – линии заземления и питания (от 1,7 до 5,5 В) соответственно.

    Это устройство хорошо подходит для использования в приложениях, требующих низкого напряжения и малого энергопотребления для работы. Многие промышленные и коммерческие приложения используют это устройство, поскольку оно обеспечивает помехоустойчивость, и вы можете расширить его, каскадируя 8 подобных устройств. Компьютеры и другие электронные устройства используют это устройство для хранения данных и предотвращения потери данных при отключении питания.

    Как уже упоминалось выше, это устройство использует интерфейс I2C, который состоит из двух проводов с именами SDA и SCL. Поскольку это двунаправленная шина, она может выступать в качестве передатчика или приемника. Данные на выводе SDA изменяются при переходе сигнала SCL с высокого уровня на низкий.

    Переход сигнала синхроимпульса с низкого уровня на высокий указывает на состояние пуска или останова. Когда на входном выводе SDA с высоким уровнем SCL происходит положительный переход, это условие запуска. Условие останова возникает, когда на SDA происходит отрицательный переход входного сигнала с высоким уровнем входного сигнала SCL. Это переводит устройство в режим ожидания.

    EEPROM отправляет или получает адреса и слова данных последовательно в форме 8-битных слов и отправляет ноль в качестве подтверждения того, что оно получило каждое слово. На рисунке ниже показано влияние на выход при изменении входов SDA и SCL.

    Далее представлена схема подключения EEPROM 24C04 к Arduino UNO. Соедините вывод SCL Arduino с выводом SCL EEPROM. Аналогично, вывод SDA (Arduino) с выводом SDA микросхемы EEPROM. Кроме того, подключите подтягивающие резисторы к SDA/SCL.

    Скопируйте приведенный далее код и вставьте его в Arduino IDE. Загрузите этот код в Arduino. Этот код будет просто читать значение с адреса 0x00.

    Работа с eeprom m24c02 по i2c

    Arduino библиотека за управление на 24C02 / 24C02 Arduino Library
    /kn34pc.com/справочник/ .

    Atmel AT24C02 — Two-wire Serial EEPROM 2K (256 x 8)

    Features:
    — Internally Organized 256 x 8 (2K)
    — Two-wire Serial Interface
    — Bi-directional Data Transfer Protocol
    — 100 kHz (2,7V) and 400 kHz (5V) Compatibility
    — Write Protect Pin for Hardware Data Protection
    — 8-byte Page (2K) Write Modes
    — Partial Page Writes are Allowed
    — Self-timed Write Cycle (5 ms max)
    — Endurance: 1 Million Write Cycles
    — Data Retention: 100 Years

    I2C address = 0x50 или 0x51 или 0x52 или 0x53 или 0x54 или 0x55 или 0x56 или 0x57 в зависимост от лог. ниво на адресните изводи A2, A1, A0


    EEPROM 24C02 — тестова схема

    Библиотека за управление на EEPROM 24C02 под Arduino / EEPROM 24C02 Arduino Library:
    at24c02_lib_v0.2.zip

    Библиотеката записва данни САМО побитово (BYTE WRITE). Режим PAGE WRITE не е реализиран.

    В тестовата схема към I2C шината са свързани (Arduino TWI) вътрешните pull-up резистори на микроконтролера (20..50 kΩ). При друга конфигурация (физическа дължина на шината, скорост, брой устройства, паразитен капацитет) при необходимост да се монтират външни 1..10 kΩ pull-up резистори към Vcc.

    at24c02( uint8_t );
    I2C address, в зависимост от лог. ниво на адресните изводи A2, A1, A0

    Напр. при A2(GND), A1(GND), A0(GND) -> I2C address = 0x50

    Публични функции и процедури:

    void init();
    инициализация на библиотеката

    I2C шината може да работи на честота 100 kHz (по подразбиране) и на 400 kHz.

    За работа на 400 kHz е необходимо след инициализацията да се добави стандартната Arduino функция за управление на TWI:
    Wire.setClock(400000L);

    uint8_t read( uint8_t m_addr);
    чете съдържанието на клетка с адрес m_addr

    void write( uint8_t m_addr, uint8_t m_data);
    записва клетка на адрес m_addr с данни m_data

    void update( uint8_t m_addr, uint8_t m_data);
    чете клетка и записва върху нея данни само при разлика (виж EEPROM endurance)

    След запис I2C шината трябва да остане в технологично време на покой преди началото на следващата операция. В документацията това време twr (Write Cycle Time, табл. 5, стр. 5 от [1]) варира от 5..10 ms в зависимост от конкретния производител (при по-стари EEPROM интегрални схеми съм срещал 10 ms).

    В библиотеката съм добавил 5 ms, като досега не съм имал проблем с реакцията на ИС. За конкретни случаи (напр. при друг производител) twr може да се увеличи.

    (Друг е въпроса какво се случва при липса на такова време в покой: По време на тестовете си понякога небрежно пропусках delay(5). При последователен запис на данни в няколко съседни клетки запис просто не се извършваше!).

    EEPROM разполага с ограничен ресурс по отношение броя записи (EEPROM endurance), който варира в зависимост от производителя (100K . 4M) и пряко зависи от начина на експлоатация: захранващо напрежение, температура и др. На реална, стайна температура и при нормални експлоатационни условия (съобразени с работните режими по спецификация) броят на записите в EEPROM е x5 .. x10 (и повече).

    Реално времето до първи отказ на EEPROM надхвърля това на устройството като цяло, но би трябвало още при проектиране да се избегнат някои неблагоприятни действия като многократни записи на данни (напр. през кратки интервали от време).

    Оптимизация на алгоритмите на устройството при запис на данни в EEPROM е добре да се извърши предварително с цел удължаване живота на паметта (напр. архивен запис на данни да се извършва само при смяна на режими, обхвати, състояния, при изключване на устройството и др.). Не, че цената на ИС е висока, а понякога подмяната на самата интегрална схема по печатната платка е възпрепятствано от непреодолими пречки (напр. SMD корпус, запоен на основна платка, намираща се на неподходящо място в корпуса на устройството).

    Темата за EEPROM endurance ми е интересна и е повод за разглеждане в друга, отделна статия.

    Пример 1: Четене, изтриване и запис (със случайни данни) на клетки в EEPROM 24C02
    at24c02_rbx.zip

    Пример-1 използвам за бърз тест на работоспособността на интегралната схема и контрол на съдържанието в паметта.

    Функциите са достъпни през Arduino Serial Monitor. Скорост: 57 600 бода.

    ***
    r — четене на данни от цялото адресно пространство

    ***
    b — изтриване (запис с 0xFF) на клетките в EEPROM (и последващо автоматично четене за визуална проверка на състоянието)

    ***
    x — запис на всички клетки в адресното пространство с псевдо-случайни данни (и последващо автоматично четене за визуална проверка на състоянието)

    Забележка: Програмният код (или части от него) е за некомерсиалнно използване!

    LZ2WSG, Силистра
    25 октомври 2018 година