Serial Peripheral Interface

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Ведущее (Master) и ведомое (Slave) устройства интерфейса SPI

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

В отличие от стандартного последовательного порта (англ. standard serial port), SPI является синхронным интерфейсом, в котором любая передача синхронизирована с общим тактовым сигналом, генерируемым ведущим устройством (процессором). Принимающая (ведомая) периферия синхронизирует получение битовой последовательности с тактовым сигналом. К одному последовательному периферийному интерфейсу ведущего устройства-микросхемы может присоединяться несколько микросхем. Ведущее устройство выбирает ведомое для передачи, активируя сигнал «выбор кристалла» (англ. chip select) на ведомой микросхеме. Периферия, не выбранная процессором, не принимает участия в передаче по SPI.

Интерфейс[править | править вики-текст]

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

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

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

  • 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[править | править вики-текст]

Частота следования битовых интервалов в линиях передачи данных определяется синхросигналом SCK, который генерирует ведущее устройство, ведомые устройства используют синхросигнал для определения моментов изменения битов на линии данных, при этом ведомые устройства никак не могут влиять на частоту следования битовых интервалов. Как в ведущем устройстве, так и в ведомом устройстве имеется счетчик импульсов синхронизации (битов). Счетчик в ведомом устройстве позволяет последнему определить момент окончания передачи пакета. Счетчик сбрасывается при выключении подсистемы SPI, такая возможность всегда имеется в ведущем устройстве. В ведомом устройстве счетчик обычно сбрасывается деактивацией интерфейсного сигнала SS.

Так как действия ведущего и ведомого устройства тактируются одним и тем же сигналом, то к стабильности этого сигнала не предъявляется никаких требований за исключением ограничения на длительность полупериодов, которая определяется максимальной рабочей частотой более медленного устройства. Это позволяет использовать SPI в системах с низкостабильной тактовой частотой, а также облегчает программную эмуляцию ведущего устройства.

Прием и передача данных в SPI[править | править вики-текст]

Типичная структура связей и линий интерфейса SPI

Передача осуществляется пакетами. Длина пакета как правило составляет 1 байт (8 бит), при этом известны реализации SPI с иной длиной пакета, например, 4 бита. Ведущее устройство инициирует цикл связи установкой низкого уровня на выводе выбора подчиненного устройства (SS) того устройства, с которым необходимо установить соединение. При низком уровне сигнала SS:

  • схемотехника ведомого устройства находится в активном состоянии;
  • вывод MISO переводится в режим «выход»;
  • тактовый сигнал SCK от ведущего устройства воспринимается ведомым и вызывает считывание на входе MOSI значений передаваемых от ведущего битов и сдвиг регистра ведомого устройства.

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

Регистры SPI[править | править вики-текст]

Регистр управления[править | править вики-текст]

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

  • Биты 0 и 1: SPR0 и SPR1 (англ. SPI Clock Rate Select) — выбор частоты тактового сигнала. Биты предназначены для управления тактовой частотой, что актуально только для ведущего устройства.
  • Бит 2: CPHA (англ. Clock Phase) — фаза тактового сигнала.
  • Бит 3: CPOL (англ. Clock Polarity) — полярность тактового сигнала.
  • Бит 4: MSTR (англ. Master/Slave Select) — выбор режима «ведущий/ведомый». Установка бита в 1 переводит устройство в режим ведущего, установка бита в 0 — в режим ведомого.
  • Бит 5: DORD (англ. Data Order) — порядок данных. Бит управляет порядком передачи данных (с бита 0 или с бита 7).
  • Бит 6: SPE (англ. SPI Enable) — разрешение работы SPI. Установка бита в 1 разрешает работу интерфейса, сигналы от порта подключаются к внешним линиям связи интерфейса.
  • Бит 7: SPIE (англ. SPI Interrupt Enable) — разрешение прерывания от SPI.

Регистр статуса[править | править вики-текст]

