Управление процессом приема информации.
При приеме информации с использованием приемника контроллера SCI, следует постоянно контролировать состояние флага RDRF. Этот флаг устанавливается в 1, когда прием очередного байта закончен, и принятые данные доступны в регистре данных приемника. Бит может генерировать запрос на прерывание, при условии, что эти прерывания разрешены. Обнаружив в процессе мониторинга флага RDRF или прервавшись по его запросу, МК должен считать данные из регистров SCxDRH:SCxDRL.4.18.5. Пример программирования контроллера SCI
Приведенный ниже программный фрагмент SCI.c иллюстрирует технику программного обслуживания асинхронного последовательного интерфейса МК семейства 68HC12.
Отладочная плата MC68HC912B32EVB предоставляет возможность использования только одного контроллера SCI с номером 0. Поэтому в именах регистров специальных функций символ «x» будет заменен нами на символ «0».
Ниже перечислены биты и регистры управления, которые используются в данном примере:
• SC0BDH:SC0BDL — регистры скорости обмена контроллера SCI. Записанное в него двоичное число определяет скорость передачи данных и скорость приема данных, которые для одного контроллера в соответствии с его принципом действия могут быть только равными;
• SC0CR1 — первый регистр управления контроллера SCI. Используется для выбора формата 8-ми или 9-ти разрядного представления слова в кадре обмена данными (бит M), для выбора режима работы с паритетом или без него (бит PE), для назначения четной или нечетной логики формирования паритета (бит PT);
• SC0CR2 — второй регистр управления контроллера SCI. Его биты разрешают работу передатчика (бит TE) и приемника (бит RE);
• SC0DRL — регистр данных контроллера SPI, младший байт. Используется для обмена данными в последовательном коде в 8-разрядном формате;
• SC0SR1 — первый регистр состояния контроллера SCI. Этот регистр содержит флаг готовности буфера передатчика к приему новых данных TDRE и флаг завершения приема очередного слова в буфер приемника RDRF.
В нашем примере задействован только передатчик контроллера SCI. Он будет непрерывно посылать по линии последовательной связи TxD (вывод PORTS0) код символа «S». Прерывания от контролера SCI в данном примере не используются.
Контроль за состоянием флага TDRE ведется методом полинга.
/*-------------------------------------------------------------------*/
/* filename: SCI.c */
/* МAIN PROGRAМ: Эта программа реализует непрерывную посылку кода */
/* символа "S"с скоростью 9600 бод в 8-разрядном формате (кадр 10 бит)*/
/* с битом паритета */
/*-------------------------------------------------------------------*/
/*подключаемые файлы*/
#include <912b32.h>
/*используемые функции*/
void sci_init(void);
void sci_trans(void);
void main(void) {
sci_init; /*инициализация модуля SCI*/
while(1) {
sci_trans; /*передавать данные непрерывно*/
}
}
/*-------------------------------------------------------*/
/* Функция sci_init производит инициализацию модуля SCI. */
/*-------------------------------------------------------*/
void sci_init(void) {
unsigned char clear;
SC0BDL = 0x34; /*установить скорость 9600 бод*/
SC0BDH = 0x00;
SC0CR1 = 0х04; /*10-разрядный формат кадра 8 бит данных, с*/
/*контролем паритета, логика паритета нечетная */
clear = SC0SR1; /*операция для сброса флага TDRE*/
/*флаг сбрасывается в два действия*/
/*сначала читать регистр SC0SR1*/
/*затем записать в регистр SC0DRL*/
}
/*-------------------------------------------------------------------*/