misle.ru страница 1
скачать файл
Последовательный периферийный интерфейс SPI.

Введение. Последовательный периферийный интерфейс SPI (Serial Peripheral Interface) имеет двоякое назначение.

Во-первых, с его помощью может осуществляться обмен данными между микроконтроллером и различными периферийными устройствами, такими, как цифровые потенциометры, ЦАП/АЦП, FLASH-ПЗУ и др. Посредством этого интерфейса также может произво­диться обмен данными между несколькими микроконтроллерами AVR. Использование интерфейса SPI в качестве высокоскоростного канала связи и рассматривается в данной главе.

Кроме того, через интерфейс SPI может быть осуществлено программирование микроконтроллера (т. н. режим последовательного программирова­ния).

При обмене данными по интерфейсу SPI микроконтроллер AVR может работать как ведущий (режим «Master») либо как ведомый (режим «Slave»). При этом пользователь может задавать скорость передачи (семь программи­руемых значений) и формат передачи (от младшего разряда к старшему, или наоборот).

Дополнительной возможностью подсистемы SPI является «пробуждение микроконтроллера из режима Idle при поступлении данных.
Функционирование модуля SPI.

Выводы, используемые модулем SPI

Вывод

Режим «Master»

Режим «Slave»

выход “Master” / вход “Slave” данных – MOSI (PB2);

Определяется пользователем

Вход

выход “Master” / вход “Slave” данных – MISO (PB3);

Вход

Определяется пользователем

выход “Master” / вход “Slave” тактового сигнала – SCK (PB1);

Определяется пользователем

Вход

выбор ведомого устройства - /SS (PB0)

Определяется пользователем

Вход

Направление передачи данных переопределяется с помощью соответствующего разряда регистра DDRB.

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

$0D ($2D). SPCR:

7

R/W

SPIE

Разрешение прерывания от SPI

6

R/W

SPE

Включение/выключение SPI

5

R/W

DORD

Порядок передачи данных

4

R/W

MSTR

Выбор режима работы («Master»/«Slave»)

3

R/W

CPOL

Полярность тактового сигнала

2

R/W

CPHA

Фаза тактового сигнала

1

R/W

SPR1

Скорость передачи

0

R/W

SPR0

Контроль состояния модуля, а также дополнительное управление ско­ростью обмена осуществляется с помощью регистра состояния $0Е ($2Е); SPSR.



7

R

SPIF

Флаг прерывания от SPI. Данный флаг устанавливается в «1» по оконча­нии передачи очередного байта. Если флаг SPIE регистра SPCR установлен в «1» и прерывания разрешены, одновременно с установкой флага генериру­ется прерывание от SPI. Также флаг SPIF устанавливается в «1» при переводе микроконтроллера из режима «Master» в режим «Slave» посредством вывода /SS. Флаг сбрасывается аппаратно, либо при старте подпрограммы обработки прерывания, либо после чтения регистра состояния SPI с после­дующим обращением к регистру данных SPI (SPDR).

6

R

WCOL

Флаг конфликта записи. Данный флаг устанавливается в «1» при попытке записи в регистр данных (SPDR) во время передачи очередного байта. Флаг сбрасывается аппаратно после чтения регистра состояния SPI с последую­щим обращением к регистру данных SPI

5

R

-

Зарезервированы, читаются как «0»


4

R

-

3

R

-

2

R

-

1

R

-

0

R/W

SPI2X

Удвоение скорости обмена. При установке этого разряда в «1» и работе микроконтроллера в режиме «Master» частота сигнала SCK удваивается.

Передаваемые данные записываются, а принимаемые — считываются из регистра данных $0F ($2F), SPDR. Запись в этот регистр инициирует начало передачи, а при его чтении считывается содер­жимое буфера сдвигового регистра. Другими словами, регистр данных слу­жит буфером между регистровым файлом микроконтроллера и сдвиговым регистром модуля SPI.


Соединение двух микроконтроллеров (ведущий—ведомый) по интер­фейсу SPI. Вывод SCK ведущего микроконтроллера является выходом тактового сигнала, а ведомого — входом,

Перед выполнением обмена необходимо, прежде всего, разрешить работу модуля SPI. Для этого следует установить в «1» разряд SPE регистра SPCR. Режим работы определяется состоянием разряда MSTR этого регистра: если разряд установлен в «1», микроконтроллер работает в режиме "Master", если сброшен в «0» — в режиме «Slave».

Передача данных осуществляется следующим образом. При записи в регистр данных SPI ведущего микроконтроллера запускается генератор тактового сигнала модуля SPI, и данные начинают поразрядно выдаваться на выход MOSI и соответственно поступать на вывод MOSI ведомого микроконтроллера. Порядок передачи разрядов данных определяется состоянием разряда DORD регистра SPCR. Если разряд установлен в «1», первым передается младший разряд байта, если же сброшен в «0» — старший разряд. После выдачи последнего разряда текущего байта генератор тактового сигнала останавливается с одновременной установкой в «1» флага «Конец передачи» (SPIF). Если прерывания от модуля SPI разрешены (флаг SPIE регистра SPCR установлен в «1»), генерируется запрос на прерывание, После этого ведущий микроконтроллер может начать передачу следующего байта либо, подав на вход /SS ведомого микроконтроллера напряжение ВЫСОКОГО уровня, перевести последний в состояние ожидания. Одновременно с передачей данных от ведущего к ведомому происходит передача и в обратном направлении при условии, что на входе /SS ведомого присутствует напряжение НИЗКОГО уровня. Таким образом, в каждом хххе сдвига происходит обмен данными между устройствами. Аналогично в конце каждого цикла флаг SPIF устанавливается в «1» как в ведущем микроконтроллере, так и в ведомом. Принятые байты сохраняются в приемных регистрах для дальнейшего использования.

