Вивчаємо інтерфейс SPI і підключаємо до Arduino сдвиговый регістр, до якої ми будемо звертатися за цим протоколом для управління світлодіодами.
1
SPI - Serial Peripheral Interface або "Послідовний периферійний інтерфейс" - це синхронний протокол передачі даних для сполучення ведучого пристрою (Master) з периферійними пристроями (Slave). Провідним пристроєм часто є мікроконтролер. Зв'язок між пристроями здійснюється за чотирма проводах, тому SPI іноді називають "чьотирьох інтерфейс". Ось ці шини:MOSI (Master Slave Out In) - лінія передачі даних від ведучого до веденим пристроїв;MISO (Master In Slave Out) - лінія передачі від веденого до ведучого пристрою;SCLK (Serial Clock) - тактові імпульси синхронізації, що генеруються провідним пристроєм;SS (Slave Select) - лінія вибору веденого пристрою; коли на лінії "0", ведений пристрій "розуміє", що зараз звертаються до нього.Існує чотири режими передачі даних (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), зумовлені поєднанням полярності тактових імпульсів (працюємо за рівнем HIGH або LOW), Clock Негативна, CPOL, і фазою тактових імпульсів (синхронізація по переднього або заднього фронту тактового імпульсу), Clock Phase, CPHA. На малюнку показані два варіанти підключення пристроїв по протоколу SPI: незалежне і каскадне. При незалежному підключенні до шині SPI провідне пристрій звертається до кожного веденого пристрою індивідуально. При каскадному - ведені пристрої спрацьовують по черзі, каскадом.
2
Arduino шини інтерфейсу SPI знаходяться на певних портах. У кожній плати свою відповідність висновків. Для зручності висновки проаналізовані та винесені також на окремий роз'єм ICSP (In Circuit Serial Programming, програмування пристрою, включеного в ланцюг, по послідовному протоколу). Зверніть увагу, що на роз'ємі ICSP відсутня пін вибору веденого - SS, оскільки мається на увазі, що Arduino буде використовуватися як провідне пристрій у мережі. Але при необхідності ви можете призначити будь-який цифровий висновок Ардуїнов як SS.На малюнку наведено стандартне відповідність висновків шин SPI для Arduino UNO і Nano.
3
Для Arduino написана спеціальна бібліотека, яка реалізує протокол SPI. Підключається вона так: на початку програми додаємо #include SPI.hЩоб почати роботу по протоколу SPI, потрібно задати налаштування і потім ініціалізувати протокол з допомогою процедури SPI.beginTransaction(). Можна виконати це однією інструкцією: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0)).Це означає, що ми ініціалізуємо протокол SPI на частоті 14 МГц, передача даних йде, починаючи з MSB (найбільш значущого біта), в режимі "0". Після ініціалізації вибираємо ведений пристрій, переводячи відповідний пін SS в стан LOW. Потім передаємо веденого пристрою дані командою SPI.transfer(). Після передачі повертаємо SS в стан HIGH.Робота з протоколом завершується командою SPI.endTransaction(). Бажано мінімізувати час виконання передачі між інструкціями SPI.beginTransaction() і SPI.endTransaction(), щоб не виникало накладок, якщо інше пристрій спробує ініціалізувати передачу даних, використовуючи інші налаштування.
4
Розглянемо практичне застосування інтерфейсу SPI. Будемо запалювати світлодіоди, керуючи 8-бітним зсувними регістром по шині SPI. Підключимо до Arduino сдвиговый регістр 74HC595. До кожного з 8-ми виходів підключимо за світлодіоду (через обмежувальний резистор). Схема приводиться на малюнку.
5
Напишемо такий скетч. Спочатку підключаємо бібліотеку SPI і ініціалізуємо інтерфейс SPI. Визначимо пін 8 pin вибору веденого пристрою. Очистимо сдвиговый регістр, пославши до нього значення "0". Ініціалізуємо послідовний порт.Щоб запалити певний світлодіод з допомогою сдвигового регістра, потрібно подати на його вхід 8-розрядне число. Наприклад, щоб загорівся перший світлодіод - подаємо двійкове число 00000001, щоб другий - 00000010, щоб третій - 00000100, і т. д. Ці двійкові числа в перекладі в десяткову систему числення утворюють таку послідовність: 1, 2, 4, 8, 16, 32, 64, 128 і є степенями двійки від 0 до 7.Відповідно, в циклі loop() за кількістю світлодіодів робимо перерахунок від 0 до 7. Функція pow(підстава, ступінь) зводить 2 ступінь лічильника циклу. Мікроконтролери не дуже точно працюють з числами типу "double", тому для перетворення результату в ціле число використовуємо функцію округлення round(). І передаємо число, що вийшло в сдвиговый регістр. Для наочності в моніторі послідовного порту виводяться значення, які виходять при цій операції: одиничка біжить за розрядами - світлодіоди спалахують хвилею.
6
Світлодіоди загоряються по черзі, і ми спостерігаємо, що біжить "хвилю" з вогників. Управління світлодіодами здійснюється з допомогою сдвигового регістра, до якого ми підключилися по інтерфейсу SPI. В результаті для управління 8-ю світлодіодами задіяні всього 3 виводу Arduino.Ми вивчили найпростіший приклад роботи Arduino з шиною SPI. Більш докладно розглянемо підключення зсувних регістрів в окремій статті.
В. О. Т.