Samou4ka » 🐞 AVR.Начинающим » EEPROM в микроконтроллерах AVR

EEPROM в микроконтроллерах AVR

Почти во всех микроконтроллерах AVR есть память EEPROM (Electrically Erasable Programmable Read-Only Memory) — электрически стираемая программируемая постоянно запоминающая память. Память EEPROM сохраняет свое содержимое при отсутствии питания. Это бывает нужно, если мы хотим восстановить какие-то данные после перезагрузки микроконтроллера. Эта память находится в отдельном логическом и физическом пространстве. Как и для работы с другой периферией МК, для работы с EEPROM используются несколько регистров. Рассмотрим их.

EEAR — регистр адреса EEPROM. Если память превышает 256 байт, тогда для адресации используются два регистра — EEARH и EEARL (старший и младший байт регистра адреса). Чтобы записать или считать данные нужно записать в эти регистры адрес ячейки памяти в которую мы хотим записать или с которой хотим считать байт данных.

EEDR — регистр данных, хранит данные, которые будут записаны в EEPROM или прочитаны оттуда.

EECR — регистр управления EEPROM

Бит 3 — EERIE: разрешение прерывания. Прерывание генерится после того, как бит EEWE (см. ниже) очищается и если бит глобального прерывания I регистра SREG установлен.

Бит 2 — EEMWE: если этот бит установить и после этого в течение тактов установить бит EEWE, тогда произойдет запись байта из регистра EEDR в память по адресу EEAR. Если бит EEMWE сброшен, то установка EEWE не будет иметь никакого эффекта. Т.е. если мы в течение 4х тактов не успели установить EEWE, то придется снова устанавливать бит EEMWE.

Бит 1 — EEWE: разрешение записи в память. Если этот бит установлен, то запись разрешена. Если перед этим установить бит EEMWE, тогда произойдет запись байта в память.

Бит 0 — EERE: разрешение чтения из памяти. Если этот бит установлен, то данные по адресу записанному в регистре EEAR считываются и помещаются в регистр EEDR. После этого мы можем забрать данные.

Давайте подитожим. Чтобы записать байт в память EEPROM нужно:

  1. В цикле ждем пока бит EEWE сбросится.
  2. Записываем адрес в EEAR, по которому будем записывать байт.
  3. Записываем байт в регистр EEDR.
  4. Устанавливаем бит EEMWE.
  5. Устанавливаем бит EEWE.
  6. И все. Если мы записали во все регистры корректные данные, то на данном этапе байт записан в память.

Пример функции на ассемблере и на С для записи в EEPROM можно найти в даташите на МК.

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
while(EECR & (1<<EEWE));//ждем установки бита EEWE
EEAR = uiAddress;//устанавливаем адрес
EEDR = ucData;//записываем байт данных
EECR |= (1<<EEMWE);//устанавливаем EEMWE
EECR |= (1<<EEWE);//устанавливаем EEWE
}

Чтение производится практически также.

  1. Ждем пока бит EEWE сбросится.
  2. Записываем адрес в EEAR, по которому будем считывать байт.
  3. Устанавливаем бит EERE
  4. Теперь регистр EEDR содержит считанный байт

Пример функции из того же даташита

unsigned char EEPROM_read(unsigned int uiAddress)
{
while(EECR & (1<<EEWE));//ждем установки EEWE
EEAR = uiAddress;//устанавливаем адрес чтения
EECR |= (1<<EERE);//разрешаем чтение
return EEDR;//возвращаем прочитанный байт из функции
}
Как вам статья? Ваша реакция:
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0
Расскажите друзьям:
Оцените статью:
Оставить комментарий