Sw-motors.ru

Автомобильный журнал
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Описание интерфейса SPI

Описание интерфейса SPI

Интерфейс SPI — это один из самых популярных на сегодняшний день последовательных интерфейсов. Он был придуман фирмой Motorola и очень быстро завоевал популярность благодаря своей исключительной простоте и высокой скорости. При этом, SPI, наверное, нельзя назвать в полной мере интерфейсом, скорее это просто принцип связи, поскольку всё, что подразумевается под SPI, — это логика передачи данных между двумя устройствами («Ведущий»-«Ведомый»), физике же уделяется гораздо меньшее внимание, она реализуется, можно сказать, «по обстоятельствам», а никакого протокола нижнего уровня вообще нет, тут каждый производитель придумывает что-то своё.

Ну что ж, — с главного и начнём. Итак, в чём же тут логика? Логика в том, что данные передаются последовательно, побитно, при этом считывание и установка данных разделены во времени с помощью специального синхросигнала на специальной шине. Эта шина называется шиной тактирования (или шиной синхронизации), а суть разделения заключается в том, что считывание и установка данных происходят по противоположным фронтам генерируемых на шине синхроимпульсов. Такое, чётко разделённое во времени, чередование установок и считываний даёт возможность использовать один и тот же регистр и для приёма, и для передачи данных. Ранее (когда память была маленькой и дорогой, операционки хранились на дискетах, а по полям бегали мамонты ) это было серьёзным преимуществом, более того, именно под это на самом деле изначально и затачивался SPI, однако сейчас никаких проблем с обьёмом памяти нет и большинство устройств спокойно могут позволить себе иметь отдельные входной и выходной регистры.

Устройство, управляющее шиной тактирования (то есть генерирующее на ней синхроимпульсы), является «Ведущим» или «Мастером». Собственно, «Master» управляет всем обменом данными, — он решает: когда начинать обмен, когда заканчивать, сколько бит передать и т.д. Второе устройство, участвующее в обмене, является «Ведомым» или «Slave». В SPI, в отличии от, например, того же I2C, «Slave» совсем бесправен, он вообще никак не может влиять на шину тактирования и никак не может сообщить мастеру, что не успевает или, наоборот, что уже готов к обмену. То есть «Мастер» сам должен знать: когда, что и на какой скорости спросить у «Слэйва», чтобы тот смог ему ответить.

Всего, для полнодуплексного обмена (в обе стороны одновременно), в интерфейсе SPI используются 4 линии (смотрим рисунок): SCLK, MOSI, MISO и SS.

  1. SCLK — шина тактирования (на этой линии мастер генерирует синхроимпульсы)
  2. MOSI (Master Out, Slave In) — выход ведущего, вход ведомого (по этой линии мастер передаёт данные слэйву)
  3. MISO (Master In, Slave Out) — вход ведущего, выход ведомого (по этой линии мастер принимает данные от слэйва)
  4. SS (Slave Select) — выбор ведомого (с помощью этой линии мастер управляет сеансами обмена)

«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).

Читать еще:  Subaru tribeca тюнинг двигателя

В зависимости от сочетания значений CPOL и CPHA различают 4 режима работы интерфейса SPI, которые так и обозначают Mode0, Mode1, Mode2 и Mode3. Ниже приведена картинка, иллюстрирующая как происходит установка и чтение данных, в зависимости от выбранного режима.

Хотелось бы подчеркнуть, что SS — это именно линия управления сеансом обмена, а не просто линия выбора слэйва. Разница тут в том, что если считать SS просто линией выбора слэйва, то при подключении мастера к одному единственному слэйву возникает соблазн этой линией не управлять, а жёстко закоротить её на общий провод (типа чтоб слэйв всегда был выбран). Однако, логика слэйва обычно такова, что начало сеанса сопровождается различными подготовительными процедурами, такими как загрузка данных в выходной сдвиговый регистр и сброс счётчика импульсов, а выполнять какие-то действия (в соответствии с принятыми по SPI командами от мастера) слэйв начинает только после завершения сеанса обмена. Кроме того, вам ведь вполне может понадобиться несколько сеансов общения (например, если в первом сеансе вы посылаете команды, а в следующем хотите получить отчёт о результате их выполнения). Думаю понятно, что если жёстко притянуть линию SS к общему проводу, то ни о каком распознавании начала и конца сеанса обмена (начало распознаётся по спаду на линии SS, а конец — по подъёму) не может быть и речи, соответственно весь обмен данными будет нарушен. Так что важность сигнала SS не стоит недооценивать.

