Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорная техника.doc
Скачиваний:
5
Добавлен:
01.05.2025
Размер:
6 Мб
Скачать
☆

Подключение устройств сопряжения к компьютеру через последовательный порт.

RS-232C – интерфейс.

Если длинна соединенных линий составляет десятки метров, устройство сопряжения должно преобразовывать последовательный код в параллельный и наоборот.

Преобразователь уровней преобразует ТТЛ уровни в уровни кабеля RS-232С.

IFC1488 – МС передатчик.

КР559ИП19.

Микросхема приемник IFC1489 (КР559ИП20).

Преобразователь кода преобразуют:

Параллельный в последовательный.

Последовательный в параллельный.

I8251 (КР580ВВ51А)

I8250 (КР1847ВВ2)

TL16C450

TL16C550

Последовательные порты в компьютере:

СОМ1 3F8H – 3FFH (адреса) IRQ4 (прерывание)

COM2 2F8H – 2FFH (адреса) IRQ3 (прерывание)

COM3 3E8H – 3EFH (адреса) IRQ10 (прерывание)

COM4 2E8H – 2EFH (адреса) IRQ12 (прерывание)

Р азъем:

Внутренняя структура портов:

УАПП: i8250, TL16C450.

В состав УАПП входят 8 регистров, но используются только 6 адресов.

Каждый порт имеет базовый адрес (BASE):

COM1: BASE=3F8H

COM2:BASE=2F8H

Регистры по адресу BASE – два регистра:

Их выбирают с помощью специального управляющего бита, который записывается в седьмой разряд RG адреса BASE+3:

  1. при нулевом значении этого бита по адресу BASE расположен регистр для записи передаваемого байта и чтения принимающего.

  2. если управляющий бит =1, то по адресу BASE будет RG для записи младшего байта делителя частоты тактового генератора.

НЕХ - код частоты

Скорость передачи, бит/с

НЕХ - код

Скорость

0410

110

0018

4800

0300

150

000С

9600

0180

300

0006

19200

00С0

600

0003

38400

0060

1200

0002

57800

0030

2400

0001

115200

Регистры по адресу BASE+1 (тоже 2 регистра с одинаковым адресом). Управляющий бит – седьмой разряд RG по адресу BASE+3.

  1. при нулевом значении этого бита по адресу BASE+1 находится регистр управления прерываниями.

  2. при единичном значении регистр старший разряд кода делителя частоты.

Регистры по адресу BASE+2 (идентификации прерываний, содержимое указывает на причину прерывания).

Регистр по адресу BASE+3 (регистр управления УАПП).

Номер бита

Назначение

0,1

Количество бит передаваемых данных:

00 – 5 бит

01 – 7 бит

10 – 6 бит

11 – 8 бит

2

Количество стоповых битов:

0 – 1 бит

1 – 2 бита

3,4

Контроль паритета:

0Х – контроля нет

10 – контроль на нечет

11 – контроль на четность

5

Задание контрольного бита:

1 – контрольный бит = 0 (нечетный паритет)

1 – контрольный бит = 1 (четный паритет)

Микросхема сама вычисляет паритет.

6

1 – постоянная передача

0 – нормальная передача символов.

7

Управляющий бит для выбора назначения регистров BASE и BASE+1

Регистр по адресу BASE+4 (для управления модемом).

Номер бита

Назначение

0

Состояние линии DTR

1

Состояние линии RTS

2,3

Состояние выходов УАПП(OUT1 и OUT2)

4

Режим работы УАПП:

0 – рабочий

1 – диагностический

5,6,7

Не используется

Регистр по адресу BASE+5 (регистр состояния (статуса) УАПП) позволяет контролировать ошибки при приеме.

Бит

Назначение

0

1 – данные получены и готовы для чтения

1

1 – ошибка переполнения при приеме

2

1 – ошибка паритета при приеме

3

1 – ошибка формата (не приняты стоповые сигналы)

4

1 – обнаружен запрос на прерывание передачи

5

1 – буферный регистр передатчика пуст

6

1 – регистр сдвига передатчика пуст.

7

1 – TIME OUT

Регистр по адресу BASE+6 – регистр состояния модема.

Бит

Назначение

0

Линия CTS изменила состояние

1

Линия DSR изменила состояние

2

Линия RI изменила состояние

