Главная » Статьи » Как подключить

Работа с внешней 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) и адрес блока с которым нужно работать.
Затем отправляется адрес ячейки в которую нужно записать/прочитать данные. Что нужно сделать с данными - прочитать или записать - зависит от бита в конце посылки. Разберем на примерах.

 Запись данных  

 Для записи в микросхему одного байта, нужно выполнить следующую последовательность действий:
  1. Сконфигурировать интерфейс I2C
  2. Отослать стартовый бит
  3. Отослать адрес микросхемы + адрес блока памяти. В конце посылки должен стоять 0 (бит записи)
  4. Отослать адрес ячейки памяти в которую будет производится запись
  5. Отослать байт данных
  6. Отослать стоповый бит

 К примеру запишем один байт &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). 


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

 Теперь разберем как прочитать записанные в микросхему данные. Для чтения одного байта нужно проделать следующее:
  1. Сконфигурировать интерфейс I2C 
  2. Отправить стартовый бит
  3. Отправить адрес микросхемы + адрес блока памяти откуда нужно читать
  4. Отправить адрес ячейки памяти
  5. Снова отправить стартовый бит
  6. Отправить адрес микросхемы и адрес блока памяти с битом «чтение»
  7. Получить байт
  8. Отправить стоповый бит
Чтение первой ячейки первого блока будет выглядеть так:

$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 очень даже просто, если будут вопросы, складывайте их в комментариях. Удачи!
Категория: Как подключить | Добавлено: 18.09.2011
Просмотров: 47796 | Комментарии: 30 | Теги: Логика, eeprom, I2C | Рейтинг: 4.9/14
Всего комментариев: 30
30 xorkrus   (26.12.2017 16:24) [Материал]
А можно пример для 24C512 или аналогичной?
Что-то я как ни ткнусь - уменя считывается 255

0  
29 exersizze   (07.05.2017 07:30) [Материал]
А, имелось ввиду про ножки микросхемы?. Так эти выводы меняют физический адрес микросхемы, а не адрес блока к которому обращаемся. Конкретно в этой микросхеме адрес прошит и не меняется, поэтому ножки не используются.

28 marss70   (01.05.2017 21:32) [Материал]
Тогда получается, что без физического изменения(например, перемычками) комбинации на ножках 1,2,3(А0,А1,А2) не прочитать всю память, а только один блок, или же всё же ножки 1,2,3(А0,А1,А2)- это адрес самой микросхемы? Как тогда у Вас в логгере температуре получается прочитать все 64(16х4) страницы?

0  
27 exersizze   (01.05.2017 14:35) [Материал]
Ага, на блок-схеме красным обозначены адреса блоков. Для третьего блока соответственно 010, для четвертого 011.

26 marss70   (01.05.2017 10:21) [Материал]
Я так понимаю, адрес блока формируется комбинацией А2,А1,А0? Тогда получается, что если надо прочитать второй блок, нужно менять комбинацию на А2,А1,А0 на 001?

25 Cerber   (08.09.2014 07:57) [Материал]
Разобрался таки как писать и читать эту память. Весьма удобная микра. Главное чтоб программа не записывала данные постоянно или часто. Иначе микросхема долго не проживет. Ресурс записи не такой уж большой.

24 Cerber   (04.02.2013 09:41) [Материал]
Постраничная запись удобнее всего. Но 15 байт... Это не мало. Даже не знаю какой способ записи\чтения выбрать...

23 exersizze   (02.05.2012 20:59) [Материал]
таким образом устанавливая разную комбинацию уровней на этих ногах, можно выбирать адрес микрухи из восьми комбинаций.

22 exersizze   (02.05.2012 20:56) [Материал]
вырезка из даташита на 24lc256:
"К одной шине можно подключать до восьми устройств, используя различные комбинации битов выбора микросхемы. Если эти выводы остаются неподключенными, входы внутренне будут притянуты к Vss. Если они подключены к Vcc или на них подаётся высокий уровень, внутренняя схема притягивания к нулю отключается."

21 amv2000   (02.05.2012 20:35) [Материал]
А вот тут не понял? это как с помощью ног А0-А2 можно на примере...

20 exersizze   (02.05.2012 00:12) [Материал]
Нет, с FM25CL64-S пока не сталкивался. Адрес у некоторых крупных микросхем памяти может выбираться вручную с помощью ног А0-А2, поэтому лучше уточнить по даташиту

19 amv2000   (01.05.2012 16:36) [Материал]
У AT24C1024W я так понял тоже адрес 1010 ?
Вы не работали с памятью FM25CL64-S ?

18 exersizze   (27.04.2012 08:36) [Материал]
Ну если скорость критична, то можно отказаться от задержки. Думаю и без нее будет нормально работать, при постраничной записи записывается вся страница целиком и никаких проблем не возникает.