Ну и напоследок скажу, что наиболее популярными являются режимы Mode0 и Mode3.

Более подробно о том, как происходит обмен, что должен уметь SPI-мастер и как это программно реализовать на микроконтроллере (на примере контроллеров PIC и AVR) можно почитать в статье «Программная реализация ведущего шины SPI»

4a4ik

Страницы

4 августа 2015 г.

Как работать с SPI — Теория

SPI (Serial Peripheral Interface, последовательный периферийный интерфейс, шина SPI) — Это интерфейс для передачи данных на короткое расстояние, разработанный Motorola. Данные передаются в режиме полного дуплекса (в обе стороны) используя архитектуру ведущий — ведомый (master-slave). SPI также иногда называют четырёхпроводным (four-wire) интерфейсом.

Рис.1 стандартное общение по SPI

В шине SPI используются 4 цифровых сигнала:

  • MOSI : (Master Out Slave In) выход ведущего, вход ведомого.
  • MISO : (Master In Slave Out) вход ведущего, выход ведомого.
  • SCLK : (Serial Clock) тактовый сигнал.
  • CS или SS : (Chip Select, Slave Select) выбор микросхемы, выбор ведомого.
  • MOSI : SIMO, SDO, DO, DOUT, SI, MTSR;
  • MISO : SOMI, SDI, DI, DIN, SO, MRST;
  • SCLK : SCK, CLK;
  • SS : nCS, CS, CSB, CSN, nSS, STE, SYNC.

Шина SPI может работать с 1 ведущим (master) и несколькими ведомыми (slave) устройствами. Если используется одно ведомое устройство, то его вход SS можно заземлить, но только если он не работает по срезу сигнала.

Если использовать несколько ведомых устройств, то нужно повесить подтягивающие резисторы на каждый из выводов SS и убедиться что выходы MISO каждого из устройств подключены через буфер с высокоимпедансным состоянием (практически вывод считается отключённым), это может быть реализовано внутри микросхемы, нужно изучать документацию на конкретное устройство.

Рис.2 Правильное включение нескольких SPI устройств

Если внутри устройств не предусмотрен буфер, то линия MISO будет всегда в состоянии лог.0 или лог.1. (также она может сгореть). Чтобы проверить есть ли внутри нашего устройства буфер, можно прочитать документацию или подключить делитель напряжения, чтобы на линии MISO была половина напряжения питания, затем замерить настоящее напряжение. Если замеренное нами значение отличается (будет 0 В или напряжение питания), то буфера нет и его нужно поставить отдельной микросхемой.

Рис.3 Проверка присутствия внутреннего буфера

Ведущий и ведомый передают друг другу данные одновременно. Сперва нужно выбрать ведомое устройство выставив на его входе SS низкий логический уровень (может меняться в зависимости от производителя). Данные для передачи помещаются в сдвиговые регистры. Затем ведущий генерирует синхросигналы частотой около нескольких МГц, ведущий и ведомый начинают посылать друг другу информацию хранимую в сдвиговых регистрах бит за битом начиная со старшего разряда.

Рис.4 Передача данных по SPI

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

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

Для настройки интерфейса используются несколько регистров, Можно регулировать частоту, прерывания, порядок бит и многое другое, подробнее об этом можно узнать в документации от Motorola ee.nmt.edu, этот документ взят как стандарт для SPI. Но производители могут не использовать всех настроек описанных там, также биты могут быть расставлены в другой последовательности в отличии от описания Motorola. В любом случае нужно читать документацию на конкретное устройство.

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

В принципе, эти настройки можно понять из временной диаграммы:

Рис.4 Временная диаграмма передачи пакета данных при различных настройках

  • CPOL = 0 : сигнал синхронизации начинается с низкого уровня;
  • CPOL = 1 : сигнал синхронизации начинается с высокого уровня;
  • CPHA = 0 : данные записываются по переднему фронту сигнала синхронизации;
  • CPHA = 1 : данные записываются по заднему фронту сигнала синхронизации.

Задний и передний фронты обозначают первое изменение синхросигнала, либо второе. Это не зависит от того в какое состояние переходит линия SCK, это может быть как спадающий так и нарастающий фронт.

В зависимости от состояния битов CPHA и CPOL, различают 4 режима работы SPI интерфейса (0, 1, 2 или 3). Но в зависимости от производителя они часто соответствуют разным состояниям битов, к примеру, у ARM и PIC32MX контроллеров ни 1 из режимов не совпадает.