3

Линия DCD изменила состояние

4

Состояние линии CTS

5

Состояние линии DSR

6

Состояние линии RI

7

Состояние линии DCD

Перед использованием УАПП нужно инициализировать:

  1. записать по адресу BASE+3 управляющий байт с 1 в седьмом бите.

  2. записать код делителя частоты по адресу BASE и BASE+1.

  3. записать по адресу BASE+3 управляющий байт с 0 в седьмом бите и требуемыми значениями остальных битов.

  4. записать управляющий байт по адресу BASE+1 (если прерывания не используются, то 0).

  5. записать управляющий байт по адресу BASE+4.

Заголовочный файл (для констант) – serial.h.

//Определение адресов регистров int BASE//

#define OUT_REG BASE //регистр передачи данных.

#define IN_REG BASE //регистр приема данных

#define LOW_DIV BASE //адрес регистра младшего байта делителя

#define HIGH_DIV BASE+1 //адрес регистра старшего байта делителя

#define INT_REG BASE+1 //регистр разрешения прерывания

#define INT_ID_REG BASE+2 //регистр идентификации прерывания

#define CONTROL BASE+3 //регистр управления

#define MODEM BASE+4 //регистр управления модемом

#define STATUS BASE+5 //регистр состояния УАПП

#define M_STATUS BASE+6 //регистр состояния управляющих сигналов.

// Основные константы

# define B_4800 24

# define B_9200

# defineDEVISOR 0x80 //бит управления доступа к регистрам делителя

# define BIT_8 0x03 //длина посылки 8 бит

# define STOP_2 0x04 //2 стоповых бита

# define NOPARITY 0x00 //нет паритета

# define DTR 0x01 //бит управления линией DTR

# define RTS 0x02 //бит управления линией RTS

# define LOOPBACK 0x10 //бит управления тестовым регистром УАПП

# define DATA_IN 0x01 //маска бита «данные приняты»

# define DATA_OUT 0x80 //маска «бита готов к передаче»

# define OVERRUN 0x02 //маска бита «переполнение»

# define FRAME_ERR 0x08 //ошибка формата

# define CTS 0x10 //маска бита состояния линии CTS

# define DSR 0x20 // маска бита состояния линии DSR

//Прототипы функций

void init ( ); //функция инициализации порта

void out_sym (int symbol); //функция вывода символа

int in_sym ( ); //функция ввода символа

Программа тестирования последовательного порта:

/*test.cpp*/

# include <stdio.h>

# include <dos.h>

# include <conio.h>

# include “serial.h”

#define ESC 27

main ( )

BASE = 0x3F8;

Int symbol, symbol2;

Init ( ); //инициализация УАПП

Outportb (MODEM, LOOPBACK); //перевод порта в тестовый режим

While (1)

symbol = getch ( );

if (symbol = = ESC)

return;

out_sym (symbol); //вывод в порт

symbol2 = in_sym ( ); //ввод из порта

printf (“Передано: %х, принято: %х \n”, symbol, symbol2);

return 0;

void init ( )

outportb (CONTROL, DIVISOR);

outportb (LOW_DIV, B_9200);

outportb (HIGH_DIV, B_9600>>8);

outportb (CONTROL, BIT_8  NOPARITY  STOP_2);

outportb (INT_REG,0); //запрет прерывания

void out_sum (int symbol)

while (inportb (STATUS) & DATA_IN) = = 0);

outportb (out_REG, symbol);

int in_sym ( )

int sym;

while (inportb (STATUS) & DATA_IN) = = 0); //ожидание готовности к приему

if (intportb ((STATUS) & (FRAME_ERR  OVERRUN))!=0);

printf (“Ошибка приема \n”);

return;

sym = inportb (IN_REG);

return sym;

1. Прием и передача без квитирования:

2. С квитированием:

а) с программным квитированием XON/XOFF.

ПК

МК

ТхD

RxD

SG

ТхD

RxD

SG

Если приемник готов к вводу данных, он передает XON=11h, получив этот код передатчик передает 1 байт. Когда приемник не готов принять данные – он выдает XOFF = 13h и передатчик перестает передачу данных.

Недостаток – низкая скорость передачи

б) с аппаратным квитированием:

1. RTS и CTS

2. DTR и DSR

3. RTS и CTS; DTR и DSR