Serial Peripheral Interface

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
SPI single slave.svg

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

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

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

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

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

Ниже представлен пример программной реализации 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;
}

См. также[править | править исходный текст]

Ссылки[править | править исходный текст]