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 майстра на мові Сі. Лінія "chip select" (вибір мікросхеми) повинна бути активована (в більшості випадків це означає-притягнута до низького рівня), перед тим, як почнеться обмін даними, і деактивовано після закінчення обміну. Більшість пристроїв вимагають кілька сеансів передачі з активною лінією chip select. Ця функція може бути викликана кілька разів, поки лінія активна.

 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 on trailing edge * /  byte  | =  READMISO  (  )  ;  CLRCLK  (  )  ;  }  return  byte  ;  }