17 amv2000   (26.04.2012 22:45) [Материал]
Встретил такой код записи:
Adr = Adr * 2
If W_r = 0 Then ' проверка чтения записи
I2cstart ' даем сигнал старт i2c шине
I2cwbyte &HA0 ' отправляем адрес микросхемы и адрес блока (I2cwbyte &B10100000)
I2cwbyte Adr ' отправляем адрес ячейки
I2cwbyte U 'записываем данные
I2cwbyte Iz ' отправляем байт, который нужно записать
I2cstop ' останавливаем работу i2c
Waitms 20 ' задержка 20ms необходима для
' EEPROM после каждой записи
Вопрос, нужна ли вообще задержка после процедуры записи-чтения.

+1   Спам
16 rk2555   (27.03.2012 20:32) [Материал]
Спасибо, всё понятно. Вот дорисовал вашу картинку адресации для наглядности :

15 exersizze   (26.03.2012 22:58) [Материал]
Да, каждый раз указывая адрес блока и страницы для записи. Начало второй страницы имеет адрес &H10

+1   Спам
14 rk2555   (26.03.2012 19:10) [Материал]
...Для записи одной страницы отправляем адрес первой ячейки и затем 16 раз отправляем необходимые данные, причем если отправить 17 байт, то последний байт перезапишет первый и т.д.....
А как записать ,например, вторую страницу, третью или всю микросхему сразу? Подскажите пожалуйста. Прописывать каждый раз начальные адреса страниц и блоков что ли? Для второй страницы будет так?:

I2cwbyte &H02 'отправляем адрес ячейки

13 exersizze   (02.01.2012 13:32) [Материал]
По документации у серии 24lc гарантировано 1 миллион циклов записи/стирания. Есть серия 25lc, там уже 10 милиионов циклов.

12 Gordon_shumway   (02.01.2012 09:27) [Материал]
Доброго времени суток !

А каков ресурс этих микросхем памяти ?
Делаю девайс, который должен каждую минуту запоминать время в энергонезависимой памяти(некий логгер) на случай пропадания питания. Девайс работает по схеме 24/7. Использование энергонезависимой памяти микроконтроллера - не вариант, как я понимаю, быстро сработается. А как долго протянет 24LCXX ?

11 forter   (17.12.2011 15:26) [Материал]
Вот, смотрите, внизу странички http://decada.org.ru/project/lessons/bascom_avr/12
Можно попробовать объединить куски кода для Philips LPH7653 и, может быть все получится...

10 exersizze   (17.12.2011 14:49) [Материал]
интересная мысль! только придется неслабо перекроить библиотеку, а готовое мне не попадалось.

9 forter   (17.12.2011 13:52) [Материал]
Коллеги!
А нет ли у кого-нибудь мыслей (исходников) использовать такую память для сохранения картинок в такой памяти и последующей выгрузки их в дисплей Nokia 3310? Ведь есть память 24С512, а это - 64 Кбайта, можно и меню сложные организовать, и для много другого использовать.
По-моему, это хоть и будет значительно медленней, но зато сбережет память контроллера.

8 exersizze   (11.10.2011 19:33) [Материал]
Нужно добавить отправку второго байта, содержащего адрес микросхемы и адрес блока.
Сначала шлется байт содержащий старший байт адреса, а за ним - младший.
например код чтения для 24с256 http://bascomavr.3bb.ru/viewtopic.php?id=332

7 uaf   (11.10.2011 17:46) [Материал]
Здравствуйте.
Подскажите пожалуйста, как работать с памятью I2C
большого размера 24C512 - как работать с 2-х байтным адресом?
Если можно - пример записи/чтения.
Спасибо.

6 exersizze   (26.09.2011 11:44) [Материал]
Получается что да. Можно написать подпрограмму, в которой будем записывать или узнавать значения переменной: нужно значение переменной - вызвали подпрограмму чтения; нужно записать - подпрограмму записи.

5 tenevikus   (26.09.2011 08:55) [Материал]
получается я всегда должен знать куда что положил? нельзя однажды сохранив куда-то переменную test потом сразу же получить её значение?

4 Kir   (22.09.2011 08:41) [Материал]
Спасибо! разобрался smile

3 exersizze   (21.09.2011 20:23) [Материал]
верно, принцип работы абсолютно такой же; только там уже 8 блоков памяти по 256 кб с адресами от 000 до 111

2 amv2000   (21.09.2011 16:15) [Материал]
конечно серия одна же 24LCxx

1 Kir   (21.09.2011 15:53) [Материал]
Вот спасибо, как раз кстати! Имеется память 24lc16, там такаяже адресация?

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация