Интерфейс SPI в STM32. Часть 1

Если вы уже знаете что такое SPI интерфейс и с чем его едят, то вряд-ли вы почерпнете что-то новое из этой статьи. В ней я попробую рассказать основные понятия относящиеся к этому интерфейсу, а в следующей расскажу как использовать модуль SPI встроенный в микроконтроллеры STM32. Как и любой другой интерфейс, SPI используется для передачи данных от одного устройства к другому. Устройства на шине SPI не равноправны, как правило, присутствует одно главное устройство (Master) и множество подчинённых устройств (Slave). Обычно, в роли мастера выступает микроконтроллер, а подчинёнными устройствами является различная периферия вроде термодатчиков, акселерометров, часов реального времени итд. Мастер не просто так называется мастером, без его ведома ни один слейв не будет предпринимать ни какого обмена данными. Сама шина SPI физически представляет собой 4 провода:
  • MOSI – По этому проводу данные идут от Master к Slave устройству
  • MISO - По этому проводу данные идут от Slave к Master устройству
  • SCK - Через этот провод, Master передает тактовый сигнал к Slave устройствам
  • CS – Chip select (или SS – Slave select) – Через этот провод мастер дает понять слейву, что сейчас он шлёт данные именно ему.
Из описания всех четырёх линий можно сделать выводы:
  • SPI – это последовательный интерфейс. Биты данных передаются один за другим
  • SPI - это синхронный интерфейс. Это означает, что передача данных (в любую сторону) происходит только в то время когда мастер генерирует импульсы синхронизации и передает их через провод SCK другим устройствам на шине.
  • К одной шине может подключаться несколько устройств, количество которых теоритически не ограничено.
  • SPI предоставляет возможность обмениваться данными в полнодуплексном режиме. Пока мастер генерирует тактовые импульсы, он может посылать данные на слейв устройство и одновременно принимать их от него же.

Теперь рассмотрим, как устройства подключаются к шине. Стрелочки показывают кто и куда передает сигнал:

spi stm32

Как видно на рисунке, все линии интерфейса кроме CS, просто объединяются между собой.  Для каждого слейв устройства, мастер имеет отдельный выход CS. Для того чтоб обменяться данными со вторым слейв устройством, мастер установит на ножке CS2 низкий логический уровень, а на двух других (CS1 и CS3) – высокий. Таким образом Slave_1 и Slave_3 не будут  подавать вообще ни каких признаков жизни, и тем самым не создадут помех общению мастера и Slave_2.  Еще раз подчеркну, что активное состояние ноги CS  - это логический ноль.  У такой схемы есть один недостаток – на 10 слейв устройств, мастер должен иметь 10 отдельных ног для подключения к CS. Существует другой вариант подключения который называется daisy-chain. При таком включении все устройства соединяются в цепочку и имеют один общий CS. Подробно этот способ включения рассматриваться не будет, в виду того, что используется он достаточно редко. Как уже упоминалось выше, к одной шине могут быть подключены самые разные slave устройства, некоторые из них достаточно быстрые и могут обмениваться данными с мастером на большой скорости, а некоторые наоборот  очень медленные. Это значит, что мастер не должен слишком быстро генерировать тактовые импульсы, в противном случае медленные слейв устройства его не поймут из-за искажения данных.  Однако скорость, это еще не все параметры SPI интерфейса,  существует также 4 режима SPI. Я обращал внимание, что в даташитах на какое-либо устройство со SPI интерфейсом обычно так и пишут – «это устройство использует режим 2». Насколько это стандартизовано сказать не могу, но видел несколько раз. Если в двух словах описать суть этих режимов, то каждый из них определяет в какой момент (в зависимости от состояния линии SCK) нужно считывать/передавать  данные. Следующая таблица показывает, что это за режимы и чем они отличаются друг от друга. Во всех 4-х режимах, мастер посылает один и тот же байт (0x93). Желтая линия это SCK, а синяя – MOSI.

Режим

CPOL

CPHA

Осциллограмма

Описание режима

0

0

0

 spi mode 0

Выборка по переднему нарастающему фронту

1

0

1

 spi mode 1

Выборка по заднему спадающему фронту

2

1

0

 spi mode 2

Выборка по переднему спадающему фронту

3

1

1

 spi mode 3

Выборка по заднему нарастающему фронту

Как видно из таблицы, номер режима состоит из двух бит – CPOL и CPHA. Бит CPOL определяет, в каком состоянии будет находиться нога SCL в то время когда ничего не передается. Если CPOL=0 то в режиме простоя на ноге низкий логический уровень. Это означает, что передний фронтом будет считаться переход из 0 в 1 (а задним фронтом соответственно наоборот из 1 в 0).  Если CPOL=1 то в режиме простоя на ноге высокий логический уровень. Это означает, что передний фронтом будет считаться переход из 1 в 0 (а задним фронтом соответственно наоборот из 0 в 1).  Бит CPHA определяет по какому фронту нужно производить выборку  0 – по переднему фронту, 1 – по заднему фронту. Собственно это всё и показывает таблица сверху. Кстати, примечательно, что точно так же эти два бита называются в регистре настройки SPI у микроконтроллеров STM32 и AVR.  Следующий немаловажный параметр – порядок следования бит. Обычно, первым передается старший бит, но иногда бывает наоборот, если этого не учесть, то слейв и мастер не найдут общий язык. Количество бит может изменяться, обычно это 8 бит, иногда бывает больше. С теоритическими основами покончено. В следующей статье попробуем завести SPI на платке STM32F4DISCOVERY.