Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
403
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

буфере достигает порогового значения 1, 4, 8 или 14 (см. выше регистр U0FCR). Код 1100 устанавливается, если в буфере есть хотя бы один байт, но число принятых байт меньше порогового значения, и приемник простаивает в течение интервала 3,5…4,5 символа. Этот интервал не может быть изменен и зависит от нескольких настроек UART (см. техническое описание

LPC214x).

Необходимость различать эти события поясним на простом примере. Пусть требуется принять и обработать пакет из 100 байт, следующих непрерывным потоком. Порог буфера установлен на 14 байт. То есть прерывание запрашивается через каждые 14 принятых байт. После седьмого прерывания из буфера будут извлечены байт. Последние 2 байта не дадут заполнения буфера. Однако прекращение непрерывного потока будет обнаружено и запрошено прерывание с идентификатором 1100.

Практически обработка этих событий может быть абсолютно одинаковой. Если порог буфера равен единице, всегда получаем код 0100.

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

1.19.3 Настройка порта UART

Для настройки можно рекомендовать следующий порядок действий.

1.Выбрать режим портовых линий RxD и (или) TxD через регистр

PINSEL0.

2.Установить в единицу бит DLAB в регистре U0LCR (необходимо для настройки скорости).

3.Задать скорость приемопередатчика через регистры U0DLM, U0DLL, и U0FDR. Воспользоваться таблицей 1.19.1 или выражениями

(1.19.2, 1.19.3).

4.Настроить параметры протокола обмена (число информационных и стоповых битов, контроль четности) через регистр U0LCR. При этом седьмой бит (DLAB) сбросить в ноль.

5.Включить буферы приемопередатчика (бит 0 регистра U0FCR) и задать в том же регистре порог буфера — число накопленных принятых байт, вызывающее прерывание. Если механизм прерываний применять не предполагается, то можно рекомендовать порог в один байт. При использовании прерываний желательно, чтобы они возникали как можно реже, поэтому рекомендуем порог в 8 или 14 байт.

1.19.4 Прием байта с опросом флага

Команды приема байта с опросом флага могут быть размещены в произвольном месте программы. Необходимо обеспечить условия, при которых частота опроса будет не менее 1/16 байтовой скорости.

1.Дождаться появления единицы в младшем разряде (RDR) регистра

U0LSR.

2.Считать принятый байт из U0RBR.

87

3.

Повторять опрос флага RDR и чтение из U0RBR до тех пор пока

буфер не окажется пуст ( ).

1.19.5 Передача байта с опросом флага

1.

Записать от 1 до 16 байт в регистр U0THR подряд.

2.

Дождаться появления единицы в бите THRE регистра U0LSR.

3. После появления флага опустошения буфера THRE передача может быть продолжена.

1.19.6 Прием и передача данных с использованием прерываний

1.Дополнить настройку UART разрешением формирования запросов прерываний (регистр U0IER). Обычно можно установить три младших бита в единицу, записав код 0x07.

2.Настроить систему прерываний через регистры VICVectAddr0–15, VICVectCntl0–15 и VICIntEnable.

3.В процедуре обработки прерывания следует считать идентификатор прерывания и состояние линии, например, командами:

IntID=U0IIR & 0x0F; // Выделение идентификатора прер. LineStat=U0LSR; // Чтение состояния линии

4. Путем анализа идентификатора прерывания, сохраненного в переменной IntID можно организовать ветвление, то есть выполнять либо прием, либо передачу, либо обработку ошибок. При этом можно рекомендовать следующую конструкцию:

switch (IntID)

{

case 0x04: case 0x0C:

while (U0LSR & 1)

{

... // Чтение из U0RBR байта и сохранение

}

break; case 0x06:

if (LineStat & 0x02) ... ; // Обработка ошибок

... ; break; case 0x02:

... // Передача от 1 до 16 байт

}

Первая ветвь выполняется при наличии данных в буфере и содержит команду циклического чтения до тех пока буфер не окажется пуст (фиксируется по флагу RBR в регистре U0LSR). Об обработке ошибок см. ниже. Передача может выполняться до 16 байт подряд.

88

1.19.7 Прием и передача пакетов данных

При работе с пакетами данных требуется обеспечить кадровую синхронизацию, то есть обозначить границы пакетов. Для этого в состав пакета включают заранее известный заголовок (префикс) или постфикс. Это может быть кодовая комбинация, которая не встречается в информационной части пакета, так как это сделано в протоколе обмена с модемом (символы «AT»)

или в протоколе SCPI (Standard Commands for Programmable Instruments)

(символы «*» или «:» в начале и символ «?» в конце).

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

В состав пакета можно ввести поле для обозначения длины пакета, что избавит от потребности в завершающей кодовой комбинации (постфиксе). Может также потребоваться введение поля циклического кода контроля ошибок, например, CRC32.

Стоит сказать, что обмен данными между персональным компьютером и встраиваемым микроконтроллером может быть организован по принципу «запрос-ответ». То есть МК будет отправлять пакет данных только в ответ на соответствующую команду ПК. В таком случае синхронизация не потребуется так же как и передача длины пакета.

1.19.8 Диагностика ошибок

Диагностика ошибок осуществляется путем анализа регистра U0LSR. Следует учитывать, что большинство флагов этого регистра автоматически сбрасываются при чтении. Поэтому прежде чем анализировать состояние U0LSR его необходимо одной командой скопировать в специально созданную переменную, а затем проверять ее значение.

Реакция на возникшую ошибку диктуется спецификой решаемой задачи. Это может быть игнорирование ошибки, появление предупреждающего сигнала или информирование об ошибке по линии UART. В то же время, обработка ошибки переполнения буфера всегда предполагает очистку буфера путем многократного чтения из U0RBR или установкой бита RX FIFO Reset в регистре U0FCR.

1.19.9 Автоматическая настройка скорости

Для автоматической настройки скорости необходимо установить единицу в младший бит (Start) регистра U0ACR. Скорость будет измерена во время приема следующего символа. Необходимо чтобы нулевой (младший разряд) этого тестового символа был равен единице, а следующий (первый) бит — нулю. То есть первый символ, передаваемый после запуска процедуры измерения скорости, должен иметь двоичный формат xxxxxx01. Если же установить режим 1 (бит Mode регистра U0ACR), то достаточно только одного единичного младшего бита. Этому правилу подчинены AT-команды (код символа «A» — 0x41, символа «a» — 0x61).

89