Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2739
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать
HAL_SPI

15. SPI

В предыдущей главе мы проанализировали один из двух самых распространенных стандартов обмена данными, которые управляют «рынком» внутриплатных систем связи: протоколом I²C. Теперь настало время проанализировать другого игрока: прото-

кол SPI.

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

15.1. Введение в спецификацию SPI

Последовательный периферийный интерфейс (Serial Peripheral Interface, SPI) – это специфи-

кация последовательной, синхронной и полнодуплексной связи между контроллером ведущего устройства (которое обычно реализуется с микроконтроллером или другими устройствами с программируемой функциональностью) и несколькими ведомыми устройствами. Как мы увидим далее, природа интерфейса SPI обеспечивает полнодуплексную и полудуплексную связь по одной и той же шине. Спецификация SPI является стандартом де-факто, она была определена компанией Motorola1 в конце 70-х годов, и до сих пор широко применяется в качестве протокола связи для многих цифровых ИС. В отличие от протокола I²C, спецификация SPI не навязывает жестко заданного протокола сообщений по своей шине, и ограничивается передачей сигналов по шине, предоставляя ведомым устройствам полную свободу в структуре обмениваемых сообщений.

Рисунок 1: Структурная схема типовой шины SPI

1 Motorola была компанией, но за эти годы она разделилась на несколько дочерних компаний. Подразделение Motorola в области полупроводниковых устройств перешло к ON Semiconductor, которая до сих пор является одной из крупнейших компаний в мире по производству полупроводниковых устройств.

SPI

437

Типовая шина SPI образована четырьмя сигналами, как показано на рисунке 1, несмотря на то что существует возможность управлять некоторыми устройствами SPI всего тремя I/O (в данном случае мы говорим о 3-проводном SPI):

SCK: данный сигнал используется для генерации тактового сигнала, синхронизирующего передачу данных по шине SPI. Он генерируется ведущим устройством, и это означает, что в шине SPI каждая передача всегда запускается ведущим устройством. В отличие от спецификации I²C, SPI по своей природе быстрее, а тактовая частота SPI обычно составляет несколько МГц. В настоящее время довольно часто встречаются устройства SPI, способные обмениваться данными со скоростью до 100 МГц. Более того, протокол SPI позволяет устройствам на одной шине работать на различных скоростях обмена данными.

MOSI: название данного сигнала расшифровывается как Master Output Slave Input (от выхода ведущего ко входу ведомого), и он используется для отправки данных с ведущего устройства на ведомое. В отличие от шины I²C, где для обмена данными используется только один провод, протокол SPI определяет две отдельные линии для обмена данными между ведущим и ведомым устройствами.

MISO: расшифровывается как Master Input Slave Output (ко входу ведущего от выхода ведомого) и соответствует линии I/O, используемой для отправки данных от ведомого устройства на ведущее.

SSn: расшифровывается как Slave Select (ведомый выбран); в типовой шине SPI существуют «n» независимых линий, используемых для адресации конкретных устройств SPI, участвующих в транзакции. В отличие от протокола I²C, SPI не использует для выбора устройств адреса ведомых устройств, но требует, чтобы эта операция выполнялась физической линией, которая для выполнения выбора устройства принимает значение НИЗКОГО логического уровня. В типовой шине SPI только одно ведомое устройство может быть одновременно активным, утверждая низкой линию SS. Именно поэтому на одной шине могут работать устройства с разной скоростью обмена данными2.

Имея две раздельные линии передачи данных, MOSI и MISO, SPI, по сути, разрешает полнодуплексную связь, поскольку ведомое устройство может отправлять данные ведущему устройству, в то время как оно получает новые от него. В одноранговой шине SPI (one-to-one SPI bus: только одно ведущее и одно ведомое устройства) сигнал SS может быть опущен (соответствующий I/O ведомого устройства подключен к земле), а линии MISO/MOSI объединены в одну линию, называемую Slave In/Slave Out (SISO). В этом случае мы можем говорить о двухпроводном SPI, несмотря на то что это, по существу, трех-

проводная шина.

