
- •Содержание
- •Список сокращений
- •Введение
- •Структура микроконтроллера
- •Процессор микроконтроллера
- •Адресное пространство микроконтроллера
- •Подключение erom и eram к микроконтроллеру
- •Периферийные устройства микроконтроллера
- •Параллельные порты ввода-вывода
- •Таймер-счетчик т/с0
- •Таймер-счетчик т/с1
- •Последовательный порт
- •Контроллер прерываний
- •Система команд микроконтроллера
- •Общие сведения о языке Ассемблер для микроконтроллеров стандарта mcs-51 и о программном пакете фирмы 2500 a.D.
- •Синтаксис языка Ассемблер
- •Определители основания системы счисления
- •Макроопределения
- •Сообщения о некоторых ошибках ассемблирования
- •Рекомендуемая процедура инициализации микроконтроллера
- •Типичные применения микроконтроллеров
- •Ввод информации с датчиков
- •Опрос двоичного датчика
- •Ожидание события
- •Ожидание импульсного сигнала
- •Устранение дребезга контактов
- •Подсчет числа импульсов
- •Подсчет числа импульсов за интервал времени между двумя событиями
- •Подсчет числа импульсов за заданный промежуток времени
- •Опрос группы двоичных датчиков
- •Ввод информации с матричной клавиатуры
- •Вывод управляющих сигналов из микроконтроллера
- •Формирование статических сигналов
- •Формирование импульсных сигналов
- •Генерация меандра
- •Формирование сигнала с заданной скважностью
- •Вывод и отображение информации
- •Динамический вывод информации на дисплей из семисегментных индикаторов
- •Реализация функций реального времени
- •Программное формирование временной задержки
- •Формирование временной задержки с использованием таймеров
- •Измерение временных интервалов
- •Преобразование кодов
- •Преобразование унитарного кода в двоичный позиционный
- •Преобразование двоичного позиционного кода в унитарный
- •Преобразование кодов из одной системы счисления в другую
- •Преобразование данных из параллельного кода в последовательный и обратно
- •Цифро-аналоговое преобразование
- •Аналого-цифровое преобразование
- •Метод последовательного приближения
- •Метод двойного интегрирования
- •Операции с памятью
- •Тестирование озу
- •Программа тестирования пзу
- •Обмен данными по шине i2с
- •Общие положения и введение в логику работы шины i2с
- •Пример обмена данными по шине i2c
- •Приём данных по протоколу Centronics
- •Литература
Пример обмена данными по шине i2c
Рассмотрим обмен данными по протоколу I2C на конкретном примере – между микроконтроллером и микросхемой памяти с электрическим стиранием 24С16 ёмкостью 2048 B. Схема включения приведена на рисунке 4.30.
Рисунок 4.30 – Схема подключения микросхемы 24С16 к микроконтроллеру
Назначение входов SCL и SDA приведено выше. Вход WP – вход защиты от записи. Информация может быть записана в микросхему только при логическом 0 на этом входе.
На рисунке 4.31 приведена диаграмма записи байта в память.
Рисунок 4.31 – Диаграмма записи байта в память
DEVICE ADDRES (адрес устройства) – это 8-битное слово, имеющее следующий формат:
1 |
0 |
1 |
0 |
A10 |
A9 |
A8 |
|
где А8–А10 – старшая часть адреса, по которому будет записан байт данных (DATA);
– бит, определяющий тип операции (0 – запись, 1 – чтение).
После того как микросхеме передаётся «Stop»-условие, она выполняет внутренний цикл записи принятых данных по указанному адресу. При этом она не реагирует на внешние сигналы. Поэтому необходимо дождаться завершения этого процесса. Для этого выполняется попытка записи в микросхему адреса устройства. Приход сигнала подтверждения свидетельствует о завершении внутреннего цикла записи.
На рисунке 4.32 приведена диаграмма чтения байта из памяти.
Рисунок 4.32 – Диаграмма чтения байта из памяти
Листинг 4.41 содержит текст программы, реализующей тестирование микросхемы. В микросхему записывается тестовая информация. После этого выполняется её чтение и проверка правильности. Один байт тестовой информации – это адрес тестируемой ячейки, увеличенный на 2.
Листинг 4.41 – Программа тестирования микросхемы 24С16
SDA: |
.REG P1.0 |
; Линия SDA |
SCL: |
.REG P1.5 |
; Линия SCL |
WP: |
.REG P1.4 |
; Линия «Защита от записи» |
|
|
|
|
.ORG 0000H |
; Адрес начала программы |
|
|
|
|
CLR WP SETB SDA CLR SCL |
; Разрешение записи |
|
MOV DPTR, #0000H |
; В DPTR заносится адрес, ; по которому будут ; записаны данные |
NEXTW: |
|
|
|
MOV A, DPL |
; В аккумулятор заносится ; младшая часть адреса |
|
INC A |
; Увеличение содержимого ; аккумулятора на 2 |
|
INC A |
|
|
CALL WRITE |
; Вызов подпрограммы ; записи в память ; по протоколу I2C |
|
INC DPTR |
; Увеличение адреса |
|
MOV A, DPH |
; Проверка предела заполнения ; памяти и переход на начало ; цикла записи, если память ; заполнена не полностью |
|
CJNE A, #08H, NEXTW |
|
|
|
|
|
MOV DPTR, #0000H |
; В DPTR заносится адрес, ; из которого будут ; считаны данные |
NEXTR: |
|
|
|
CALL READ |
; Вызов подпрограммы ; чтения из памяти ; по протоколу I2C |
|
DEC A |
; Уменьшение считанного ; значения на 2 |
|
DEC A |
|
|
CJNE A, DPL, ERROR |
; Проверка правильности ; записанных данных ; Переход на подпрограмму ; ERROR, если данные ; записаны неправильно |
|
INC DPTR |
; Увеличение адреса |
|
MOV A, DPH |
; Проверка предела чтения ; памяти и переход на начало ; цикла чтения, если память ; считана не полностью |
|
CJNE A, #08H, NEXTR |
|
|
MOV A, #55H |
; В аккумулятор заносится ; 55H, если тест памяти ; пройден |
|
JMP BEGIN |
; Переход к основной ; программе |
|
|
|
ERROR: |
|
|
|
MOV A, #AAH |
; В аккумулятор заносится ; ААh, если обнаружена ошибка |
BEGIN: |
|
; Основная программа |
|
… |
|
; Подпрограмма записи байта информации в память по протоколу I2C |
||
WRITE: |
|
|
|
MOV 10H, A |
; В ячейке 10H сохраняются ; записываемые данные |
; Формирование адреса устройства (режим записи) |
||
|
MOV A, DPH |
; В аккумулятор заносится ; старшая часть адреса |
|
RL A |
; Выполняется сдвиг влево |
|
ANL A, #0EH |
; Обнуление битов 0, 4, 5, 6 и 7 |
|
ORL A, #A0H |
; Установка битов 5 и 7 |
|
MOV 11H, A |
; Сохранение адреса ; устройства в ячейке 11H |
|
||
|
LCALL START |
; Вызов процедуры, ; генерирующей «Start»- ; условие |
|
MOV A,11H |
; Запись адреса устройства |
|
LCALL BYTE |
|
|
MOV A,DPL |
; Запись младшего байта ; адреса |
|
LCALL BYTE |
|
|
MOV A,10H |
; Запись байта информации |
|
LCALL BYTE |
|
|
LCALL STOP |
; Вызов процедуры, ; генерирующей «Start»- ; условие |
|
|
|
|
MOV 1DH,#00H |
; Цикл ожидания ; подтверждения ; В цикле 256 раз выполняется ; подача «Start»-условия, ; запись адреса устройства, ; проверка подтверждения ; (логический 0 ; на линии SDA) и подача ; «Stop»-условия ; Как только приходит ; подтверждение, в ; аккумулятор ; помещается байт ; информации ; и выполняется выход из ; подпрограммы ; Если подтверждение не ; формируется, в аккумулятор ; помещается инверсное ; значение байта информации ; и выполняется выход из ; подпрограммы |
W3: |
|
|
|
DJNZ 1DH,W1 |
|
|
LJMP W2 |
|
W1: |
|
|
|
LCALL START |
|
|
MOV A,11H |
|
|
|
|
|
LCALL BYTE |
|
|
JC W3 |
|
|
|
|
|
LCALL STOP |
|
|
MOV A,10H |
|
|
RET |
|
W2: |
|
|
|
LCALL STOP |
|
|
MOV A,10H |
|
|
CPL A |
|
|
RET |
|
; Подпрограмма, генерирующая «Start»-условие |
||
START: |
|
|
|
SETB SCL |
|
|
CLR SDA |
|
|
CLR SCL SETB SDA |
|
|
RET |
|
|
|
|
; Подпрограмма выдачи байта в последовательной форме ; (Передаётся содержимое аккумулятора) |
||
BYTE: |
|
|
|
MOV 1CH, #08H |
; В ячейку 1CH помещается ; количество передаваемых ; бит |
WBIT: |
|
|
|
RLC A |
; Сдвиг содержимого ; аккумулятора влево ; (Старший бит ; помещается во ; флаг переноса) |
|
MOV SDA,C |
; Выдача «выдвинутого» бита ; в линию SDA |
|
SETB SCL |
; Формирование тактового ; импульса на линии SCL |
|
CLR SCL |
|
|
DJNZ 1CH, WBIT |
; Проверка условия выхода из ; цикла |
|
SETB SDA |
; Установка логической 1 на ; линии SDA |
|
SETB SCL |
; Установка логической 1 на ; линии SCL |
|
MOV C, SDA |
; Считывание сигнала ; подтверждения |
|
CLR SCL |
; Установка логического 0 на ; линии SCL |
|
RET |
; Выход из подпрограммы |
; Подпрограмма, генерирующая «Stop»-условие |
||
STOP: |
|
|
|
CLR SDA |
|
|
SETB SCL |
|
|
SETB SDA CLR SCL |
|
|
RET |
|
|
|
|
; Подпрограмма чтения байта информации из памяти по протоколу I2C |
||
READ: |
|
|
; Формирование адреса устройства (режим записи) |
||
|
MOV A, DPH |
|
|
RL A |
|
|
ANL A, #0EH |
|
|
ORL A, #A0H |
|
|
MOV 11H, A |
|
|
|
|
|
LCALL START |
; Вызов процедуры ; генерирующей «Start»- ; условие |
|
|
|
|
MOV A, 11H |
; Запись адреса устройства |
|
LCALL BYTE |
|
|
MOV A, DPL |
; Запись младшего байта ; адреса |
|
LCALL BYTE |
|
|
|
|
|
LCALL START |
; Вызов процедуры ; генерирующей «Start»- ; условие |
|
||
; Формирование адреса устройства (режим чтения) |
||
|
MOV A, 11H |
|
|
SETB ACC.0 |
|
|
LCALL BYTE |
; Запись адреса устройства |
; Подпрограмма приёма байта в последовательной форме ; (Результат сохраняется в аккумуляторе) |
||
|
MOV R0, #08H |
; В регистр R0 помещается ; количество принимаемых ; бит |
RBIT: |
|
|
|
SETB SCL |
; Установка логической 1 на ; линии SCL |
|
MOV C, SDA |
; Сохранение состояния ; линии SDA (бит информации) |
|
RLC A |
; Сдвиг содержимого ; аккумулятора влево ; («вдвигается» принятый бит) |
|
CLR SCL |
; Установка логического 0 на ; линии SCL |
|
DJNZ R0, RBIT |
; Проверка условия выхода из ; цикла |
|
SETB SDA |
; Установка логической 1 на ; линии SDA |
|
|
|
|
SETB SCL |
; Установка логической 1 на ; линии SCL |
|
CLR SCL |
; Установка логического 0 на ; линии SCL |
|
CALL STOP |
; Вызов процедуры ; генерирующей «Stop»- ; условие |
|
RET |
; Выход из подпрограммы |
Контрольные вопросы
Что такое шина I2C?
Чем отличается «Master» от «Slave» устройства?
Каковы этапы приема байта информации от «Slave» устройства по шине I2C?
Какое устройство на шине I2C выдает сигнал ACK и в каком случае?
Для чего нужны «Start»- и «Stop»-условия?