Найти в Дзене
Электроника и жизнь

Особенности работы с библиотекой Wire в среде Arduino IDE

Здравствуйте, уважаемые читатели! В этой статье хотел бы чуть подробнее разобрать особенности работы библиотеки Wire в среде Arduino IDE. Эти особенности я хотел бы рассмотреть на примере записи данных во внешнюю EEPROM. Если взять для примера модуль EEPROM 24LC512, размером памяти 64 КБ, и открыть картинку 6-2, то можно увидеть, что кроме записи по одному байту, можно записывать блок данных, размером 128 байт. Но если мы в среде Arduino IDE попробуем записать блок данных из 128 байт, то открыв Монитор порта, увидим, что записалось только первые 30 байт, а остальные нули: Это происходит из-за того, что в самой библиотеки действует ограничение максимального размера буфера хранения данных в 32 байта (define BUFFER_LENGTH 32): Т.е. как раз 2 байта мы тратим на задание адреса ячейки памяти, куда будут записываться данные и 30 байт - сами данные. После выполнения функции Wire.endTransmission() данные из буфера библиотеки записываются в EEPROM память. Т.е. максимально за один раз, мы можем

Здравствуйте, уважаемые читатели! В этой статье хотел бы чуть подробнее разобрать особенности работы библиотеки Wire в среде Arduino IDE.

Эти особенности я хотел бы рассмотреть на примере записи данных во внешнюю EEPROM. Если взять для примера модуль EEPROM 24LC512, размером памяти 64 КБ, и открыть картинку 6-2, то можно увидеть, что кроме записи по одному байту, можно записывать блок данных, размером 128 байт.

-2

Но если мы в среде Arduino IDE попробуем записать блок данных из 128 байт, то открыв Монитор порта, увидим, что записалось только первые 30 байт, а остальные нули:

-3

Это происходит из-за того, что в самой библиотеки действует ограничение максимального размера буфера хранения данных в 32 байта (define BUFFER_LENGTH 32):

-4

Т.е. как раз 2 байта мы тратим на задание адреса ячейки памяти, куда будут записываться данные и 30 байт - сами данные.

-5

После выполнения функции Wire.endTransmission() данные из буфера библиотеки записываются в EEPROM память. Т.е. максимально за один раз, мы можем передать всего 30 байт информации. Но здесь существует еще одна особенность работы с библиотекой.

Например мы хотим записать в память EEPROM 600 байт информации и для этого создаем цикл, где 20 раз передадим модулю EEPROM по 30 байт.

Как только мы доберемся до адреса 255, у нас далее возникнет сбой в записанной информации:

-6

Та же картина будет наблюдаться каждые 256 байт (т.е. 512 байт, 768 байт и т.д.). А вот если мы изменим число передаваемых байт до 16, то ошибка исчезает.

Я полагаю, что в самой библиотеке добавляя единицу к адресу 255 мы не получаем адрес 256, а возможно получаем адрес 0 или вообще какой-то случайный адрес. Записывая блоки по 30 байт, 8 блоков у нас запишется нормально, т.к. они укладываются в первые 256 байт. А вот с девятым как раз и возникнет проблема, т.к. он как раз накладывается на переход от 255 байта к 256 байту.

-7

А вот когда мы записываем блоками по 16 байт, такой проблемы не возникает, т.к. последний 16 блок, заканчивается на 255 байте, а с 256 байта начинается новый блок, адрес первого байта которого мы указываем перед началом записи блока.

-8

Таким образом, при записи больших объемов данных в EEPROM с использованием библиотеки Wire, размер записываемого блока данных должен быть кратен двум (2, 4, 8, 16). А максимальный размер записываемого блока данных составляет 16 байт.

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

-9

Вот такую особенность нужно учитывать при работе с библиотекой Wire в среде Arduino IDE.

Видео по материалам статьи:

Спасибо, что дочитали до конца! Если статья понравилась, нажмите, пожалуйста, соответствующую кнопку. Если интересна тематика электроники и различных электронных самоделок, подписывайтесь на канал. До встречи в новых статьях!