Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
403
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

и блока 11

TL=I2C0DAT; // Считать и сохранить старший байт

I2C0CONSET=0x10; // Сбросить состояние STOP (бит STO) break;

12.В последнем блоке множественного ветвления сбросить в ноль флаг занятости BusyFlag.

13.Сбросить флаг готовности I2C (SI) в регистре I2C0CONCLR. Это необходимо для выполнения следующей операции передачи данных.

14.Условие обеспечивает выполнение остальных блоков, связанных с индикацией результата, только после окончания обмена по I2C.

15.При формировании строк символов предлагается представить результат в формате с плавающей точкой. Учитывается, что целая часть совпадает со старшим байтом результата TH, а дробная часть состоит всего из одного старшего разряда байта TL. Предлагается следующее решение.

snprintf(S,9,"t=%2.1f\xDF""C",TH+(TL & 0x80)/256.0);

Формат строки таков:

t=31.5°C

Теперь ясно, что длина строки S — 9 символов.

16.Обновить изображение на ЖКИ, вызвав функцию PrintSymbol с параметром S и номером позиции индикатора.

17.Сгенерировать состояние START I2C, чтобы начать новый цикл измерений (бит STA в регистре I2C0CONSET).

18.Установить флаг занятости в единицу.

3.19Управление внешним портом дискретного ввода-вывода

3.20Обмен данными с электрически перепрограммируемым ПЗУ

3.20.1 Задание

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

2. Разработать программу, выполняющую запись массива данных в несколько последовательно расположенных адресов EEPROM. Диапазон адресов указывается преподавателем.

3.20.2 Общие сведения о микросхемах EEPROM

Электрически перепрограммируемое ПЗУ (EEPROM — Electrically Erasable Programmable Read-Only Memory) предназначено для долговремен-

ного хранения данных. Обычно выполняются в виде интегральных микросхем в восьмивыводном корпусе емкостью до 1 Мбита, для чтения и записи используют интерфейс I2C.

На плате EA-EDU-001 установлена микросхема CAT1025, которая представляет собой совмещенные супервизора питания и память EEPROM объемом 2 кбита. Микросхема подключена к каналу I2C0 микроконтроллера. Протокол обмена обычный для микросхем памяти. Поэтому, несмотря на

225

специфическое объединение функций, обмен данными выполняется так же, как для популярных микросхем, например, семейства AT24 фирмы Atmel.

3.20.3 Адресация в микросхемах EEPROM

Абсолютный адрес ячейки памяти, как правило, определяется двумя адресными частями: номером страницы и адресом байта внутри страницы. Номер страницы передается через один или несколько битов адреса устройства на шине I2C. Адрес внутри страницы передается по I2С как один или два байта данных. Многостраничная память с точки зрения адресации шины I2C представлена как несколько логических устройств меньшего объема. В таблице 1.16.2 приведены несколько примеров. При указании формата адреса устройства на шине I2C использованы следующие обозначения: — бит адреса устройства, заданный логическим уровнем на входе ; — биты, идентифицирующие номер страницы памяти.

Таблица 3.20.1 – Организация адресации в некоторых микросхемах EEPROM

Тип

Емкость

Формат адреса

Разрядность адреса

микросхемы

страницы, кбит

байта внутри

шины I2C

(Atmel)

число страниц

 

страницы, бит

AT24C02B

 

 

8

 

 

 

 

AT24C04B

 

 

8

AT24C16B

 

 

8

AT24C256B

 

 

15

AT24C1024B

 

 

16

Адресация в микросхеме CAT1025 идентична случаю AT24C02B, так как объемы памяти совпадают. Однако CAT1025 физически не имеет адресных входов . Они считаются равными нулю.

3.20.4 Порядок чтения EEPROM

Чтение данных из EEPROM осуществляется в двух режимах. Соответствующие временные диаграммы показаны на рисунке 3.16.1.

1. Последовательное чтение с произвольного адреса. Передается START, адрес устройства с флагом записи (). Далее одноили двухбайтный адрес первой ячейки памяти, которую требуется прочитать (для CAT1025 адрес однобайтный). Затем повторяется состояние START с адресом устройства и флагом чтения (). После чтения каждого байта адрес автоматически инкрементируется. Читается один или несколько байт. Число байт ограничено только объемом памяти. Последний байт не подтверждается. Для последнего байта подтверждение не передается. Устанавливается состояние STOP.

Передача адреса ячейки памяти является не обязательной (верхние диаграммы на рисунке 3.20.1). Если она не выполняется, чтение продолжается с текущего адреса.

226

 

S

 

 

 

 

 

 

SDA

Адр. и № стр.

R/W

A

Адрес ячейки (1–2 байта)

A

 

S

 

 

 

 

 

 

SDA

Адр. и № стр.

R/W

A

Байт 0

A

 

 

 

 

 

 

P

 

 

SDA

A

Байт N – 1

A

 

Генерируется ведущим

 

 

 

 

 

 

 

 

 

Генерируется ведомым

Рисунок 3.20.1 – Временные диаграммы чтения данных из EEPROM

3.20.5 Порядок записи EEPROM

Запись данных производится побайтно или блоками. Максимальный размер блока зависит от типа микросхемы и обычно составляет от 8 до 256 байт (для CAT1025 16 байт). После передачи каждого блока необходимо выдерживать паузу (типовое значение 5 мс). Поэтому для сокращения временных затрат следует стремиться осуществлять запись именно блоками.

Временные диаграммы для записи в EEPROM показаны на рисунке

3.20.1.

Для записи байта или блока необходимо передать состояние START, адрес устройства и флаг записи (). Затем повторный START также с флагом записи и одоили двухбайтный адрес первой ячейки памяти. Далее передаются один или несколько байт данных. Число байт не должно превышать максимально допустимый размер блока. Устанавливается состояние STOP. Как и в случае чтения, задавать адрес ячейки памяти (верхняя диаграмма) не обязательно. Можно продолжить запись с текущего адреса.

 

S

 

 

 

 

 

SDA

Адр. и № стр.

R/W

A

Адрес ячейки (1–2 байта)

A

 

 

 

 

 

 

P

SDA

Байт 0

A

 

A

Байт N – 1

A

 

 

 

Генерируется ведомым

Генерируется ведущим

Рисунок 3.20.2 – Временные диаграммы записи данных в EEPROM

3.20.6 Разработка программы чтения EEPROM

В программе используется следующие глобальные переменные:

а) Data массив байтов из 256 элементов, предназначенный для хранения данных, прочитанных их памяти;

б) счетчик n целого типа;

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

г) строка s из 11 символов для индикации.

Потребуется также задать две целочисленные константы: а) Addr — адрес первого байта, читаемого из памяти;

227

б) N — число байт, читаемых из памяти.

Значения констант устанавливаются определяют диапазон адресов памяти и назначаются преподавателем.

К программе требуется подключить файлы STDIO.h и LCD.c. Алгоритм программы показан на рисунке 3.20.3 Структура програм-

мы напоминает рассмотренную в предыдущем разделе, так как основное место отводится опросу готовности шины I2C, анализу текущего состояния и формирования нового.

1–3. Назначение блоков подробно рассмотрено в разделе 3.18.

4. Сформировать состояние START путем записи кода 0x20 в регистр I2C0CONSET. Операция идентична блоку 17 в предыдущем разделе.

5–7. Реализовать циклическую проверку готовности шины I2C (бит SI регистра I2C0CONSET) до тех пор, пока флаг завершения чтения Finish не установится в единицу. При обнаружении готовности () проанализировать текущее состояние через конструкцию множественного ветвления. Общая форма блоков 5–7 предлагается такой:

while (!Finished)

 

if (I2C0CONSET & 0x08)

 

{

 

switch (I2C0STAT)

 

{

 

...

// Блоки 8–17

}

 

...

// Блок 18

}

Взаимодействие с модулем I2C рассмотрено в предыдущем разделе. Здесь прокомментируем выборочно несколько блоков.

8. Снять состояние START. Передать адрес устройства и флаг записи.

I2C0CONCLR=0x20; // Снять START (бит STA) I2C0DAT=0xA0; // Адрес 1010000; R/W = 0 break;

9. Передать адрес ячейки памяти, записав константу Addr в регистр

I2C0DAT.

11. Сбросить состояние START, снова передать адрес устройства и флаг чтения, разрешить подтверждение.

I2C0CONCLR=0x20;

// Снять START (бит STA)

I2C0CONSET=0x04;

// Разрешить подтверждение (бит АA)

I2C0DAT=0xA1;

// Адрес 1010000; R/W = 1

break;

 

12–13. Блоки можно реализовать одной командой

Data[n++]=I2C0DAT;

14–15. Запретить подтверждение (бит AA в регистре I2C0CONCLR), если принимается предпоследний байт, то есть . Заметим, что к

228

этому моменту инкремент счетчика n уже прошел (в блоке 13), поэтому при приеме предпоследнего байта действительно .

16. Сохранить последний байт из I2CDAT в массив Data, установить состояние STOP.

 

 

 

 

 

 

 

 

 

 

 

 

0x08

 

 

 

 

 

Начало

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8 Сброс START,

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

Инициализация

передача адреса и W

 

 

 

 

 

ЖКИ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2 Настройка режима

0x18

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9

 

 

 

 

 

 

 

линий P0.2 и P0.3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Передача адреса байта

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Настройка I2C

0x28

 

 

 

 

 

 

 

 

 

 

 

 

 

4 Установка START

10 Повторный Start

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0x10

 

 

 

 

 

Нет

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11

 

 

 

 

 

 

 

Finish = 0?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сброс START,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

передача адреса и R,

 

 

 

 

 

 

 

 

Да

 

 

 

 

 

разр. подтверждение

 

 

 

 

6

 

 

 

 

 

Нет

0x50

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Готовность I2C

 

 

 

 

 

 

 

 

 

 

 

12 Сохранить байт

 

 

 

 

 

 

 

 

Да

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

в Data[n]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

 

 

 

 

 

 

 

 

13

 

 

 

 

 

 

 

Состояние I2C

 

 

 

 

 

 

 

 

 

 

 

n = n + 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14

 

 

Нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

19

 

 

 

 

 

 

 

 

n = N 1 ?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Индикация

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Да

 

 

 

 

20

 

 

 

 

 

 

 

 

15

 

 

 

 

 

 

 

Пустая команда

Запретить

 

 

 

 

 

 

 

 

 

 

 

 

 

 

подтверждение

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0x58

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Иначе

16 Сохранить байт

 

 

 

 

 

 

 

 

 

 

 

 

 

 

в Data[n];

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

18 Сбросить флаг

установка STOP

 

 

 

 

 

 

 

 

 

 

 

2

C

17

 

 

 

 

 

 

 

готовности I

Finish = 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рисунок 3.20.3 – Схема программы чтения массива данных их памяти EEPROM

229