В модуле реализована одинарная буферизация при передаче и двойная при приеме. Это означает, что готовый для передачи байт данных не может быть записан в регистр данных SPI до окончания предыдущего цикла обмена. При попытке изменить содержимое регистра данных во время передачи устанавливается в «1» флаг WCOL регистра SPSR. Сбрасывается этот флаг после чтения регистра SPSR с последующим обращением к регистру данных SPI.

Соответственно, при приеме данных принятый байт должен быть считан из регистра данных SPI до того, как в сдвиговый регистр поступит последний разряд следующего байта. В противном случае первый байт будет потерян.
Режимы передачи данных.

Спецификация интерфейса SPI предусматривает 4 режима передачи данных. Эти режимы различаются соответствием между фазой (момент счи­тывания сигнала) тактового сигнала SCK, его полярностью и передаваемы­ми данными. Всего существует 4 таких комбинации, определяемых состоя­нием разрядов СРНА и CPOL регистра:



Разряд

Описание

CPOL

Полярность тактового сигнала.

«0» — генерируются импульсы положительной полярности, при отсутствии импульсов на выводе присутствует НИЗКИЙ уровень; «1» — генерируются импульсы отрицатель­ной полярности, при отсутствии импульсов на выводе присутствует ВЫСОКИЙ уро­Вень.



СРНА

Фаза тактового сигнала.

«0» — обработка данных производится по переднему фронту импульсов сигнала SCK (для CPOL = «0» - по нарастающему фронту, а для CPOL = «1» — по спадающему фронту); «1» — обработка данных производится по заднему фронту импульсов сигнала SCK (для CPOL = «0» — по спадающему фронту, а для CPOL = «1» — по нарастающему фронту).


Соответствующие этим режимам форматы обмена данными через SPI приведены ниже на рисунках (передача ведется от старшего разряда к младшему).






Частота тактового сигнала SCK и, соответственно, скорость передачи данных по интерфейсу определяется состоянием разрядов SPRl:SPR0 регистра SPCR и разряда SPI2X регистра SPSR. Разумеется, речь идет о микроконтроллере, работающем в режиме «Master», т. к. именно он является источником тактового сигнала. Для устройства, находящегося режиме «Slave», состояние этих разрядов безразлично.
Задание частоты тактового сигнала SCK

SPI2X

SPR1

SPR0

Частота сигнала SCK

0

0

0

fclk / 4

0

0

1

fclk /16

0

1

0

fclk / 64

0

1

1

fclk /128

1

0

0

fclk /2

1

0

1

fclk /8

1

1

0

fclk /32

1

1

1

fclk /64

Следует иметь в виду, что функционирование микроконтроллера в режиме "SIave" гарантируется только на частотах, меньших или равных fclk / 4.


Использование вывода /SS

Вообще говоря, этот вывод предназначен для выбора активного ведомого устройства и в режиме «Slave» всегда является входом. При подаче на него напряжения НИЗКОГО уровня модуль SPI активируется и вывод MOSI переключается в режим вывода данных (если это задано пользователем). Остальные выводы модуля SPI являются в этом режиме входами. А при по­даче на вывод /SS напряжения ВЫСОКОГО уровня все выводы модуля SPI переключаются в режим ввода данных. При этом модуль переходит в неак­тивное состояние и прием данных не производится. Как правило, в этом со­стоянии программа изменяет содержимое регистра данных.

Следует помнить, что каждый раз, когда на вывод /SS подается напряже­ние ВЫСОКОГО уровня, происходит сброс модуля SPI. Соответственно, если изменение состояния этого вывода произойдет во время передачи дан­ных, и прием, и передача немедленно прекратятся, а передаваемый и при­нимаемый байты будут потеряны.

Если же микроконтроллер находится в режиме «Master» (разряд MSTR регистра SPCR установлен в «1»), направление передачи данных через вывод /SS определяется пользователем. Если вывод сконфигурирован как выход, он работает как линия вывода общего назначения и не влияет на работу модуля SPI. Как правило, в этом случае он используется для управления выво­дом /SS микроконтроллера, работающего в режиме «Slave».

Если же вывод сконфигурирован как вход, то для обеспечения нормаль­ной работы модуля SPI, на него должно быть подано напряжение ВЫСОКОГО уровня. Подача на этот вход напряжения НИЗКОГО уровня от какой-либо внешней схемы будет воспринята модулем SPI как выбор данного микроконтроллера в качестве ведомого, и соответственно, начало передачи ему данных. Во избежание конфликта на шине модуль SPI в таких случаях выполняет следующие действия:

1. Флаг MSTR регистра SPCR сбрасывается, и микроконтроллер переключается в режим «Slave». Как следствие, выводы MOSI и SCK начинают функционировать как входы.



2. Устанавливается флаг SPIF регистра SPSR, генерируя запрос на прерывание от SPI. Если прерывания от SPI разрешены и флаг I регистра SREG установлен в «1», происходит запуск подпрограм­мы обработки прерывания.

Таким образом, если ведущий микроконтроллер использует передачу данных, управляемую прерыванием, и существует вероятность подачи на вход /SS напряжения НИЗКОГО уровня, в подпрограмме обработки прерывания от SPI обязательно должна осуществляться проверка состояния флага MSTR. При обнаружении сброса этого флага он должен быть программно установлен обратно в «1» для обратного перевода микрокон­троллера в режим "Master".
скачать файл



Смотрите также: