Интернет магазин китайских планшетных компьютеров



Компьютеры - Serial Peripheral Interface

13 мая 2011





SPI single slave.svg

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

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

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

  • MOSI или SI — выход ведущего, вход ведомого. Служит для передачи данных от ведущего устройства ведомому.
  • MISO или SO — вход ведущего, выход ведомого. Служит для передачи данных от ведомого устройства ведущему.
  • SCLK или SCK — последовательный тактовый сигнал. Служит для передачи тактового сигнала для ведомых устройств.
  • CS или SS — выбор микросхемы, выбор ведомого.


Пример программной реализации

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

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





Просмотров: 1925


<<< Serial Attached SCSI
SIO >>>