Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт
Шрифт:
Интервал:
Закладка:
В нашем примере задействован только передатчик контроллера 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, полный текст которого Вы найдете в конце главы.
4.19. Синхронный последовательный интерфейс SPI
Интерфейс SPI относится к группе синхронных последовательных интерфейсов. Принцип действия интерфейсов этого типа предполагает, что передача каждого бита данных по однопроводной линии сопровождается сигналом синхронизации, который передается по другой линии. Спецификация интерфейса SPI определяет число линий связи и временные диаграммы сигналов на этих линиях в процессе обмена данными.
4.19.1 Концепция интерфейса SPIФункциональная схема обмена между двумя контроллерами SPI
Рис. 4.70.
Функциональная схема организации обмена данными с использованием интерфейса SPI представлена на рис. 4.70. При описании режимов работы и линий связи интерфейса SPI приняты к использованию следующие термины и обозначения:
• Master Mode — режим ведущего. Устройство, работающее в режиме ведущего, начинает сеанс обмена, генерирует передаваемые данные в ведомое устройство и формирует сигналы синхронизации, сопровождающие эти данные.
• Slave Mode— режим ведомого. Устройство, работающее в режиме ведомого, получает сигналы синхронизации от ведущего. В момент поступления импульса синхронизации ведомое устройство запоминает очередной бит 8-разрядного слова, переданный ведущим по одной линии данных, и выставляет на другую линию данных очередной бит другого 8-разрядного слова, передаваемого от ведомого к ведущему.
• MOSI (Master Output Slave Input) — линия передачи данных от ведущего к ведомому.
• MISO (Master Input Slave Output) — линия передачи данных от ведомого к ведущему.
• SCK (Serial Shift Clock) — линия сигнала синхронизации данных. По этой линии ведущее устройство «сообщает» ведомому о начале сеанса обмена с ним.
4.19.2. Алгоритмы работы контроллера SPI
В данном разделе мы рассмотрим организацию обмена данными с использованием аппаратных средств контроллера SPI в составе МК 68HC12. Мы также кратко остановимся на регистрах управления контроллера SPI. Более подробно эти регистры будут рассмотрены в следующем параграфе.
На рис. 4.71 представлена функциональная схема контроллера SPI. Остановимся сначала на системе синхронизации, которая располагается в левом верхнем углу рисунка. Модуль SPI использует в качестве источника тактирования импульсную последовательность PCLOCK, частота которой равна частоте ECLOCK (т.е. частоте системной шины МК). Частота PCLOCK делится делителем с программируемым коэффициентом. На выходе делителя формируется сигнал, частота которого определяет скорость обмена данными по SPI, если контроллер работает в ведущем режиме. Коэффициент деления назначается битами SPR2…SPR0 регистра скорости передачи SP0BR.
Рис. 4.71. Аппаратные средства контроллера синхронного обмена SPI
Данные, которые подлежат передаче, а также принятые от другого устройства данные, записываются в регистр данных SP0DR. Управление режимами работы контроллера осуществляется двумя регистрами управления SP0CR1 и SP0CR2. Текущее состояние процесса передачи данных отражает регистр состояния SP0SR. И, наконец, контроллер взаимодействует с внешним миром по четырем линиям порта S (сигналы MOSI, MISO, SCK и ).
Если два устройства связаны по SPI, то 8-разрядный регистр данных ведущего устройства и 8-разрядный регистр данных ведомого устройства образуют вместе 16-разрядный кольцевой сдвиговый регистр (рис. 4.70). В процессе передачи код 16-разрядного регистра сдвигается под действием импульсов синхронизации SCK. В ответ на каждый импульс SCK один двоичный разряд выдвигается из регистра данных ведущего на линию MOSI и запоминается в первом слева разряде регистра ведомого (см. рис. 4.70). В то же время крайний правый бит регистра данных ведомого выдвигается на линию MISO и запоминается в регистре ведущего. В результате, по прошествии восьми импульсов синхронизации SCK код 8-разрядного регистра данных ведущего переместится в регистр данных ведомого, а 8-разрядный код ведомого — в регистр данных ведущего. Таким образом, в процессе обмена ведущее и ведомое устройства поменяются содержимым их регистров данных.
Для того, чтобы начать обмен данными по SPI, необходимо выполнить некоторую последовательность действий по инициализации контроллера SPI. Во-первых, порт S должен быть конфигурирован соответствующим образом с использованием регистра направления передачи порта DDRS. Далее следует установить коэффициент деления частоты PCLOCK. Возможные значения коэффициента деления: 2, 4, 8, 16, 32, 64, 128 и 256. Желаемый коэффициент деления устанавливается разрядами SPR2…SPR0 регистра скорости передачи SP0BR. Для сигнала синхронизации SCK следует определить не только частоту, но и форму сигнала. По форме сигнала различают четыре типа сигналов синхронизации SCK, которые отличаются полярностью и сдвигом фазы по отношению к сигналам на линиях MOSI и MISO. Выбор формы сигнала SCK определяется комбинацией битов CPOL:CPHA в регистре управления SP0CR1.
Выбрав скорость обмена, следует определить значения битов управляющих регистров SP0CR1 и SP0CR2. Так бит MTSR регистра управления SP0CR1 ведущего должен быть установлен в 1, а такой же бит в регистре управления ведомого — в 0. Тогда первому контроллеру будет назначен режим ведущего, а второму — режим ведомого. И они составят пару для обмена. Кроме того, для организации обмена необходимо правильно установить уровни сигналов на входах обоих контроллеров. Если в системе всего два устройства связаны по шине SPI, то вход ведущего должен быть установлен в 1, а аналогичный вход ведомого в 0 (рис. 4.70). Если в системе к шине SPI подключено несколько ведомых устройств, то вход выбора ведомого каждого устройства должен устанавливаться в 0 ведущим только тогда, когда ведущий обменивается данными именно с этим устройством. Во время обмена данным с другими ведомыми устройствами вход неактивного ведомого должен находиться в 1.
После того, как все биты регистров управления SP0CR1 и SP0CR2 установлены в соответствии с выбранным режимом работы, следует разрешить работу контроллера SPI. Для этого предназначен бит SPE регистра SP0CR1. Разрешение работы ведущего контроллера SPI должно быть выполнено ранее ведомого.