Программирование модемов

Инициализация COM-порта



Инициализация COM-порта

Сначала надо перевести в неактивное состояние линии DTR и RTS, которые сообщают модему, что компьютер готов к обмену данными. Для этого надо записать нулевое значение в регистр управления модемом:

mov al,0 ; сбрасываем сигналы DTR и RTS

mov dx,MCR ; где MCR - адрес регистра управления модемом

out dx,al

jmp $+2 ; задержка

Затем сбрасываем регистры состояния линии, состояния модема и данных. Это достигается простым считыванием значений этих регистров:

; сбрасываем регистр состояния линии

mov dx,LSR ; LSR - адрес регистра состояния линии in al,dx jmp $+2 ; задержка

; сбрасываем регистр состояния модема

mov dx,MSR ; где MSR - адрес регистра состояния модема in al,dx jmp $+2 ; задержка

; сбрасываем регистр данных

mov dx,DAT ; где DAT - адрес регистра данных in al,dx jmp $+2 ; задержка



Эти регистры необходдимо сбросить для того, чтобы в дальнейшем не мешали старые значения, которые могли остаться от работы других программ. Так, если программа, ранее работавшая с COM-портом, не считала из регистра данных байт, принятый через COM-порт, то он "дождется" запуска нашей программы и попадет в приемный буфер.

После того как мы сбросили регистры UART, можно приступить собственно к инициализации COM-порта. Во время инициализации задается формат данных - длина слова, количество стоповых битов, наличие контроля по четности и скорость обмена.

Для задания скорости обмена данными надо перевести регистр данных и регистр управления прерываниями в режим ввода значения делителя частоты тактового генератора. Этот режим устанавливается записью единицы в старший бит регистра управления:

// переводим регистр данных и регистр управления прерываниями // в режим ввода значения делителя частоты тактового генератора

ctl = inp(LCR); // LCR - адрес регистра управления outp(LCR_N, ctl | 0x80); // устанавливаем старший бит регистра

// вычисляем значение для делителя частоты (переменная baud // определяет скорость обмена, которую мы хотим установить)


switch(baud) { case 110: div = 1040; break; case 150: div = 768; break; case 300: div = 384; break; case 600: div = 192; break; case 1200: div = 96; break; case 2400: div = 48; break; case 4800: div = 24; break; case 9600: div = 12; break; case 19200: div = 6; break; case 38400: div = 3; break; case 57600: div = 2; break; case 115200: div =1; break; default: return(-1); break; }

// записываем значение делителя частоты, младший байт в регистр // данных, старший - в регистр управления прерываниями

outp(ICR, (div >> 8) & 0x00ff); // ICR - адрес регистра // управления прерываниями

outp(DAT, div & 0x00ff); // DAT - адрес регистра // данных

// переводим регистр данных и регистр управления прерываниями // обратно в обычный для них режим

ctl = inp(LCR); // LCR - адрес регистра управления outp(LCR, ctl & 0x7f); // сбрасываем старший бит регистра

Затем надо определить формат данных. Для этого записываем новое управляющее слово в управляющий регистр:

// записываем новое управляющее слово

outp(LCR, 00000011B);

// управляющее слово 00000011B устанавливает длину слова 8 бит, // один стоповый бит, отменяет проверку на четность и отменяет // режим фиксации четности (см. главу "Порты асинхронного адаптера")

Последним шагом в инициализации регистров UART можно считать установку регистра управления прерываниями. Хотя наша программа не использует прерывания COM-порта, мы должны специально указать последовательному адаптеру, что он не должен генерировать прерывания.

Чтобы запретить генерацию прерываний, надо просто записать значение ноль в регистр управления прерываниями:

// устанавливаем регистр управления прерываниями

outp(port_adr+ICR, 0); // ICR - адрес регистра // управления прерываниями

На этом этап инициализации регистров UART можно считать законченным. Теперь COM-порт подготовлен для обмена через него данными с модемом, но модем пока еще не будет воспринимать данные от компьютера. Чтобы перевести его в рабочее состояние, ему передаются сигналы DTR и RTS, сообщающие, что компьютер готов к обмену данными.В ответ на эти сигналы модем должен вернуть компьютеру сигналы DSR и CTS (см. главу "Аппаратная реализация"):

// считываем значение регистра управления модемом

mcr = inp( MCR ); // MCR - адрес регистра управления модемом

// устанавливаем сигналы DTR и RTS в активное состояние

mcr |= 3;

// записываем новое значение в регистр управления модемом

outp( MCR, mcr );

После этого уже можно передавать модему через COM-порт AT-команды. Таким образом, следующим этапом является уже непосредственно инициализация модема.


Содержание раздела