Описание интерфейса SPI
Интерфейс SPI — это один из самых популярных на сегодняшний день последовательных интерфейсов. Он был придуман фирмой Motorola и очень быстро завоевал популярность благодаря своей исключительной простоте и высокой скорости. При этом, SPI, наверное, нельзя назвать в полной мере интерфейсом, скорее это просто принцип связи, поскольку всё, что подразумевается под SPI, — это логика передачи данных между двумя устройствами («Ведущий»-«Ведомый»), физике же уделяется гораздо меньшее внимание, она реализуется, можно сказать, «по обстоятельствам», а никакого протокола нижнего уровня вообще нет, тут каждый производитель придумывает что-то своё.
Ну что ж, — с главного и начнём. Итак, в чём же тут логика? Логика в том, что данные передаются последовательно, побитно, при этом считывание и установка данных разделены во времени с помощью специального синхросигнала на специальной шине. Эта шина называется шиной тактирования (или шиной синхронизации), а суть разделения заключается в том, что считывание и установка данных происходят по противоположным фронтам генерируемых на шине синхроимпульсов. Такое, чётко разделённое во времени, чередование установок и считываний даёт возможность использовать один и тот же регистр и для приёма, и для передачи данных. Ранее (когда память была маленькой и дорогой, операционки хранились на дискетах, а по полям бегали мамонты ) это было серьёзным преимуществом, более того, именно под это на самом деле изначально и затачивался SPI, однако сейчас никаких проблем с обьёмом памяти нет и большинство устройств спокойно могут позволить себе иметь отдельные входной и выходной регистры.
Устройство, управляющее шиной тактирования (то есть генерирующее на ней синхроимпульсы), является «Ведущим» или «Мастером». Собственно, «Master» управляет всем обменом данными, — он решает: когда начинать обмен, когда заканчивать, сколько бит передать и т.д. Второе устройство, участвующее в обмене, является «Ведомым» или «Slave». В SPI, в отличии от, например, того же I2C, «Slave» совсем бесправен, он вообще никак не может влиять на шину тактирования и никак не может сообщить мастеру, что не успевает или, наоборот, что уже готов к обмену. То есть «Мастер» сам должен знать: когда, что и на какой скорости спросить у «Слэйва», чтобы тот смог ему ответить.
Всего, для полнодуплексного обмена (в обе стороны одновременно), в интерфейсе SPI используются 4 линии (смотрим рисунок): SCLK, MOSI, MISO и SS.
«1» и «0» кодируются уровнем напряжения на шинах данных (MOSI, MISO) в обычной положительной логике, то есть высокий уровень напряжения на шине соответствует «единице», а низкий уровень соответствует «нулю». При этом, то, каким образом организуется установка на шинах этих уровней, — нигде не оговаривается, то есть выходы передатчиков могут быть как «push-pull», так и «с открытым коллектором». Высокий уровень обычно соответствует напряжению питания микросхемы (то есть если мы имеем дело с пятивольтовыми микрухами, то высокий уровень — это напряжение, близкое к пяти вольтам, если речь идёт о микрухах, питающихся от 3,3В, то высокий уровень — это напряжение, близкое к 3,3В).
Сигнал SS отмечает начало и конец сеанса обмена. Этот сигнал обычно инверсный, то есть во время сеанса обмена данными мастер должен устанавливать на линии SS низкий уровень, а при отсутствии обмена — высокий. Наличие сигнала SS позволяет мастеру организовать подключение к нескольким слэйвам, используя один и тот же синхросигнал и одни и те же шины данных, без каких-либо дополнительных протоколов (вариант такого подключения показан на рисунке слева). Правда тут есть один минус: в этом случае мастеру придётся к каждому слэйву подключаться по отдельной линии SS (чтобы управлять сеансами обмена с каждым слэйвом независимо друг от друга), что увеличивает общее количество используемых проводов.
Названия линий, в общем-то, не являются каким-то стандартом и могут отличаться в зависимости от производителя (например, вместо MOSI, MISO и SCLK линии могут называться DI, DO и SC, или SI, SO и CLK, линия SS может называться CS или RESET).
Более того, линий не обязательно должно быть четыре, — иногда их может быть только три, например, если данные передаются только в одном направлении или вместо двух однонаправленных шин данных используется одна двунаправленная. Очевидно, что в последнем случае возможен только полудуплексный обмен, то есть в один момент времени можно только передавать или только принимать данные (а передавать и принимать одновременно — нельзя).
То есть, ни по названию линий, ни по уровням напряжения на них, ни даже по их количеству, однозначно идентифицировать SPI нельзя, зато это отлично можно сделать по самому методу передачи данных, по тому как происходит их установка на шину и считывание.
Как я уже упоминал, — данные передаются побитно, а установка и чтение данных происходит по противоположным фронтам сигнала тактирования. Момент чтения данных в англоязычной литературе называется latch (фиксация, защёлкивание), а момент установки данных на шину — shift (сдвиг). Сдвигом момент установки называется в силу особенностей большинства последовательных интерфейсов. Обычно никто не передаёт данные по одному биту, как правило, их посылают пачками по 8 и более бит (размер пачки чаще всего всё же кратен восьми). В связи с этим, на выходе передатчика делают сдвиговый регистр, куда загружают сразу всю пачку передаваемых бит, при этом значение младшего или старшего бита этого сдвигового регистра устанавливается на шине данных (смотря как передаём — младшим или старшим битом вперёд), а для установки на шине следующего передаваемого бита — достаточно «сдвинуть» этот регистр. Так устроены передатчики и в SPI, и в I2C, и в привычном RS232, и много где ещё (так просто аппаратно удобнее). Ну, ладно, — вернёмся к нашему SPI.
Логический уровень сигнала на шине тактирования в неактивном состоянии (когда нет передачи данных) называют полярностью и обозначают CPOL (то есть, если при отсутствии передачи на шине SCLK низкий уровень, то CPOL=0, а если в это время на шине SCLK высокий уровень, то CPOL=1). Порядок чередования считываний и сдвигов называют фазой и обозначают CPHA (если по первому фронту на SCLK происходит считывание, то CPHA=0, а если по первому фронту на SCLK происходит сдвиг, то CPHA=1).
В зависимости от сочетания значений CPOL и CPHA различают 4 режима работы интерфейса SPI, которые так и обозначают Mode0, Mode1, Mode2 и Mode3. Ниже приведена картинка, иллюстрирующая как происходит установка и чтение данных, в зависимости от выбранного режима.
Хотелось бы подчеркнуть, что SS — это именно линия управления сеансом обмена, а не просто линия выбора слэйва. Разница тут в том, что если считать SS просто линией выбора слэйва, то при подключении мастера к одному единственному слэйву возникает соблазн этой линией не управлять, а жёстко закоротить её на общий провод (типа чтоб слэйв всегда был выбран). Однако, логика слэйва обычно такова, что начало сеанса сопровождается различными подготовительными процедурами, такими как загрузка данных в выходной сдвиговый регистр и сброс счётчика импульсов, а выполнять какие-то действия (в соответствии с принятыми по SPI командами от мастера) слэйв начинает только после завершения сеанса обмена. Кроме того, вам ведь вполне может понадобиться несколько сеансов общения (например, если в первом сеансе вы посылаете команды, а в следующем хотите получить отчёт о результате их выполнения). Думаю понятно, что если жёстко притянуть линию SS к общему проводу, то ни о каком распознавании начала и конца сеанса обмена (начало распознаётся по спаду на линии SS, а конец — по подъёму) не может быть и речи, соответственно весь обмен данными будет нарушен. Так что важность сигнала SS не стоит недооценивать.
Ну и напоследок скажу, что наиболее популярными являются режимы Mode0 и Mode3.
Более подробно о том, как происходит обмен, что должен уметь SPI-мастер и как это программно реализовать на микроконтроллере (на примере контроллеров PIC и AVR) можно почитать в статье «Программная реализация ведущего шины SPI»
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
SPI (Serial Peripheral Interface)
![]() | |
| Разработчик | Motorola |
|---|---|
| Тип | Передача данных |
| Дата выпуска | 1985 год |
| ЦП | В зависимости от конкретной модели |
| Memory | В зависимости от конкретной модели |
Содержание
Интерфейс
В SPI используются четыре цифровых сигнала:
| Режим SPI | Временная диаграмма |
| Режим SPI0 Активные уровень импульсов — высокий. Сначала защёлкивание, затем сдвиг. Активные уровень импульсов — высокий. Сначала сдвиг, затем защёлкивание. Активные уровень импульсов — низкий. Сначала защёлкивание, затем сдвиг. Активные уровень импульсов — низкий. Сначала сдвиг, затем защёлкивание. Мастеру приходится настраиваться на тот режим, который используется ведомым. При обмене данными по интерфейсу SPI микроконтроллер может работать как ведущий (режим Master) либо как ведомый (режим Slave). При этом пользователь может задавать следующие параметры: ОперацииШина SPI может работать с одним ведущим устройством и с одним или несколькими ведомыми устройствами. Передача данныхПротокол передачи по интерфейсу SPI предельно прост и, по сути, идентичен логике работы сдвигового регистра, которая заключается в выполнении операции сдвига и, соответственно, побитного ввода и вывода данных по определенным фронтам сигнала синхронизации. Установка данных при передаче и выборка при приеме всегда выполняются по противоположным фронтам синхронизации. Это необходимо для гарантирования выборки данных после надежного их установления. Если к этому учесть, что в качестве первого фронта в цикле передачи может выступать нарастающий или падающий фронт, то всего возможно четыре варианта логики работы интерфейса SPI. Эти варианты получили название режимов SPI и описываются двумя параметрами:\ Ведущая и подчиненная микросхемы, работающие в различных режимах SPI, являются несовместимыми, поэтому, перед выбором подчиненных микросхем важно уточнить, какие режимы поддерживаются ведущим шины. Аппаратные модули SPI, интегрированные в микроконтроллеры, в большинстве случаев поддерживают возможность выбора любого режима SPI и, поэтому, к ним возможно подключение любых подчиненных SPI-микросхем (относится только к независимому варианту подключения). Кроме того, протокол SPI в любом из режимов легко реализуется программно. Часы полярности и фазыВозможны четыре комбинации фазы (CPHA) и полярности (CPOL) сигнала SCLK по отношению к сигналам данных. Режимы работы определяются комбинацией бит CPHA и CPOL: Для обозначения режимов работы интерфейса SPI принято следующее соглашение: Топология систем связи на базе SPIПервый способ позволяет реализовать радиальную структуру связи (топология типа «звезда»), его принято считать основным способом подключения нескольких ведомых устройств. В данном случае для обмена более чем с одним ведомым устройством ведущее устройство должно формировать соответствующее количество сигналов выбора ведомого устройства (SS). При обмене данными с ведомым устройством, соответствующий ему сигнал SS переводится в активное (низкое) состояние, при этом все остальные сигналы SS находятся в неактивном (высоком) состоянии. Выводы данных MISO ведомых устройств соединены параллельно, при этом они находятся в неактивном состоянии, а перед началом обмена один из выходов (выбранного ведомого устройства) переходит в активный режим. Второй способ позволяет реализовать структуру связи типа «кольцо». В данном случае для активации одновременно нескольких ведомых устройств используется один сигнал SS, а выводы данных всех устройств соединены последовательно и образуют замкнутую цепь. При передаче пакета от ведущего устройства этот пакет получает первое ведомое устройство, которое, в свою очередь, транслирует свой пакет следующему ведомому устройству и так далее. Для того, чтобы пакет от ведущего устройства достиг определенного ведомого устройства, ведущее устройство должно отправить еще несколько пакетов. Синхронизация в SPIПриложенияSPI используется с различными периферийными устройствами, такими как: Преимущества и недостатки интерфейса SPIПреимуществаНедостаткиСтандартыПример программной реализацииНиже представлен пример программной реализации SPI мастера на языке Си. Линия CS (chip select, выбор микросхемы) должна быть активирована (в большинстве случаев — притянута к низкому уровню), перед тем, как начнётся обмен данными, и деактивирована после окончания обмена. Большинство устройств требуют несколько сеансов передачи с активной линией CS. Эта функция может быть вызвана несколько раз, пока линия активна. SPI (перевод из книги Mastering STM32)ПредисловиеДанный перевод сделан мною для группы переводчиков, которые осуществляют перевод книги Mastering STM32 (v0.21). К сожалению, ребята завязли в рутине и мы вряд ли в скором времени увидим перевод полностью, поэтому буду выкладывать свои куски перевода. Описание SPISerial Peripheral Interface (SPI) — это последовательный, синхронный, полнодуплексный протокол передачи данных между главным (master) контроллером (обычно микроконтроллером или другими устройством с программируемой функциональностью) и несколькими ведомыми (slave) устройствами. Как мы увидим далее, SPI позволяет передавать данные как в полнодуплексном, так и в полудуплексном режиме. Спецификация SPI стандарт в протоколах передачи данных и была разработана в конце 70-х компанией Motorola и на данный широко используется как протокол передачи данных для многих цифровых микросхем. В отличие от протокола I2C, SPI не задает жестких условий в протоколе передачи данных по шине, давая ведомым (slave) устройствам полную свободу в структуре сообщений обмена данными. Рисунок 1: Архитектура типовой SPI шины. Типовая шина SPI содержит 4 сигнала, как показано на рисунке 1, даже, если возможно управлять некоторыми SPI устройствами, используя лишь 3 сигнала (в таком случае мы говорим о 3-проводном SPI). Имея две раздельные шины данных, MOSI и MISO, SPI по сути является полнодуплексным интерфейсом передачи данных, таким образом ведомое (slave) устройство может отдавать данные главному (master) пока одновременно принимает данные от него же. В одноранговых шинах (когда одно главное (master) и одно ведомое (slave) устройства), сигнал SS может не использоваться, лишь достаточно его подтянуть к «земле» резистором на несколько килоом, линии MISO/MOSI соединяются в одно общую линию Slave In/Slave Out (SISO). В таком случае мы говорим о двухпроводном SPI, хотя по существу он конечно же трехпроводной. Рисунок 2: Как передаются данные по шине SPI в полнодуплексном режиме Каждая транзакция в шине начинается с подачи тактирования в линию SCK в соответствии с допустимой тактовой частотой ведомого (slave) устройства. В то же время главное (master) устройство устанавливает LOW уровень на линии SS и передача данных начинается. Обычно обмен данными подразумевает использование двух регистров (в основном 8-битные, хотя некоторые slave устройства поддерживают 16-битный размер слова), одного в главном (master) устройстве и один в ведомом (slave). Данные побитно сдвигаются в сдвиговом регистре, начиная со старшего бита, пока младший бит сдвигается в этот же самый регистр. В это же самое время, данные от ведомого (slave) устройства сдвигаются в младший бит регистра данных. Когда все биты регистра будут сдвинуты в одну и другую сторону обмен данными будет осуществлен. Если необходимо передать более одного слова данных, сдвиговые регистры обнуляются и процесс повторяется. Обмен данными может продолжаться сколько угодно большое количество циклов тактового генератора. Когда обмен завершен master выключает тактовый сигнал и линия SS возвращается в исходное состояние высокого логического уровня. Рисунок 3: Как передаются данные по шине SPI в полудуплексном режиме Полярность и фаза тактового сигнала (Clock Polarity and Phase)В дополнение к настройкам тактирования шины, master и slave должны «договориться» о полярности и фазе тактового сигнала. SPI спецификация подразумевает две настройки CPOL и CPHA соответственно и многие производители микросхем заимствовали данные названия настроек. Таблица 1: Режимы работы SPI, соответствующие конфигурации CPOL и CPHA Временная диаграмма показана на рисунке 4 и она дополнительно описана ниже: Вот и все, CPHA=0 подразумевает, что выборка идет по первому фронту импульса тактовой частоты, CPHA=1 же подразумевает, что выборка осуществляется по второму фронту импульса тактовой частоты вне зависимости от того возрастающий ли фронт или спадающий. Необходимо помнить, что при CPHA=0 данные должны быть стабильны за пол цикла до начала первого импульса тактовой частоты. Рисунок 4: Временная диаграмма для соответствующих настроек CPOL и CPHA Управление сигналом Slave SelectКак говорилось ранее, ведомое устройство в SPI шине не имеет адреса, по которому его можно было бы идентифицировать, но оно начинает обмен данными и продолжает его пока сигнал Slave Select (SS) находится в низком логическом уровне LOW. STM32 микроконтроллеры предоставляют два режима управления сигналом SS или NSS, как он называется в документации ST. Давайте проанализируем их. TI режим SPISPI интерфейс в микроконтроллерах STM32 поддерживает TI режим, когда микроконтроллер работает в режиме master и сигнал NSS настроен на аппаратный режим работы. В режиме TI полярность и фаза тактового сигнала SPI автоматически устанавливаются в соответствии с требованиями протокола Texas Instruments вне зависимости от того какие настройки были выбраны до этого. Управление сигналом NSS также специфично для протокола TI, NSS сигнал совершает серию импульсов в конце каждого передаваемого байта (с LOW уровня в HIGH в начале передачи младшего бита и с HIGH в LOW в начале передачи старшего бита). Для более подробной информации можете обратиться в референс мануалу соответствующего микроконтроллера. Таблица 2: SPI периферия всех 16-ти плат Nucleo Наличие SPI интерфейсов в микроконтроллерах STM32В зависимости от семейства и корпуса, микронтроллеры STM32 могут иметь до шести независимых SPI интерфейсов. Таблица 2 демонстрирует наличие интерфейсов всех плат Nucleo, рассматриваемых в рамках этой книги. HAL_SPI модульДля программирования SPI HAL определяет С структуру SPI_HandleTypeDef: Давайте проанализируем наиболее важные поля данной структуры. Настройка SPI производится с использованием объекта структуры SPI_InitTypeDef: Как обычно, для конфигурации SPI мы используем функцию: которая принимает в качестве входного параметра указатель на объект структуры SPI_HandleTypeDef, рассмотренной выше. Обмен сообщениями с использованием SPIКак только SPI интерфейс сконфигурирован, мы можем начать обмен данными с ведомыми (slave) устройствами. Так как SPI спецификации не описывает конкретный протокол для передаваемых данных, то и нет особой разницы между master и slave при настройке через CubeHAL. Разница лишь в параметре режимов в структуре SPI_InitTypeDef. Для отправки нескольких байт в режиме опроса необходимо использовать функцию: Параметры, принимаемые этой функцией не нуждаются в описании, т. к. они идентичны уже изученым ранее интерфейсам, например UART. Эта функция может быть использована, если SPI настроен как SPI_DIRECTION_1LINE или SPI_DIRECTION_2LINES. Для приема нескольких байт в режиме опроса мы используем функцию: Эта функция может использоваться в любом из трех режимов Direction. которая отправляет несколько байт, одновременно принимая ответ. Функция может быть использована только, если параметр Direction настроен на SPI_DIRECTION_2LINES. CubeHAL также позволяет передавать данные с DMA и функции похожи на три, представленные выше, лишь с префиксом _DMA в конце. Используя прерывания или DMA, мы должны быть готовы к тому, что в конце передачи мы получим ассинхронный запрос об этом. Это значит, что мы должны принять этот запрос и обработать его, разрешив и настроив контроллер прерывания NVIC и определив функцию HAL_SPI_IRQHandler() обработчик прерывания. Возможно шесть различных вызовов перечисленных в таблице 3. Когда SPI настроен на работу с DMA в циклическом режиме, можно использовать несколько функий для паузы, продолжения и отмены циклического режима отправки/приема DMA: Также в данном режиме существуют следующие ограничения: В этой главе не будет рассмотрено практическое применение SPI, но в последующих главах мы будем использовать SPI для программирования Ethernet контроллера. Максимальная частота тактирования при использовании CubeHALЧастота SCK производна от PCLK путем деления на соответствующий предделитель. Этот предделитель принимает значения от 21 до 28. Тем не менее, как уже несколько раз ранее было замечено, CubeHAL добавляет неизбежный расход ресурсов на управление периферией. И это также применимо и к SPI. Фактически, использование CubeHAL не дает возможности получить все возможные частоты SPI с различными режимами работы. Использование CubeMX для настройки SPIДля использования CubeMX в первую очеред необходимо включить необходимый SPI интерфейс. Далее выбрать необходимый режим работы, как показано на рисунке 5. Далее, необходимо настроить поведение сигнала NSS. После настройки этих двух параметров можно продолжить конфигурацию во вкладке Configuration CubeMX. Рисунок 5: Как выбрать режим работы SPI в CubeMX Если статья показалась вам полезной подписывайтесь на мой канал в telegram, чтобы не пропустить анонсы новых статей и другую интересную информацию для разработчиков. |

















