Интерфейсы периферийных устройств. Параллельный интерфейс ввода-вывода. Принципы построения параллельных портов ввода/вывода микроконтроллеров, страница 10

Во второй схеме питание устройств осуществляется информационными импульсами, передаваемыми по шине данных.

Исходные состояния на шине определяются источником питания U=5В – это напряжение подается с помощью подтягивающего регистра. Информация между master и slave подается путем закорачивания шины на общий провод. Как только master или slave отпускает шину, на ней тут же устанавливается высокий уровень напряжения. Если шина устанавливается в 0 на интервале не менее 480 мкс (60x8), помощники будут сброшены и информация в них потеряна. Получить доступ к какому-либо устройству на шине можно в следующей последовательности:

  • Провести инициализацию
  • Выполнить одну из команд функций ПЗУ
  • Выполнить команду функции управления или памяти

Все операции начинаются с импульса сброса, который формирует мастер. Вслед за сбросом устройство-помощник формирует ответный импульс присутствия. Если хотя бы одно устройство подключено, оно ответит. После получения импульса присутствия мастер передает адрес устройства, к которому он хочет обратиться.

Временная диаграмма (как происходит инициализация)

После того, как мастер получит ответ, он может передавать одну из команд функций ПЗУ.  Передача ведется путем формирования мастером специальных временных интервалов (time slots). Каждый интервал служит для передачи 1 бита.

Первым передается младший бит, интервал начинается импульсом низкого уровня (1-15 мкс). Далее шина отпускается, устанавливается 0 или 1 и передается непосредственно информационный блок. В подчиненном устройстве запускается схема временной задержки, которая определяет момент считывания данных (около 30 мкс()оторая определяет момент считывания данныхменноц задержкиу из команд функций ПЗУи:

ормации.). Максимальное время задержки 60 мкс. Передаваемый бит должен удерживаться мастером в течение 60-120 мкс от начала интервала. Временной интервал завершается переводом шины в 1 на время не менее 1 мкс.

ПЕРЕДАЧА 0:

ПЕРЕДАЧА 1:

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

Передача 0 и 1 отличается длительностью отрицательного импульса, который формирует мастер. Если передается 1, то длительность отрицательного импульса равна 1-15 мкс, если передается 0 – длительность 60 мкс.

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

Мастер формирует импульс 1-15 мкс. Затем он должен освободить шину для того, чтобы дать возможность подчиненному устройству вывести бит данных. По отрицательному фронту подчиненное устройство сразу выводит на шину бит данных и запускает схему задержки, определяющую, как долго этот бит данных будет на шине. Время задержки – 15-60 мкс. Момент считывания данных мастером должен быть как можно дальше от начала интервала, но не позднее 15 мкс.

Как задавать временные интервалы

Будем использовать таймер T0 в 16-разрядном режиме. Частота импульсов на входе таймера равна 2,097152 МГц (это частота ядра по умолчанию). С такой частотой идут импульсы при запуске.

Пример

Надо задать временной интервал 10 мс. Этому интервалу соответствует 20971,52 период.

Переполнение таймера происходит, когда в нем записан код 65535. Нам нужно сформировать количество импульсов 20971,52, чтобы таймер переполнился. Для того чтобы флаг переполнения установился в 1 через 10мкс после запуска, в таймер нужно записать число 65535-20971,52 = 4456410=AE1416.

f10(){

TMOD=Ox1; // 16-разрядный режим

TH0=0xAE;

TL0=0x14;

TCON=0x10; // запуск T0

while (!TF0); // дождаться переполнения

}

t480(){

…………

TH0=0xFC;

TL0=0x11;

…………}

Можно учитывать время выполнения одной команды t=0,477.

Схема подключения температурного датчика DS1820

Сброс (инициализация)

unsigned char Init DS1820(){

int temp;

Into=0; // сброс шины

t480(); // пауза 480 мкс

Into=1;t=30;

if(Into) temp=1;else temp=0;

t300();

return temp;

}

Запись бита

DS1820 Wbit (bit D){

Into=0;

t7(); // пауза 7 мкс

Into=D;

t60(); // удержание на шине в течение 60 мкс

Into=1; //отпускаем шину

}

Чтение бита

bit DS1820 Rbit (){

bit temp;

Into=0;

t3(); // короткий импульс

Into=1;

t7(); // пауза 7 мкс

temp=Into; // чтение бита

t60();

return temp;

}

Запись байта

DS1820 Wbyte (unsigned char D){