logo
HCS12 с применением языка С - royallib

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*/

}

/*-------------------------------------------------------------------*/

/* Функция sci_trans осуществляет непрерывную пересылку одного байта */

/*-------------------------------------------------------------------*/

void sci_trans(void) {

 SC0CR2 = 0x08; /*разрешить работу передатчика*/

 SC0DRL = 's'; /*загрузить в буфер передатчика код символа "S"*/

 while (SC0SR1 != 0x80) /*ожидать установления бита TDRE)

 {

  ;

 }

}

/*-------------------------------------------------------------------*/

Если соединить два микропроцессорных контроллера по последовательному интерфейсу так, что выход TxD первого МК будет соединен со входом RxD второго МК и наоборот, то можно будет организовать двусторонний обмен информацией.

Именно эту задачу Вам предстоит решить в домашнем задании №11, полный текст которого Вы найдете в конце главы.