Есть 2 популярных способа включения нескольких SPI, первый из них подключение «звезда» (daisy chain):

Рис.5 Топология типа «звезда»

В этом случае ведущий выбирает, кому из ведомых устройств следует передать данные.

Может быть такое что ведомые устройства не совместимы друг с другом и им нужны разные настройки, к примеру различная длина пакета, в таком случае используют соединение типа «кольцо»:

Рис.6 Топология типа «кольцо»

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

Читать еще:  Что такое пульсирующий реактивный двигатель

SPI интерфейс заслужил свою популярность благодаря простоте и дешевизне. Сейчас его можно встретить в огромном количестве устройств, С его помощью программируются МК, JTAG также реализован на основе SPI. он часто используется для общения с различными микросхемами: Flash память, EEPROM, LCD, SD карты, АЦП, ЦАП микросхемы и многое другое.

Хоть стандарт и описан Моторолой, нет чётких определений и границ для SPI, из-за чего можно встретить различные реализации этого интерфейса, может использоваться другое количество сигнальных линий, количество бит в пакете и другие способы настройки. Так что сперва нужно читать документацию на устройство с которым вы работаете.

Есть готовые реализации SPI «трансиверов» которые можно подключить к компьютеру, что может быть полезно для отладки различных проектов, также новые осциллографы и логические анализаторы могут расшифровывать SPI пакеты.

Преимущества

  • Полнодуплексная передача данных.
  • Более высокая пропускная способность по сравнению с I²C или SMBus.
  • Возможность произвольного выбора длины пакета.
  • более низкие требования к энергопотреблению по сравнению с I²C и SMBus;
  • возможно использование в системах с низко стабильной тактовой частотой;
  • ведомым устройствам не нужен уникальный адрес, в отличие от таких интерфейсов, как I²C, GPIB или SCSI.
  • Используется только четыре вывода, что гораздо меньше, чем для параллельных интерфейсов.
  • Однонаправленный характер сигналов позволяет при необходимости легко организовать гальваническую развязку между ведущим и ведомыми устройствами.
  • Максимальная тактовая частота ограничена только быстродействием устройств, участвующих в обмене данными.
  • Необходимо больше выводов, чем для интерфейса I²C.
  • Ведомое устройство не может управлять потоком данных.
  • Нет подтверждения приема данных со стороны ведомого устройства (ведущее устройство может передавать данные «в никуда»).
  • Нет определенного стандартом протокола обнаружения ошибок.
  • Отсутствие официального стандарта, что делает невозможным сертификацию устройств.
  • По дальности передачи данных интерфейс SPI уступает таким стандартам, как UART и CAN.
  • Наличие множества вариантов реализации интерфейса.
  • Отсутствие поддержки горячего подключения устройств.

SPI -Serial Peripheral Interface, краткое руководство

Данная статья является кратким дискурсом по шине SPI и не должна восприниматься как точная техническая документация. Рассматривается только полнодуплексный вариант применения.

Общие сведения:

SPI — (Serial Peripheral Interface) эспиай, последовательный периферийный интерфейс иногда называемый 4-х проводным интерфейсом, является последовательным синхронным интерфейсом передачи данных. Изобретён компанией Motorola в середине 1980-x. В отличие от I2C и UART, SPI требует больше сигналов для работы, но может работать на более высоких скоростях. Не поддерживает адресацию, вместо этого используется сигнал SS (slave select — выбор ведомого), который также иногда называется CS (chip select), CE (chip enable) или SE (slave enable). Поддерживает только одного ведущего на шине. Ведущий устанавливает скорость обмена данными и другие параметры, такие как полярность и фаза тактирования. Обмен данными происходит в режиме полного дуплекса, что означает устройства на шине могут одновременно передавать и принимать данные. Интерфейс использует следующие сигналы (в номенклатуре AVR, для получения точного названия сигналов обратитесь к технической документации микросхемы, с которой работаете):

  • MISO (master in slave out) — вход ведущего, выход ведомого
  • MOSI (master out slave in) — выход ведущего, вход ведомого
  • SCK (serial clock) — сигнал тактирования
  • SS (slave select) — сигнал выбор ведомого.

Несмотря на то, что интерфейс называется 4-х проводным, для подключения нескольких ведомых понадобится по одному проводу SS для каждого ведомого (в полнодуплексной реализации). Сигналы MISO, MOSI и SCK являются общими для всех устройств на шине. Ведущий посылает сигнал SS для того ведомого, обмен данными с которым будет осуществляться. Простыми словами, все ведомые, кроме выбранного ведущим будут игнорировать данные на шине. SS является инверсным (active-low), что означает что ведущему необходимо прижать эту линию для выбора ведомого.