Каждая транзакция по шине начинается с включения линии SCK в соответствии с максимальной тактовой частотой ведомого устройства. Как только линия синхронизации начинает генерировать сигнал, ведущее устройство устанавливает линию SS в значение НИЗКОГО логического уровня, после чего может начаться передача данных. Передачи обычно включают в себя два регистра с заданным размером слова3: один в ведущем

2Для полноты картины мы должны сказать, что это не точная причина, по которой возможно иметь устройства с разными скоростями обмена данными на одной шине. Основная причина заключается в том, что I/O ведомого устройства реализованы вводами/выводами с тремя состояниями (tri-state I/Os), то есть они находятся в высокоимпедансом (отсоединенном) состоянии, когда линия SS не утверждена НИЗКОЙ.

3Как правило, передача данных является 8-битной, но некоторые ведомые устройства поддерживают даже 16-битные.

SPI

438

устройстве и один в ведомом. Обычно начиная со старшего значащего бита, в сдвиговом регистре побитно сдвигаются данные, пока младший значащий бит не сдвинется в этом же самом регистре на место старшего значащего. В то же время данные от ведомого устройства сдвигаются в младший бит регистра данных ведущего. После того, как биты регистра были сдвинуты и переданы таким образом, завершается обмен данными между ведущим и ведомым устройствами. Если необходимо обменяться большим числом данных, сдвиговые регистры перезагружаются и процесс повторяется. Передача может продолжаться в течение любого количества тактовых циклов. По завершении ведущее устройство прекращает подачу тактового сигнала и обычно возвращает линию SS в исходное состояние.

Рисунок 2: Как осуществляется обмен данными по шине SPI при полнодуплексной передаче

На рисунке 2 показано, как данные передаются при полнодуплексной передаче, а на рисунке 3 – как они обычно передаются при полудуплексном соединении.

Рисунок 3: Как происходит обмен данными по шине SPI при полудуплексной передаче

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

В дополнение к параметру «тактовая частота шины» ведущее и ведомое устройство должны также «сделать соглашение» о полярности (polarity) и фазе (phase) тактового сигнала данных, передаваемых по линиям MOSI и MISO. Спецификация SPI от Motorola4 называет эти два параметра CPOL и CPHA соответственно, и большинство производителей интегральных схем приняли данное соглашение.

4 https://web.archive.org/web/20150413003534/http://www.ee.nmt.edu/~teare/ee308l/datasheets/S12SPIV3.pdf

SPI

439

Комбинации полярности и фазы часто называются режимами шины SPI, которые обычно нумеруются в соответствии с таблицей 1. Наиболее распространенными режимами являются режим 0 и режим 3, но большинство ведомых устройств поддерживают как минимум пару режимов шины.

Таблица 1: Режимы шины SPI в соответствии с конфигурацией CPOL и CPHA

Режим

CPOL

CPHA

0

0

0

1

0

1

2

1

0

3

1

1

Временная диаграмма показана на рисунке 4, и она дополнительно описана ниже:

При CPOL = 0 базовое значение тактового сигнала соответствует 0, то есть активное состояние соответствует 1, а состояние простоя (idle state) соответствует 0.

Для CPHA = 0 бит данных захватывается по переднему фронту SCK (переход НИЗКИЙ → ВЫСОКИЙ), а отправляется по заднему фронту (переход ВЫСОКИЙ → НИЗКИЙ).

Для CPHA = 1 бит данных захватывается по заднему фронту SCK, а отправляется по переднему фронту.

При CPOL = 1 базовое значение тактового сигнала соответствует 1 (инверсия CPOL = 0), т. е. активное состояние соответствует 0, а состояние простоя соответствует 1.

Для CPHA = 0 бит данных захватывается по заднему фронту SCK, а отправляется по переднему фронту.

Для CPHA = 1 бит данных захватывается по переднему фронту SCK, а отправляется по заднему фронту.

Таким образом, CPHA = 0 означает выборку на первом фронте тактового сигнала, в то время как CPHA = 1 означает выборку на втором фронте тактового сигнала независимо от того, нарастает или спадает фронт этого тактового сигнала. Обратите внимание, что при CPHA = 0 данные должны быть стабильными в течение полуцикла перед первым тактовым циклом.

Рисунок 4: Временная диаграмма SPI в соответствии с параметрами CPOL и CPHA