терфейса). Обмен данными между SPI-master и SPI-slave производится по алгоритму кольцевого регистра сдвига (рис. 6), по каждому такту SCK дан ные сдвигаются на один бит, после 8 тактов содержимое регистра-master и регистра-slave меняется местами. Соединение MOSI - MOSI обеспечивает передачу от SPI-master к SPI-slave, а соединение MISO - MISO использует ся при необходимости передачи данных в обратном направлении.
Управление интерфейсом SPI производится тремя регистрами файла ре гистров ввода-вывода: регистром данных - SPDR, регистром управления - SPCR, регистром состояния - SPSR. SPDR и SPCR программно доступны и для чтения, и для записи, SPSR доступен только для чтения. Логическая организация этого интерфейса, как и других интерфейсных средств, рас сматриваемых далее, существенно сложнее, чем в параллельных портах ввода-вывода. Передача данных выполняется не за один такт микрокон троллера, а требует формирования целой последовательности сигналов. Поэтому необходимо согласование и логического взаимодействия, и вре менного взаимодействия с другими реализуемыми функциями.
В главе 1 было показано, что наиболее успешно эти задачи решаются применением процедур ввода-вывода по прерываниям. Практически все интерфейсные устройства микроконтроллера содержат средства поддержки для выполнения процедур прерываний; индивидуально формируемые за просы прерываний, соответствующая им таблица векторов прерываний, флаги разрешения и запрета обработки прерываний, аппаратно реализуемая процедура вызова прерываний. Более полно особенности системы преры ваний микроконтроллера будут рассмотрены в одном из последующих раз делов. В описании же работы каждого из интерфейсных средств, в том чис ле и интерфейса SPI, будут упоминаться только необходимые элементы системы прерываний.
SPDR служит для записи передаваемых данных и чтения данных, кото рые поступили в регистр сдвига при обмене. SPCR содержит 8 бит управ ления интерфейсом (слева в таблице символических имен старший бит).
Символические имена битов управления регистра SPCR
| SPIE | SPE | DORP | MSTR \ CPOL | CPHA j SPR1 | SPRO [
SPIE - бит разрешения прерывания SPI, 0 запрещает прерывания.
SPE - бит разрешения работы; при 0 запрещены любые операции в SPI, 1 разрешает работу интерфейса.
DORD - при 1 первым передается младший бит слова данных, при 0 - старший бит.
MSTR - при I определяется режим SPI-master, при 0 - режим SPI-slave. Младшие 4 бита SPCR определяют параметры тактового сигнала SCK:
50
CPOL - определяет пассивный уровень сигнала SCK в перерывах передачи данных, т.е. при 0 тактовый сигнал в пассивном состоянии интер фейса тоже нулевой.
СРНА - при 0 запись данных должна производиться каждым первым фронтом сигнала SCK после пассивного уровня, при 1 - каждым вторым фронтом сигнала после пассивного уровня.
SPR1 и SPR0 задают частоту сигнала SCK; коэффициент деления такто вой частоты микроконтроллера для интерфейса определяется эти ми битами следующим образом:
00 - коэффициент деления 4,
01 ~ коэффициент деления 16,
10 - коэффициент деления 64,
11 - коэффициент деления 128.
В регистре SPSR используется только 2 старших бита. SPIF (бит 7) - флаг прерывания, WCOL (бит 6) - флаг коллизии. SPIF устанавливается в 1 после каждого цикла передачи данных или после отмены режима SPImaster сигналом SS. SPIF вызывает вектор прерывания SPI_STC (адрес вектора $00а), если бит SPIE=1 (разрешение прерывания в SPCR) и уста новлен флаг глобального прерывания I в регистре состояния SREG*. Флаг прерывания очищается автоматически при вызове вектора прерывания SPISTC либо одновременно с очисткой флага WCOL. Флаг коллизии ус танавливается в случае чтения регистра SPDR в период передачи данных в SPI (некорректное чтение данных) и автоматически очищается одновре менно с флагом SPIF после чтения регистра SPSR и последующего обра щения к регистру SPDR.
Если биты в регистре управления SPCR для выбора необходимого ре жима заданы, запись байта данных в регистр SPDR микроконтроллера в режиме SPI-master приводит к началу рабочего цикла интерфейса. SPImaster (рис. 6) передает на MOSI данные, с входа MISO может записывать данные от SPI-slave и на выходе SCK формирует 8 импульсов, управляю щих передачей байта данных. Под управлением этих же сигналов SCK SPIslave (рис. 6) принимает данные с входа MOSI и может передавать из сво его регистра SPDR данные на выход MISO.
После завершения рабочего цикла обмена данными в микроконтроллере, работающем в любом режиме, устанавливается флаг прерывания для вызо ва вектора прерывания SPISTC. Подпрограмма обработки этого вектора должна выполнять операции доступа к регистрам SPI для реализации не обходимых функций интерфейса. Например, чтение из SPDR, поступивших в предыдущем цикле данных, и запись в него новых данных для передачи в следующем цикле. Управление битом разрешения прерываний SPIE позво ляет отказаться от вызова вектора прерывания SPISTC и производить
" регистр состояния SREG будет описан позднее
51
только программный ввод-вывод данных с программным опросом состоя ния интерфейса SPI. К микроконтроллеру SPI-master для обмена данными вместо второго контроллера может быть подключен и обычный регистр сдвига разрядности, соответствующей формату данных.
Таким образом, интерфейс SPI обеспечивает за один рабочий цикл и пе редачу байта данных через SPDR на выход, и запись в этот же регистр но вого байта данных, поступившего на вход. Запуск рабочего цикла произво дится записью в SPI-master очередного байта данных в регистр SPDR. До первого рабочего цикла параметры работы интерфейса должны быть указа ны записью соответствующего байта управления в регистр SPCR. Команды обмена данными с регистрами интерфейса SPI аналогичны командам, рас смотренным в примерах работы с параллельными портами. Программы управления работой интерфейса SPI рассмотрены в примерах главы 5.
3.3. Последовательный интерфейс UART
Интерфейс UART обеспечивает полнодуплексную передачу данных че рез линии ввода-вывода порта D сигналами: вход приемника - RxD (аль тернативная функция PD0) и выход передатчика - TxD (альтернативная функция PD1). Приемник и передатчик интерфейса работают независимо друг от друга в асинхронном режиме со стандартными скоростями переда чи данных и стандартным форматом сообщения (более подробную инфор мацию можно найти в описании любого асинхронного приемопередатчика, например, К580ВВ51 [1] или интерфейса RS-232C). Длина одного сообще ния - 8 или 9 бит, минимальная скорость передачи - 2400 бит/с, другие стандартные скорости кратны минимальной (например, 4800, 9600, 14400 и т.д.).
Управление интерфейсом UART производится 4 регистрами из файла регистров ввода-вывода: UBR - регистр данных, UCR - регистр управле ния, USR - регистр состояния, UBRR - регистр скорости передачи данных. Все регистры интерфейса программно доступны и для чтения, и для записи. Основные алгоритмы управления интерфейсом предполагают применение процедур ввода-вывода по прерываниям. Таблица векторов прерываний микроконтроллера включает соответствующие вектора прерываний. Обра ботку и формирование других сигналов интерфейса кроме RxD и TxD не обходимо производить программно в подпрограммах векторов прерываний.
Регистр данных UDR физически состоит из двух независимых регист ров; при записи в UDR данные поступают в регистр передачи интерфейса, при чтении считывается содержимое другого регистра, обеспечивающего прием данных интерфейсом. Запуск передатчика интерфейса производится записью байта данных в UDR, а по завершению приема запускается проце дура вызова вектора прерывания для считывания байта данных, поступив шего в приемник.
52
Регистр управления UCR содержит 8 бит управления работой интерфей са.
Символические имена битов управления регистра UCR [RXCIEJ TXCIE| UDRIE j RXEN TXEN CHR9 \ RXBjTj TXB8 |
RXCIE - бит разрешения прерывания по окончании рабочего цикла приема данных (вектор прерывания UARTJRXC с адресом $00Ь).
TXCIE - бит разрешения прерывания по окончании рабочего цикла пере дачи данных (вектор прерывания UARTJTXC с адресом $00d).
UDRIE - бит разрешения прерывания по перезаписи данных из регистра UDR в буфер передатчика, т.е. предыдущее сообщение еще об рабатывается передатчиком интерфейса UART, но уже разреше на запись следующего сообщения для подготовки к передаче
(вектор прерывания UART_DRE с адресом $00с).
RXEN - бит разрешения приема, разрешает работу приемника интерфейса. TXEN - бит разрешения передачи, разрешает работу передатчика интер
фейса.
CHR9 - бит разрешения 9-битового формата сообщения.
RXB8 - дополнительный 9-й бит сообщения приемника (бит 8). ТХВ8 - дополнительный 9-й бит сообщения передатчика (бит 8).
В регистре UCR все биты управления при единичном значении разрешают выполнение соответствующей функции, при нулевом значении ~ запреща ют. Эти значения и, следовательно, выполнение указанных функций зада ются программно.
Регистр состояния USR содержит флаги выполнения интерфейсом |
раз |
|||||
личных операций. |
|
|
|
|
|
|
Символические имена флагов в регистре USR |
|
|
||||
[ RXC j ТХС |
UDRE | FE |
OR |
- |
- |
- |
j |
RXC - флаг окончания приема сообщения; устанавливается после приема очередного сообщения в UDR и вызывает вектор прерывания UARTJRXC, если биты разрешения RXCIE (в регистре UCR) и I (в регистре SREG) установлены. Флаг очищается при чтении регист ра UDR, т.е. подпрограмма обработки прерывания RXC должна обязательно предусматривать чтение регистра UDR для очистки флага.
53
ТХС - флаг завершения передачи сообщения; аналогично флагу RXC вы зывает вектор прерывания UARTTXC. Флаг ТХС очищается ав томатически при вызове вектора прерывания или программно за писью " 1" в этот бит.
UDRE - флаг готовности регистра UDR к приему нового сообщения для передачи (до завершения передачи ТХС); аналогично флагу RXC вызывает вектор прерывания UARTDRE. Флаг очищается при за писи в регистр UDR, что должно обязательно выполняться в под программе обработки прерывания.
FE - флаг ошибки формата сообщения; устанавливается, например, когда столовый бит принятого сообщения имеет нулевой уровень. Очи щается при приеме сообщения установленного формата.
OR - флаг перегрузки; устанавливается, когда предыдущее принятое со общение еще не прочитано из регистра UDR, а следующее уже по ступает в приемник. Очищается, когда сообщение принято и пере дано в UDR.
Регистр UBRR определяет скорость обмена данными интерфейса. Ско рость обмена данными BAUD определяется формулой
BAUD = |
£и |
, |
|
16(UBRR + 1) |
|
где f-ги - частота тактового генератора микроконтроллера,
UBRR - содержимое регистра скорости (число в диапазоне $00 - $FF). Вычисленное значение скорости округляется до ближайшего стандартного значения (не рекомендуется использование скоростей, отличающихся от стандартных более, чем на 1 %).
Таким образом, в интерфейсе UART скорости передачи и приема сооб щения одинаковы и определяются UBRR, разрешение на выполнение раз личных операций задается программно изменением содержимого регистра UCR. Операции обмена данными выполняются по флагам регистра USR векторами соответствующих прерываний. Подпрограммы обработки пре рываний должны выполнять обмен данными с интерфейсом UART через регистр UDR.
3.4. Таймеры микроконтроллера
Микроконтроллер содержит 3 таймера-счетчика, которые работают не зависимо друг от друга. Таймер 0 и таймер 2 состоят из 8-разрядных счет чиков, таймер 1 содержит 16-разрядный счетчик. Счетчики таймеров рабо тают в режиме суммирования. Каждый из таймеров может работать от так тового генератора микроконтроллера с программируемым коэффициентом деления частоты (от 1 до 1024) либо от внешнего источника входного сиг нала. При использовании внешнего источника входные сигналы стробируются тактовыми импульсами микроконтроллера. Кроме того, таймер 2 мо54