Подключение:

SPI на Arduino:

Arduino UNO/Piranha UNO/Arduino ULTRA

На Arduino UNO/Piranha UNO/Arduino ULTRA выводы аппаратного SPI расположены на 10, 11, 12 и 13 выводах, а так же эти выводы соединены с колодкой ICSP (in circuit serial programmer):

СигналВывод
SS10
MOSI11
MISO12
SCK13

Arduino MEGA

На Arduino MEGA выводы аппаратного SPI расположены на 50, 51, 52 и 53 выводах, а так же эти выводы соединены с колодкой ICSP (in circuit serial programmer):

СигналВывод
SS53
MOSI51
MISO50
SCK52

Пример для Arduino

В этих примерах мы соединим две Arduino по SPI по следующей схеме:

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

Arduino UNO в качестве ведущего:

Arduino UNO в качестве ведомого:

После соединения двух Arduino по SPI и загрузки соответствующих скетчей, мы будем получать следующее сообщение в мониторе последовательного порта ведомого микроконтроллера раз в секунду:

SPI на Raspberry Pi

На Raspberry Pi выводы аппаратного SPI расположены на выводах GPIO7, GPIO8, GPIO9, GPIO10, GPIO11:

Перед работой с SPI необходимо его включить. Сделать это можно из эмулятора терминала командой sudo raspi-config -> Interfacing options -> Serial -> No -> Yes -> OK -> Finish или из графической среды в главном меню -> Параметры -> Raspberry Pi Configuration -> Interfaces -> SPI

Подробное описание как это сделать можно посмотреть по ссылке Raspberry Pi, включаем I2C, SPI

Пример работы с SPI на Python:

В отличие от Arduino для Raspberry не существует простых решений для работы в режиме ведомого. Подробней ознакомиться с работой чипа BCM Raspberry можно в технической документации на официальном сайте, стр. 160.

Для проверки работы сценария можно подключить Raspberry по SPI к Arduino со скетчем из примера выше через преобразователь уровней или Trema+Expander Hat:

Подробнее о SPI

Параметры

Существуют четыре режима работы SPI, зависящие от полярности (CPOL) и фазы (CPHA) тактирования:

РежимПолярностьФазаФронт тактированияФронт установки бита данных
SPI_MODE0СпадающийНарастающий
SPI_MODE11НарастающийСпадающий
SPI_MODE21НарастающийСпадающий
SPI_MODE311СпадающийНарастающий

В Arduino IDE для установки режима необходимо передать функции, возвращающей объект настроек параметр режима работы SPI_MODE, например:

Для выбора режима работы SPI на Raspberry Pi необходимо вызвать дескриптор объекта SpiDev().mode и присвоить ему битовые значения CPOL и CPHA, например:

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

Скорость передачи данных устанавливается ведущим и может меняться «на лету». Программист в силах указать лишь максимальную скорость передачи данных.

Последовательный интерфейс SPI

SPI (Serial Peripheral Interface) – последовательный синхронный стандарт передачи данных в режиме полного дуплекса, разработанный компанией Motorola для обеспечения простого и недорогого сопряжения микроконтроллеров и периферии. SPI также иногда называют четырехпроводным (англ. four-wire) интерфейсом. SPI является синхронным протоколом, в котором любая передача синхронизирована с общим тактовым сигналом, генерируемым ведущим устройством (процессором). Принимающая периферия (ведомая) синхронизирует получение битовой последовательности с тактовым сигналом. К одному последовательному периферийному интерфейсу ведущего устройства-микросхемы может присоединяться несколько микросхем. Ведущее устройство выбирает ведомое для передачи, активируя сигнал «выбор кристалла» (chip select) на ведомой микросхеме. Периферия, не выбранная процессором, не принимает участие в передаче по SPI.
В SPI используются четыре цифровых сигнала:

  • MOSI или SI – выход ведущего, вход ведомого (англ. Master Out Slave In). Служит для передачи данных от ведущего устройства ведомому;
  • MISO или SO – вход ведущего, выход ведомого (англ. Master In Slave Out). Служит для передачи данных от ведомого устройства ведущему.
  • SCK или SCLK – последовательный тактовый сигнал (англ. Serial CLocK). Служит для передачи тактового сигнала для ведомых устройств.
  • CS или SS – выбор микросхемы, выбор ведомого (англ. Chip Select, Slave Select).Как правило, выбор микросхемы производится низким логическим уровнем.

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

