Главная » Статьи » Как подключить |
Работа с внешней EEPROM в Bascom-AVR на примере 24lc08
Когда нужно длительное время хранить какие-нибудь рабочие данные, не боясь их потерять, используют штатную, встроенную в микроконтроллер, EEPROM память. Обычно размер этой памяти не велик и его хватает только для хранения каких-то небольших по объему данных, например пользовательских настроек или т.п. А если нужно хранить данные размером десяток килобайт, то понятно что
встроенной памятью не обойтись и
нужно подключать внешнее устройство хранения. И тут как нельзя лучше подходят внешние микросхемы EEPROM. Например микросхемы из серии 24LCxx от компании Microchip. Эти микросхемы поддерживают подключение по протоколу I2C и умеют хранить от 512 байт до 128 килобайт данных. К тому же, старшие модели могут работать в связке из себе подобных, таким образом размер памяти может быть увеличен за счет присвоения микросхемам памяти индивидуального адреса на I2C шине. В младших же моделях, все микросхемы имеют фиксированный адрес 1010.
В номенклатуре Microchip серии 24LC числовое значение после буквенного индекса обозначает объем памяти в килобитах. Так, подопытная микросхема 24LC08 имеет на борту 8 килобит пространства под хранение данных (или 1 килобайт). Подключение микросхемы Данная микросхема выпускается в различных корпусах: DIP, SOIC, TSOP, DFN. Для каждого восьминогового типа корпуса сохраняется распиновка контактов. Такое же расположение контактов имеют микросхемы старших моделей, поэтому они запросто могут быть заменены в случае нехватки ресурсов, без изменения типологии платы. Назначение выводов микросхемы смотрим ниже: A0, A1, A2 - в данной микросхеме не используются, в старших моделях они служат для присвоения микросхеме индивидуального адреса на I2C шине. SDA – линия данных SCL – линия тактовых импульсов WP – защита от записи. Если на данный вывод подан логический 0, то запись в память разрешена. Если подать логическую единицу, то возможно только чтение из памяти. Vcc – питание микросхемы. Напряжение может быть в пределах от 2.5 вольта до 5.5 вольта. Vss – земля. К микроконтроллеру микросхема подключаются следуя традициям протокола I2C, тоесть сигнальные линии подтягиваются к шине питания через резисторы номиналом 4,7к. Неиспользуемые выводы A0, A1, A2 можно посадить на землю (IC1 в примере Attiny2313) Организация памяти Для того чтобы понять принцип работы с микросхемами памяти, нужно разобраться как происходит адресация внутри микросхемы. В подопытной микросхеме 24LC08 все пространство памяти поделено на 4 блока по 256 байт в каждом блоке. Каждый блок имеет свой адрес. При обращении к микросхеме ведущее устройство (микроконтроллер) отправляет адрес устройства (он у нас фиксированный 1010) и адрес блока с которым нужно работать. Затем отправляется адрес ячейки в которую нужно записать/прочитать данные. Что нужно сделать с данными - прочитать или записать - зависит от бита в конце посылки. Разберем на примерах. Запись данных Для записи в микросхему одного байта, нужно выполнить следующую последовательность действий:
К примеру запишем один байт &hFF в первую ячейку памяти первого блока (адрес блока &b000, адрес ячейки &h00).
$regfile = "2313def.dat"
$crystal = 1000000 'конфигурируем scl и sda пины Config Sda = Portb.7 'I2C Data Config Scl = Portb.6 'I2C Clock Wait 1 'работа с микросхемой I2cstart 'даем сигнал старт i2c шине I2cwbyte &B10100000 'отправляем адрес микросхемы и адрес блока I2cwbyte &H00 'отправляем адрес ячейки I2cwbyte &HFF 'отправляем байт, который нужно записать I2cstop 'останавливаем работу i2c End Постраничная запись Для увеличения скорости записи данных существует метод постраничной записи. Одна страница - это область из 16 байт (один столбец на картинке выше). При постраничной записи адрес записываемой ячейки увеличивается автоматически, поэтому не нужно каждый раз вручную прописывать адрес. Для записи одной страницы отправляем адрес первой ячейки и затем 16 раз отправляем необходимые данные, причем если отправить 17 байт, то последний байт перезапишет первый и т.д. Для примера запишем первую страницу первого блока. Адрес первой ячейки &h00.
$regfile = "2313def.dat"
$crystal = 1000000 'конфигурируем scl и sda пины Config Sda = Portb.7 'I2C Data Config Scl = Portb.6 'I2C Clock Wait 1 'работа с микросхемой I2cstart 'даем сигнал старт i2c шине I2cwbyte &B10100000 'отправляем адрес микросхемы и адрес блока I2cwbyte &H00 'отправляем адрес первой ячейки I2cwbyte &HF0 'отправляем 1 байт I2cwbyte &HF1 'отправляем 2 байт I2cwbyte &HF2 'отправляем 3 байт I2cwbyte &HF3 'отправляем 4 байт I2cwbyte &HF4 'отправляем 5 байт I2cwbyte &HF5 'отправляем 6 байт I2cwbyte &HF6 'отправляем 7 байт I2cwbyte &HF7 'отправляем 8 байт I2cwbyte &HF8 'отправляем 9 байт I2cwbyte &HF9 'отправляем 10 байт I2cwbyte &HFA 'отправляем 11 байт I2cwbyte &HFB 'отправляем 12 байт I2cwbyte &HFC 'отправляем 13 байт I2cwbyte &HFD 'отправляем 14 байт I2cwbyte &HFE 'отправляем 15 байт I2cwbyte &HFF 'отправляем 16 байт I2cstop 'останавливаем работу i2c End Здесь записывается вся первая страница числами от 240 (в шестнадцатеричной системе F0) до 255 (FF). Чтение данных Теперь разберем как прочитать записанные в микросхему данные. Для чтения одного байта нужно проделать следующее:
Чтение первой ячейки первого блока будет выглядеть так:
$regfile = "2313def.dat" $crystal = 1000000 Dim A As Byte 'переменная для хранения прочитанного байта 'конфигурируем scl и sda пины Config Sda = Portb.7 'I2C Data Config Scl = Portb.6 'I2C Clock Wait 1 'работа с микросхемой I2cstart 'даем сигнал старт i2c шине I2cwbyte &B10100000 'отправляем адрес микросхемы и адрес блока I2cwbyte &H00 'отправляем адрес ячейки I2cstart 'снова отправляем старт
I2cwbyte &B10100001 'отправляем адрес микросхемы и адрес блока 'на конце посылки теперь будет 1 - бит чтения I2crbyte A , Nack 'кладем в переменную А прочитанный байт 'командой Nack прекращаем отправку данных I2cstop 'останавливаем работу i2c End Прочитаный байт записывается в переменную А, командой Nack мы прекращаем отправку микросхемой данных. Если эту команду заменить на Ack, то микросхема продолжит слать данные с ячеек, расположенных следом. Таким образом можно прочитать всю микросхему разом, отправляя команду I2crbyte Variable, Ack необходимое количество раз. А теперь практический пример. К микроконтроллеру подключен датчик температуры ds18b20, на дисплей выводится текущая температура и значение температуры, которое было записано в память микросхемы 24LC08. Запись температуры в память микросхемы происходит при нажатии на кнопку PB2, считывание и вывод записанного значения происходит при нажатии на кнопку PB1. Как видно работать с внешней EEPROM очень даже просто, если будут вопросы, складывайте их в комментариях. Удачи!
| |
Просмотров: 47796 | Комментарии: 30
| Теги: |
Всего комментариев: 30 | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
авторизация
рубрики
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |
метки