Ниже описаны значения восьми бит регистра статуса интерфейса SPI.

  • Биты 0…5 — зарезервированы, всегда установлены в 0.
  • Бит 6: WCOL (англ. Write Collision Flag) — флаг ошибки при записи. Бит устанавливается в 1 при записи в регистр в ходе обмена последовательными данными. Бит сбрасывается в 0 при чтении регистра статуса.
  • Бит 7: SPIF (англ. SPI Interrupt Flag) — флаг прерывания SPI. Бит устанавливается в 1 при завершении обмена данными. Бит сбрасывается в 0 при считывании данных из буфера регистра данных.

Режимы работы интерфейса SPI[править | править вики-текст]

Временные диаграммы работы интерфейса SPI при CPHA = 0 (красная вертикальная линия) и CPHA = 1 (синяя вертикальная линия)

Возможны четыре комбинации фазы (CPHA) и полярности (CPOL) сигнала SCLK по отношению к сигналам данных. Режимы работы определяются комбинацией бит CPHA и CPOL:

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

Для обозначения режимов работы интерфейса SPI принято следующее соглашений:

  • режим 1 (CPOL = 0, CPHA = 0);
  • режим 2 (CPOL = 0, CPHA = 1);
  • режим 3 (CPOL = 1, CPHA = 0);
  • режим 4 (CPOL = 1, CPHA = 1).

Топология систем связи на базе SPI[править | править вики-текст]

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

Радиальная структура связи с несколькими ведомыми устройствами через SPI

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

Кольцевая структура связи с несколькими ведомыми устройствами через SPI

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

Преимущества и недостатки интерфейса SPI[править | править вики-текст]

Преимущества[править | править вики-текст]

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

Недостатки[править | править вики-текст]

  • Необходимо больше выводов, чем для интерфейса I²C.
  • Ведомое устройство не может управлять потоком данных
  • Нет подтверждения приема данных со стороны ведомого устройства (ведущее устройство может передавать данные «в никуда»).
  • Нет определенного стандартом протокола обнаружения ошибок.
  • Отсутствие официального стандарта, что делает невозможным сертификацию устройств.
  • По дальности передачи данных интерфейс SPI уступает таким стандартам, как RS-232, RS-485 и CAN.
  • Наличие множества вариантов реализации интерфейса.
  • Отсутствие поддержки горячего подключения устройств.

Пример программной реализации[править | править вики-текст]

Ниже представлен пример программной реализации SPI мастера на языке Си. Линия CS (chip select, выбор микросхемы) должна быть активирована (в большинстве случаев — притянута к низкому уровню), перед тем, как начнётся обмен данными, и деактивирована после окончания обмена. Большинство устройств требуют несколько сеансов передачи с активной линией CS. Эта функция может быть вызвана несколько раз, пока линия активна.

unsigned char SPIBitBang8BitsMode0(unsigned char byte)
{       
    unsigned char bit;
 
    for (bit = 0; bit < 8; bit++) {
        /* записать MOSI по спаду предыдущего тактового импульса */
        if (byte & 0x80)
            SETMOSI();
        else
            CLRMOSI();
        byte <<= 1;
 
        /* ждём половину тактового периода перед тем как сгенерировать фронт */
        SPIDELAY(SPISPEED/2);
        SETCLK();
 
        /* ждём половину тактового периода перед тем как сгенерировать спад */
        SPIDELAY(SPISPEED/2);
 
        /* читаем MISO на спаде */
        byte |= READMISO();
        CLRCLK();
    }
 
    return byte;
}

См. также[править | править вики-текст]

Литература[править | править вики-текст]

  • Болл Стюарт Р. Аналоговые интерфейсы микроконтроллеров. — М.: Додэка-XXI, 2007. — 360 с. — (Программируемые системы). — 2000 экз. — ISBN 978-5-94120-142-6.
  • Лапин А.А. Интерфейсы. Выбор и реализация. — М.: Техносфера, 2005. — 168 с. — (Мир электроники). — 5000 экз. — ISBN 5-94836-058-X.

Ссылки[править | править вики-текст]