Режим SPIВременная диаграмма
Режим SPI0
Активные уровень импульсов — высокий.
Сначала защёлкивание, затем сдвиг.
Режим SPI1
Активные уровень импульсов — высокий.
Сначала сдвиг, затем защёлкивание.
Режим SPI2
Активные уровень импульсов — низкий.
Сначала защёлкивание, затем сдвиг.
Режим SPI3
Активные уровень импульсов — низкий.
Сначала сдвиг, затем защёлкивание.

В таблице принято:

  • MSB — старший бит;
  • LSB — младший бит.

Мастеру приходится настраиваться на тот режим, который используется ведомым.
При обмене данными по интерфейсу SPI микроконтроллер может работать как ведущий (режим Master) либо как ведомый (режим Slave). При этом пользователь может задавать следующие параметры:

  • режим работы в соответствии с таблицей;
  • скорость передачи;
  • формат передачи (от младшего бита к старшему или наоборот).

Соединение двух микроконтроллеров по структуре ведущий – ведомый по интерфейсу SPI осуществляется по следующей схеме.

Выводы SCK, CS для ведущего микроконтроллера являются выходами, а ведомого микроконтроллера – входами.

Передача данных осуществляется следующим образом. При записи в регистр данных SPI ведущего микроконтроллера запускается генератор тактового сигнала модуля SPI, и данные начинают побитно выдаваться на вывод MOSI и соответственно поступать на вывод MOSI ведомого микроконтроллера. После выдачи последнего бита текущего байта генератор тактового сигнала останавливается с одновременной установкой в «1» флага «Конец передачи». Если поддерживаются и разрешены прерывания от модуля SPI, то генерируется запрос на прерывание. После этого ведущий микроконтроллер может начать передачу следующего байта либо, подав на вход SS ведомого напряжение уровня логической «1», перевести его в состояние ожидания.

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

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

Вывод SS предназначен для выбора активного ведомого устройства и в режиме Slave всегда является входом. Каждый раз, когда на вывод SS подается напряжение уровня логической «1», происходит сброс модуля SPI. Если изменение состояния этого вывода произойдет во время передачи данных, и прием, и передача немедленно прекратятся, а передаваемый и принимаемый байты будут потеряны.

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

Если вывод сконфигурирован как вход, то для обеспечения нормальной работы модуля SPI на него должно быть подано напряжение высокого уровня. Подача на этот вход напряжения низкого уровня от какой-либо внешней схемы будет воспринята модулем SPI как выбор микроконтроллера в качестве ведомого (при этом ему начинают передаваться данные).

Пример использования интерфейса SPI для микроконтроллеров STM32 хорошо описан в этой статье.
Назад

Основы работы протокола SPI.

SPI(Serial Peripheral Bus) — последовательный периферийный протокол обмена. Этот прокол был разработан компанией Motorola, но в настоящее время используется многими производителями. Он предназначен для связи микроконтроллеров между собой, а также со всевозможной периферией: датчиками, AЦП, микросхемами памяти, часами. Но все же наиболее частое применение SPI – это запись программы в память микроконтроллера. В микроконтроллерах AVR c помощью SPI можно прошить микроконтроллер не выпаивая из платы, такой способ прошивки называется ISP(In System Programming ). Хотя названия SPI и ISP очень созвучны, это не одно и то же, в AVR SPI используется как физический уровень ISP, то есть используются линии SPI для передачи данных, но сам протокол(программный уровень) отличается.

Для передачи данных в SPI используется три линии:

MISO(Master Input Slave Output) – по этой линии Master(ведущий) принимает данные от Slave(ведомого).

MOSI(Master Output Slave Input) – по этой линии Master отправляет данные Slave.

SCK(Serial Clock ) – служит для передачи тактового сигнала ведомому устройству.

Также используется линия SS(Slave Select), которая определяет устройство с которым Master будет обмениваться данными.

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

Физическая реализацию SPI, представляет собой два соединённых вместе сдвиговых регистра.

SPI — синхронный интерфейс, то есть для того чтобы получить какие-нибудь данные от Slave, Master должен что-нибудь отправить. Вроде всё понятно, но что если Master отправляет один байт, а Slave должен вернуть ему два? В таком случае Master должен отправить ему что-нибудь 2 раза, например 0х00.

На этом всё, выше пример кода взятый из рабочего проекта.

голоса
Рейтинг статьи
Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector