- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 1. Архитектура и аппаратные средства микроконтроллера LPC214x
- •1.1 Общие сведения о микроконтроллерах LPC214x
- •1.2 Программистская модель процессорного ядра ARM7TDMI
- •1.2.1 Режимы работы ядра ARM7
- •1.2.2 Система регистров
- •1.2.3 Слово состояния программы
- •1.2.4 Организация памяти
- •1.3 Система команд
- •1.3.1 Команды арифметической и логической обработки
- •1.3.2 Команды умножения
- •1.3.3 Команды регистровой пересылки
- •1.3.4 Команды загрузки и сохранения регистров
- •1.3.5 Команды пакетного обмена с памятью
- •1.3.6 Команды передачи управления
- •1.3.7 Команды обращения к слову состояния программы
- •1.4 Методы адресации
- •1.4.1 Непосредственная адресация
- •1.4.2 Регистровая адресация
- •1.4.3 Косвенная адресация
- •1.4.4 Индексная адресация
- •1.5 Процедура начальной загрузки и режимы отображения памяти
- •1.6 Обработка исключительных ситуаций
- •1.7 Система тактирования
- •1.7.1 Выбор тактовой частоты микроконтроллера
- •1.7.2 Настройка тактирования периферийных устройств
- •1.8 Модуль ускорения памяти
- •1.9 Внешние выводы микроконтроллера
- •1.9.1 Служебные контакты
- •1.9.2 Программно-управляемые линии ввода-вывода
- •1.9.3 Альтернативные функции линий ввода вывода
- •1.10 Цифровые порты ввода-вывода
- •1.10.1 Управление портом через низкоскоростную шину
- •1.10.2 Управление портом через высокоскоростную шину
- •1.11 Система прерываний
- •1.11.1 Назначение системы прерываний
- •1.11.2 Процесс обработки прерываний IRQ
- •1.11.3 Процесс обработки быстрых прерываний FIQ
- •1.11.4 Регистры управления системой прерываний
- •1.11.5 Порядок настройки прерывания IRQ
- •1.11.6 Порядок настройки быстрого прерывания FIQ
- •1.11.7 Процедура обработки прерывания
- •1.11.8 Задержка обработки прерывания
- •1.12 Внешние прерывания
- •1.12.1 Регистры управления блоком внешних прерываний
- •1.12.2 Порядок настройки блока внешних прерываний
- •1.13 Таймеры-счетчики
- •1.13.1 Режим таймера и схема совпадения
- •1.13.2 Режим счетчика
- •1.13.3 Схема захвата
- •1.13.4 Управляющие регистры
- •1.13.5 Формирование интервалов времени через систему прерываний
- •1.13.6 Измерение периода и длительности импульса с помощью устройства захвата
- •1.13.7 Подсчет числа импульсов в единицу времени
- •1.14 Широтно-импульсный модулятор
- •1.14.1 Основы функционирования
- •1.14.2 Дополнительные возможности
- •1.14.3 Регистры управления ШИМ
- •1.14.4 Порядок настройки ШИМ
- •1.15 Аналого-цифровые преобразователи
- •1.15.1 Краткие сведения о встроенных АЦП
- •1.15.2 Общие рекомендации по использованию АЦП
- •1.15.3 Управляющие регистры
- •1.15.4 Порядок настройки АЦП
- •1.15.5 Программный запуск аналого-цифрового преобразователя
- •1.15.6 Запуск аналого-цифрового преобразователя по таймеру
- •1.15.7 Программный опрос готовности АЦП
- •1.15.8 Опрос готовности АЦП по прерыванию
- •1.15.9 Считывание и масштабирование результата АЦП
- •1.16 Цифро-аналоговый преобразователь
- •1.16.1 Регистр управления ЦАП
- •1.16.2 Рекомендации по применению ЦАП
- •1.17 Последовательный синхронный приемо-передатчик SPI
- •1.17.1 Назначение и основы функционирования интерфейса SPI
- •1.17.2 Управляющие регистры
- •1.17.3 Передача и прием данных в режиме ведущего
- •1.17.4 Передача и прием данных в режиме ведомого
- •1.18 Последовательный синхронный приемо-передатчик I2С
- •1.18.1 Назначение и основы функционирования интерфейса I2С
- •1.18.2 Управляющие регистры
- •1.18.3 Настройка модуля I2C
- •1.18.4 Типовые циклы обмена данными по шине I2C
- •1.19 Последовательный асинхронный приемопередатчик UART
- •1.19.1 Назначение и основы функционирования порта UART
- •1.19.2 Управляющие регистры
- •1.19.3 Настройка порта UART
- •1.19.4 Прием байта с опросом флага
- •1.19.5 Передача байта с опросом флага
- •1.19.6 Прием и передача данных с использованием прерываний
- •1.19.7 Прием и передача пакетов данных
- •1.19.8 Диагностика ошибок
- •1.19.9 Автоматическая настройка скорости
- •1.20 Часы реального времени
- •1.20.1 Основные возможности часов реального времени
- •1.20.2 Управляющие регистры
- •1.20.3 Рекомендации по применению
- •1.21 Управление питанием и идентификация источников сброса
- •1.21.1 Краткие сведения о мониторе питания
- •1.21.2 Управляющие регистры
- •Часть 2. Разработка и отладка программ с помощью современных инструментальных средств
- •2.1 Форматы представления чисел
- •2.1.1 Основные коды представления целых чисел
- •2.1.2 Форматы представление целых чисел, приятные в языке Си
- •2.1.3 Форматы чисел c плавающей точкой стандарта IEEE754
- •2.2 Основы программирования на языке Си
- •2.2.1 Структура программы
- •2.2.2 Числовые константы
- •2.2.3 Переменные и именованные константы
- •2.2.4 Оператор присваивания, выражения и операции
- •2.2.5 Условный оператор
- •2.2.6 Приведение и преобразование типов
- •2.2.7 Массивы
- •2.2.8 Строки символов
- •2.2.9 Структуры
- •2.2.10 Объединения
- •2.2.11 Указатели
- •2.2.12 Ветвление
- •2.2.13 Множественное ветвление
- •2.2.14 Цикл со счетчиком
- •2.2.15 Циклы с предусловием и постусловием
- •2.2.16 Функции
- •2.2.17 Некоторые директивы компилятора
- •2.2.18 Библиотека математических функций MATH.h
- •2.2.19 Функция создания форматированных строк SNPRINTF
- •2.2.20 Ассемблер в Си-программах
- •2.3 Интегрированная среда разработки Keil µVision 4
- •2.3.1 Создание проекта
- •2.3.2 Создание файла программы
- •2.3.3 Настройка проекта
- •2.3.4 Набор текста программы
- •2.3.5 Компиляция программы
- •2.3.6 Отладка программы
- •2.3.7 Основные отладочные инструменты среды Keil µVision 4
- •2.3.8 Управление распределением памяти
- •2.4 Методика отладки программ
- •2.4.1 Быстрый поиск ошибок
- •2.4.2 Ввод и вывод дискретных сигналов
- •2.4.3 Таймер-счетчик. Формирование интервалов времени
- •2.4.4 Таймер-счетчик. Формирование внешних сигналов совпадения
- •2.4.5 Таймер-счетчик. Счетчик внешних событий
- •2.4.6 Таймер-счетчик. Устройство захвата
- •2.4.7 Широтно-импульсный модулятор
- •2.4.8 Аналого-цифровой преобразователь
- •2.4.9 Цифро-аналоговый преобразователь
- •2.4.10 Приемопередатчик SPI
- •2.4.11 Приемопередатчик I2C
- •2.4.12 Приемопередатчик UART
- •2.4.13 Часы реального времени
- •2.5 О программировании ARM7 на ассемблере
- •2.5.1 Основные правила записи программ на ассемблере
- •2.5.2 Псевдокоманды
- •2.5.3 Директивы ассемблера
- •2.5.4 Макросы
- •2.5.5 Пример простой программы
- •2.6 Распространенные средства разработки и отладки
- •2.6.1 Демонстрационные платы EA-EDU-001 и EA-EDU-011
- •2.6.2 Внутрисхемный отладчик J-Link
- •2.6.3 Утилиты программирования ПЗУ LPC Flash Utility и FlashMagic
- •2.6.4 Программа-терминал 232Analyzer
- •2.6.5 Низкоуровневый редактор диска DMDE
- •Часть 3. Решение типовых задач локального управления
- •3.1 Формирование временной задержки с помощью цикла
- •3.1.1 Задание
- •3.1.2 Общие рекомендации
- •3.1.3 Алгоритм программы
- •3.1.4 Отладка
- •3.1.5 Дополнительные сведения о формировании временной задержки
- •3.2 Формирование дискретного сигнала с помощью таймера
- •3.2.1 Задание
- •3.2.2 Общие рекомендации
- •3.2.3 Алгоритм программы
- •3.3 Опрос дискретного датчика или кнопки
- •3.3.1 Задание
- •3.3.2 Общие рекомендации
- •3.3.3 Алгоритм программы
- •3.3.4 Отладка
- •3.4 Опрос состояния механических контактов с подавлением дребезга
- •3.4.1 Задание
- •3.4.2 Общие рекомендации
- •3.4.3 Алгоритм программы
- •3.4.4 Отладка
- •3.5 Опрос клавиатуры с автоповтором
- •3.5.1 Задание
- •3.5.2 Общие рекомендации
- •3.5.3 Алгоритм программы
- •3.5.4 Отладка
- •3.6 Формирование импульсного управляющего сигнала с помощью модуля ШИМ
- •3.6.1 Задание
- •3.6.2 Общие сведения
- •3.6.3 Алгоритм программы
- •3.6.4 Отладка
- •3.6.5 Синхронизация внешним сигналом
- •3.7 Формирование сигналов специальной формы с помощью ЦАП
- •3.7.1 Задание
- •3.7.2 Основы
- •3.7.3 Алгоритм программы
- •3.7.4 Повышение точности генерирования частоты
- •3.7.5 Выбор числа дискрет
- •3.8 Управление двухфазным шаговым двигателем
- •3.8.1 Задание
- •3.8.2 Общие сведения
- •3.8.3 Алгоритм программы
- •3.9 Применение ШИМ для формирования низкочастотных аналоговых сигналов
- •3.9.1 Задание
- •3.9.2 Основные сведения
- •3.9.3 Алгоритм основной программы
- •3.9.4 Алгоритм процедуры обработки прерывания
- •3.10 Управление символьным жидкокристаллическим индикатором
- •3.10.1 Задание
- •3.10.2 Управление модулем жидкокристаллической индикации
- •3.10.3 Разработка функции управления ЖКИ с ожиданием готовности
- •3.10.4 Функция вывода строки символов
- •3.10.5 Разработка функции инициализации модуля ЖКИ
- •3.10.6 Разработка тестовой программы
- •3.10.7 Управление ЖКИ с опросом флага готовности
- •3.10.8 Программирование произвольных символов
- •3.11 Управление матричным светодиодным индикатором
- •3.11.1 Задание
- •3.11.2 Основные рекомендации
- •3.11.3 Алгоритм основной программы
- •3.11.4 Алгоритм процедуры обработки прерывания
- •3.11.5 Реализация движения строки
- •3.12 Управление матричным жидкокристаллическим дисплеем
- •3.12.1 Управление дисплеем на основе контроллера PCF8833
- •3.12.2 Построение простейших геометрических фигур
- •3.13 Измерение постоянного напряжения
- •3.13.1 Задание
- •3.13.2 Основные рекомендации
- •3.13.3 Алгоритм основной программы
- •3.13.4 Алгоритм процедуры обработки прерывания от АЦП
- •3.13.5 АЦП с циклическим опросом нескольких каналов
- •3.13.6 Автоматический выбор пределов измерения
- •3.14 Измерение параметров уровня переменного напряжения
- •3.14.1 Задание
- •3.14.2 Основные рекомендации
- •3.14.3 Алгоритм основной программы
- •3.14.4 Алгоритм процедуры обработки прерывания
- •3.15 Измерение ускорения с помощью трехосевого акселерометра
- •3.16 Измерение интервалов времени с помощью таймера
- •3.16.1 Задание
- •3.16.2 Общие рекомендации
- •3.16.3 Алгоритм основной программы
- •3.16.4 Алгоритм процедуры обработки прерывания
- •3.16.5 Повышение разрешающей способности путем усреднения
- •3.16.6 Введение поправок
- •3.17 Измерение частоты с помощью счетчика
- •3.17.1 Задание
- •3.17.2 Основные рекомендации
- •3.17.3 Алгоритм программы
- •3.17.4 Повышение точности измерений
- •3.18 Опрос цифрового датчика температуры. Интерфейс I2C
- •3.18.1 Задание
- •3.18.2 Общие рекомендации
- •3.18.3 Алгоритм программы
- •3.20 Обмен данными с электрически перепрограммируемым ПЗУ
- •3.20.1 Задание
- •3.20.2 Общие сведения о микросхемах EEPROM
- •3.20.3 Адресация в микросхемах EEPROM
- •3.20.4 Порядок чтения EEPROM
- •3.20.5 Порядок записи EEPROM
- •3.20.6 Разработка программы чтения EEPROM
- •3.20.7 Разработка функции записи блока данных в EEPROM
- •3.21 Интерфейс RS-232. Прием и передача простых команд
- •3.21.1 Задание
- •3.21.2 Алгоритм программы
- •3.21.3 Автоматическая настройка скорости
- •3.22.1 Задание
- •3.22.2 Основные рекомендации
- •3.22.3 Алгоритм программы
- •3.23 Интерфейс RS-232. Прием пакета переменной длины
- •3.23.1 Задание
- •3.23.2 Основы реализации
- •3.23.3 Алгоритм программы
- •3.24 Обмен данными с картой памяти Secure Digital
- •3.24.1 Задание
- •3.24.2 Общие сведения о карах FLASH-памяти SD/MMC
- •3.24.3 Команды SD/MMC
- •3.24.4 Процедура инициализации карты
- •3.24.5 Чтение и запись данных
- •3.24.6 Обработка ошибок
- •3.24.7 Комментарии к алгоритму и программе
- •Алфавитный указатель управляющих регистров
- •Список литературы
- •Содержание
и блока 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