Интерфейс 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 должно быть выполнено ранее ведомого.
Если все операции по инициализации модулей SPI ведущего и ведомого МК завершены, то можно приступить к непосредственно к обмену данными. Начало обмена инициирует ведущий. Для этого необходимо под управлением программы записать пересылаемый байт информации в регистр данных SP0DR модуля SPI. Если сдвиговый регистр модуля в момент записи оказался пустым, то данные немедленно автоматически перемещаются из регистра данных в сдвиговый регистр. Далее аппаратные средства контроллера SPI формируют восемь импульсов синхронизации SCK. Каждый импульс SCK сдвигает один двоичный разряд регистра данных ведущего по линии MOSI в регистр данных ведомого. Одновременно другой разряд регистра данных ведомого по линии MISO вдвигается в регистр данных ведущего. По истечении восьми импульсов SCK пересылка одного байта заканчивается, и устанавливаются флаги SPIF в регистре состояния обоих контроллеров. В ведущем МК флаг SPIF сигнализирует о завершении передачи одного байта, в то время, как в ведомом МК этот флаг информирует о завершении приема байта данных. Если пересылка следующих байтов не предполагается, то вход ведомого должен быть установлен в 1, что переводит контроллер SPI ведомого устройства в неактивное состояние. Рассмотренный способ обмена характеризуется одновременным перемещением данных от ведущего к ведомому и в обратном направлении. Такой способ обмена называют полнодуплексным.
Аппаратные средства контроллера SPI могут генерировать запросы на прерывание. Два источника запросов располагаются в регистре состояния SP0SR. Первый источник — триггер завершения обмена SPIF, второй источник — флаг нарушения режима MODF.
Оба прерывания разрешаются установкой в 1 бита SPIE в регистре управления SP0CR1.
Вопросы для самопроверки1. Каковы различия между двумя режимами работы контроллера SPI: режимом ведущего и режимом ведомого?
Ответ: Контроллер SPI, работающий в режиме ведущего, начинает обмен и генерирует импульсы синхронизации SCK для обмена. Таким образом, ведущий контроллер управляет обменом. Ведомый контроллер SPI ожидает сигналов от ведущего, и под их управлением запоминает информацию с линии MOSI, а также генерирует информацию на линию MISO. Завершается обмен под управлением ведущего.
2. Каково назначение сигнала SCK?
Ответ: Сигнал SCK предназначается для синхронизации передачи информации между двумя устройствами. Частота этого сигнала определяет скорость передачи. В течение одного периода SCK два устройства обмениваются одним битом данных.
4.19.3. Регистры контроллера SPI
Подобно контроллеру асинхронного обмена контроллер SPI обслуживается несколькими регистрами специальных функций:
• Регистр скорости обмена;
• Регистры управления;
• Регистр состояния;
• Регистр данных.
Далее мы рассмотрим формат и назначение битов каждого регистра модуля SPI.
Регистр скорости обмена SPxBRРегистр скорости обмена SPxBR позволяет выбрать частоту следования импульсов синхронизации SCK, а, следовательно, и скорость обмена по синхронному последовательному интерфейсу. Формат регистра SPxBR представлен на рис. 4.72. Три бита этого регистра SPR2…SPR0 определяют коэффициент деления импульсной последовательности ECLOCK, из которой образуется сигнал синхронизации SCK. Соответствие численных значений коэффициентов деления возможным комбинациям битов SPR2…SPR0 устанавливает таблица рис. 4.72. Внимательно проанализируйте данные этой таблицы. Вспомните, что при тех же частотах системной шины МК, максимальная скорость обмена в асинхронном режиме с использованием контроллера SCI составляла 38400 бод, что для SPI эквивалентно частоте SCK в 38,4 кГц. А для контроллера SPI максимальная частота синхронизации, а, следовательно, и максимальная скорость обмена составляет 4,0 МГц.
Выбор частоты обмена по SPI
SPR[2:0] Коэффициент деления При частоте внутренней системной шины 4 МГц 8 МГц 000 2 2,0 МГц 4,0 МГц 001 4 1,0 МГц 2,0 МГц 010 8 500 кГц 1,0 МГц 011 16 250 кГц 500 кГц 100 32 125 кГц 250 кГц 101 64 62,5 кГц 125 кГц 110 128 31,3 кГц 62,5 кГц 111 256 15,6 кГц 31,3 кГц Формат регистров управления контроллера SPI
Рис. 4.72.
Регистры управления SPxCR1 и SPxCR2 Формат первого регистра управления SPxCR1 контроллера SPI представлен на рис. 4.72. Биты этого регистра имеет следующее назначение:
SPIE:
Бит разрешения прерывания по запросу модуля SPI. Бит разрешает генерацию запросов на прерывание от модуля SPI. Запросы в модуле SPI могут генерироваться при установленном флаге SPIF, который свидетельствует о завершении приема или передачи одного байта информации, или при установленном флаге ошибки MODF.
1 — прерывания разрешены;
0 — прерывания по запросу приемника запрещены.
SPE:
Бит разрешения работы модуля SPI.
1 — контроллер SPI включен;
0 — контроллер SPI выключен.
SWOM:
Бит выбора режима открытого коллектора. Этот бит определяет состояние выходных буферов линий MOSI, MISO, SCK, если эти линии работают на вывод.
1 — буферы переведены в режим открытого коллекторного выхода;
0 — буферы работают в режиме двунаправленной передачи с возможностью установки в высокоимпедансное состояние.
Перевод линий MOSI и MISO в режим открытого коллектора позволяет соединить их по схеме «монтажное И».
MSTR:
Бит режима работы контроллера SPI.
1 — контроллер SPI работает в режиме ведущего (Master);
0 — контроллер SPI работает в режиме ведомого (Slave).
CPOL:
Бит выбора полярности сигнала синхронизации SCK.
Этот бит определяет состояние линии SCK между сеансами передачи данных. Бит CPOL вместе с битом CPHA задает один из четырех возможных режимов SPI интерфейса.
1 — SCK=1 между сеансами передачи данных
0 — SCK=0 между сеансами передачи данных
CPHA:
Бит выбора фазы сигнала синхронизации SCK. Этот бит определяет протокол обмена по SPI шине. Если CPHA=0, то начало обмена инициируется установкой сигнала выбора ведомого в активное состояние (режимы 0 и 1). Первый перепад сигнала синхронизации SCK используется принимающим устройством для запоминания очередного бита в сдвиговом регистре. Передающее устройство выставляет очередной бит посылки на линии MOSI по каждому четному фронту сигнала SCK. Сигнал на линии выбора ведущего должен быть возвращен в неактивное состояние после передачи каждого байта в любом направлении. Режимы 0 и 1 предпочтительно использовать в системах, которые имеют более одного ведомого устройства.
Если CPHA=1, то начало обмена определяет первое изменение уровня сигнала на линии SCK после установки сигнала выбора ведомого в активное состояние (режимы 2 и 3). Все нечетные перепады SCK вызывают выдвижение очередного бита посылки из сдвигового регистра передатчика на линию. Каждый четный перепад используется для записи этого бита в сдвиговый регистр приемника. Сигнал выбора ведомого может оставаться в активном состоянии = 0 в течение передачи нескольких байт информации. Режимы 2 и 3 рекомендуется использовать в системах с одним ведомым устройством.
SSOE:
Бит разрешения работы вывода в режиме ведущего. Если контроллер SPI работает в режиме ведущего, то при установке этого бита в 1 вывод может использоваться как вывод для формирования сигнала «выбор ведомого»
1 — функция выхода разрешена;
0 — функция выхода не реализуется.
LSBF:
Бит выбора очередности выдачи битов данных на линию MOSI. Если бит LSBF сброшен, то данные в процессе передачи выставляются на линию MOSI, начиная со старшего бита. Этот режим считается нормальным режимом обмена для интерфейса SPI. Если же бит LSBF установлен в 1, то при передаче первым на линию MOSI выдается младший бит. Некоторые периферийные ИС требуют такого режима обмена.
Формат второго регистра управления SPxCR2 контроллера SPI также приведен на рис. 4.72. Этот регистр содержит всего три бита управления:
PUPS:
Бит выбора схемотехники входных буферов порта S. Если этот бит равен 1, то все линии порта S, которые находятся в режиме ввода, переходят в состояние входа с внутренним подтягивающим к напряжению питания резистором.
RDS:
Бит выбора схемотехники выходных буферов порта S. Если этот бит равен 1, то все линии порта S, которые находятся в режиме вывода, переходят в состояние выхода с пониженной нагрузочной способностью.
SPCO:
Совместно с битом MSTR этот бит определяет конфигурацию входов/выходов контроллера SPI на выводы корпуса МК в соответствие с таблицей рис. 4.73.
Познакомившись с назначением отдельных битов регистров управления SPxCR1 и SPxCR2, можно сказать, что эти регистры определяют конфигурацию аппаратных средств контроллера SPI. Разъясним дополнительно функции битов MSTR регистра SPxCR1 и SPCO регистра SPxCR2. Возможные комбинации кодов этих двух битов и соответствующие им внутренние соединения линии ввода и линии вывода контроллера SPI показаны на рис. 4.73. Например, если значения рассматриваемых битов равны SPCO:MSTR = 01, то вывод MISO будет выполнять функцию ввода данных, а вывод MOSI — функцию вывода данных контроллера SPI, работающего в режиме ведущего. Линия SCK при этом значении кодовой комбинации битов SPCO:MSTR будет использоваться для выдачи импульсов синхронизации, а линия может быть дополнительно сконфигурирована на ввод или на вывод. Примечания 1–5 на рис 4.73 содержат дополнительную информацию по конфигурированию линий порта S для обслуживания контроллера SPI записи 0 или 1 в соответствующие разряды регистра направления передачи DDRS порта S. Мы рассмотрим эти рекомендации в примере программного обслуживания контроллера SPI (раздел 4.19.4).
На рис. 4.73 показано, что выходы контроллера SPI могут работать как в нормальном двухпроводном режиме (обмен одновременно идет по линиям SI и SO), так и в однопроводном режиме (обмен идет по одной линии).
Рис. 4.73. Выбор режима работы контроллера SPI
Формат регистра состояния SPxSR контроллера SCI представлен на рис. 4.74.
Рис. 4.74. Формат регистра состояния контроллера SPI
Регистр SPxSR содержит всего три бита флагов состояния:
SPIF:
Бит завершения обмена одним байтом данных. Устанавливается в момент, когда все восемь бит данных выставлены на линию последовательного обмена. Этот бит сигнализирует микроконтроллеру о том, что записанный ранее байт данных передан в линию и можно либо загружать новый байт для передачи, либо читать принятый в процессе передачи байт. Этот бит сбрасывается в результате выполнения двух последовательных операций. Сначала читают регистр состояния SPxSR, затем выполняют операцию чтения или записи регистра данных SP0DR.
WCOL:
Бит нарушения режима передачи данных. Этот бит устанавливается в 1, если МК пытается записать в регистр данных SPxDR новый байт для передачи в то время, когда предыдущий байт еще находится в процессе передачи.
MODF:
Бит нарушения режима контроллера SPI. Устанавливается, если на линию ведущего (MSTR = 1) подали сигнал низкого логического уровня. Бит MSTR = 1 назначает режим ведущего для контроллера SPI, а = 0 пытается перевести контроллер в режим ведомого. Такая ситуация является конфликтной, о чем и сигнализирует флаг MODF.
Регистр данных SPCxDRФормат регистра данных контроллера SPI приведен на рис. 4.75. Особенностью этого регистра является то, что он одновременно является регистром для размещения как передаваемых, так и принимаемых данных. Эта особенность обусловлена рассмотренным ранее принципом обмена по интерфейсу SPI. В процессе обмена регистр данных передающего контроллера (этот контроллер ведущий) и регистр данных принимающего контроллера (этот контроллер ведомый) объединяются в 16-разрядный кольцевой сдвиговый регистр. По прошествии восьми импульсов синхронизации SCK 8-разрядное слово из ведущего контроллера сдвигается в регистр данных ведомого контроллера. При этом 8-разрядное слово регистра данных ведомого перемещается в регистр данных ведущего. Таким образом, независимо от того, желает программист передать данные из ведущего в ведомый или принять данные из ведомого в ведущий, в любом из этих случаев оба устройства одновременно принимают и передают данные. Поэтому до сеанса обмена регистр данных ведущего контроллера содержит подготовленные к передаче данные, а после сеанса обмена этот же регистр содержит принятые данные.
Рис. 4.76. Формат регистра данных и альтернативные функции линий порта PORTS
Регистр данных порта SПорт S может работать в режиме порта ввода/вывода общего назначения. Работа каждой линии в режиме ввода или в режиме вывода определяется соответствующим разрядом регистра направления передачи DDRS. Если линия порта PSx установлена на ввод, то чтение регистра данных порта PORTS возвращает в разряде PORTSx значение сигнала на соответствующем выводе МК. Если линия PSx установлена на вывод, то запись в разряд PORTSx регистра данных PORTS 1 или 0 устанавливает на выводе МК сигнал с логическим уровнем 1 или 0. Альтернативной функцией порта S является обслуживание контроллеров асинхронного SCI и синхронного SPI последовательного обмена.
Регистр направления передачи порта SЕсли порт S работает в режиме порта ввода/вывода общего назначения, то биты регистра направления передачи DDRS определяют режим ввода или режим вывода для каждой линии порта S. Если разряд DDRSx установлен в 0, то линия PSx работает в режиме ввода. При DDRSx = 1 линия PSx работает в режиме вывода.
Рис. 4.77. Формат регистра направления передачи порта PORTS
Если активизированы контроллеры последовательных интерфейсов, то значения битов регистра DDRS определяют режим работы линий порта S по следующим правилам:
DDRS2, DDRS0. Если контроллер SCI конфигурирован для работы в обычном двухпроводном режиме, то линии порта PS2 и PS0 будут выполнять функцию входов приемников двух модулей SCI независимо от значения битов DDR2 и DDR0.
DDRS3, DDRS1. Если контроллер SCI конфигурирован для работы в обычном двухпроводном режиме, то линии порта PS3 и PS1 будут выполнять функцию выходов передатчиков двух модулей SCI независимо от значения битов DDR3 и DDR1.
DDRS6…DDRS4. Если контроллер SPI активизирован и использует некоторые линии из PS6…PS4 для ввода данных, то эти линии будут работать в режиме ввода, независимо от значения соответствующих битов регистра DDRS. Если же по логике работы контроллера SPI некоторые линии из PS6…PS4 должны работать на вывод, то необходимо соответствующий бит регистра DDRS установить в 1.
DDRS7. Если контроллер SPI активизирован и работает в режиме ведомого, то линия PS7 будет выполнять функцию входа для выбора ведомого , независимо от значения разряда DDR7. Если же контроллер SPI работает в режиме ведущего, то значение бита DDR7 определяет направление передачи линии PS7, независимо от того, используется ли она контролером SPI, или работает как линия ввода/вывода общего назначения (см. таблицу рис. 4.73 и примечание к ней).
Вопросы для самопроверки1. Какова минимальная частота сигнала синхронизации SCK, если частота импульсной последовательности ECLK составляет 8 МГц?
Ответ: При значении кодовой комбинации битов SPR2…SPR0 = 111 частота SCK составляет 31,2 кГц.
2. Какова максимальная частота сигнала синхронизации SCK, если частота импульсной последовательности ECLK составляет 4 МГц?
Ответ: При значении кодовой комбинации битов SPR2…SPR0 = 000 частота SCK составляет 2 МГц.
3. Напишите выражение на Си для установки минимальной частоты SCK.
Ответ: SP0BR = 0x07
4. Каково назначение флага SPIF?
Ответ: Этот флаг устанавливается, когда контроллер SPI завершил выдачу на линию восьми бит данных. Чтобы сбросить бит SPIF необходимо сначала прочитать регистр состояния SP0SR, а затем выполнить операцию записи в регистр данных SP0DR.
4.19.4. Алгоритмы программного обслуживания контроллера SPI
Ранее в данном параграфе мы обсудили действия, которые необходимо совершить, чтобы инициировать пересылку одного байта с использованием интерфейса SPI. Эти действия отражены в блок-схемах алгоритмов, которые представлены на рис. 4.78. Далее мы покажем, как записать эти действия на Си.
Рис. 4.78. Блок-схемы алгоритмов программного обслуживания контроллера асинхронного обмена SPI
Микроконтроллер и периферийные интегральные схемы. Одна из основных функций интерфейса SPI в микропроцессорных системах — обмен данными между МК и установленными на той же печатной плате интерфейсными ИС. Контроллер SPI в составе МК 68HC12 может быть инициализирован для работы как в режиме ведущего (мастера), так и в режиме ведомого (подчиненного). В процессе обмена с интерфейса SPI — дополнительная функция линий PS7..PS4 порта S. Сигналы SPI распределяются между линиями PS7..PS4 в следующем порядке:
• PS7 — сигнал . Когда линия установлена в 0, происходит передача данных из ведущего устройства SPI;
• PS6 — сигнал SCK;
• PS5 — сигнал MOSI. По этой линии передаются данные от ведущего устройства к ведомому;
• PS4 — сигнал MISO. По этой линии передаются данные от ведомого устройства к ведущему.
Регистры управления, используемый в примере. Ниже перечислены биты и регистры управления, которые используются в данном примере:
• DDRS — регистр направления передачи порта S. Разряды DDRS7…DDRS4 должны быть установлены соответствующим образом при работе контроллера SPI в режиме ведущего. Это необходимо для правильного формирования сигналов обмена на линиях порта S;
• SP0BR — регистр скорости передачи. Разряды SPR2…SPR0 этого регистра задают скорость обмена по шине SPI;
• SP0CR1 — регистр управления (первый). Задает режимы работы контроллера SPI;
• SP0CR2 — регистр управления (второй). Задает режимы работы контроллера SPI;
• SP0SR — регистр состояния. Отражает текущее состояние процесса передачи информации по шине SPI;
• SP0DR — регистр данных. В этот регистр записываются данные, подлежащие передаче в интерфейсную ИС.
Пример программирования контроллера SPI. В нашем примере мы будем использовать встроенный контроллер SPI в режиме ведущего. Контролер будет непрерывно посылать шестнадцатеричное число $F0 в «воображаемую» периферийную ИС. Работоспособность приведенного программного кода может быть проверена с помощью осциллографа. При желании Вы можете собрать простейшую периферийную ИС — последовательный регистр со светодиодами, подключенными к параллельным выходам (рис. 4.79). В примере не использованы прерывания, контроль за состоянием флага SPIF ведется методом полинга.
Рис. 4.79. Функциональная схема периферийного устройства для тестирования обмена по SPI
/*--------------------------------------------------------------------*/
/* filename: SPI.c */
/* МAIN PROGRAМ: Эта программа реализует непрерывную посылку кода */
/* символа "S" с скоростью 9600 бод в 8-разрядном формате (кадр 10 бит)*/
/* с битом паритета */
/*--------------------------------------------------------------------*/
/*подключаемые файлы*/
#include <912b32.h>
#include
/*используемые функции*/
void initialize_spi(void);
void send_data(unsigned int);
void main(void) {
int i, j;
unsigned int data;
initialize_spi(); /*инициализация модуля SCI*/
data = 0xF0;
while(1) /*передавать данные непрерывно*/
{
send_data(data);
}
}
/* Функция initialize_spi производит инициализацию модуля SPI. */
void initialize_spi(void) {
SP0BR = 0х04; /*установить скорость обмена*/
SP0CR1 = 0x18; /*запретить прерывания от SPI, назначить режим*/
/*ведущего, старшим битом вперед*/
SP0DR = 0x00; /*очистить регистр данных */
SP0SR = 0x00; /*очистить регистр состояния*/
SP0CR1 = 0x58; /* разрешить SPI */
}
/* Функция send_data производит инициализацию модуля SPI. */
void send_data(unsigned int data) {
unsigned int status;
SP0DR = data; /*задать число для пересылки*/
while ((SP0SR & 0x80) == 0x00) /*ожидать флага завершения передачи*/
{
;
}
status = SP0SR /*прочитать регистр состояния с целью сброса флага SPIF*/
}
В приведенном примере мы показали лишь технику программирования обмена для контроллера SPI, однако мы не останавливались на особенностях подчиненного устройства, с которым происходит обмен.
4.19.5 Периферийные ИС с интерфейсом SPI
Интерфейс SPI обычно используется для расширения функциональных возможностей однокристального МК. Многие производители полупроводниковых компонентов выпускают периферийные интегральные схемы с интерфейсом SPI. По функциональному назначению эти схемы принадлежат к следующим группам устройств:
• Память типа EEPROM или FLASH;
• Дополнительные порты ввода/вывода;
• Часы реального времени;
• АЦП высокого разрешения (число разрядов преобразования превышает 8 бит);
• Драйверы светодиодных и жидкокристаллических дисплеев;
• Многоканальные ЦАП;
• Схемы фазовой автоподстройки частоты.
4.20. Введение в теорию аналого-цифрового преобразования