- Що таке протокол зв'язку SPI?
- Як працює протокол SPI?
- Різниця між I2C та SPI Communication
- SPI з PIC16F877A за допомогою компілятора XC8:
- Пояснення файлу заголовка SPI:
- Основна програма Пояснення:
- Імітація PIC за допомогою налагоджувача SPI:
Мікроконтролери PIC - це потужна платформа, що надається мікрочіпом для вбудованих проектів; його універсальний характер дозволив йому знаходити шляхи для багатьох застосувань, і він ще не зросте. Якщо ви дотримувались наших навчальних посібників з PIC, тоді б ви помітили, що ми вже охопили широкий спектр підручників з мікроконтролера PIC, починаючи з самих основ. У тому ж процесі ми продовжуємо вивчати комунікаційні протоколи, доступні з PIC, та способи їх використання. Ми вже охопили I2C мікроконтролером PIC.
У великій системі вбудованих програм жоден мікроконтролер не може виконувати всі дії самостійно. На певному етапі часу йому доводиться спілкуватися з іншими пристроями для обміну інформацією, існує багато різних типів протоколів зв'язку для обміну цією інформацією, але найбільш використовуваними є USART, IIC, SPI та CAN. Кожен протокол зв'язку має свої переваги та недоліки. Поки зосередимося на протоколі SPI, оскільки це те, про що ми збираємось дізнатися в цьому посібнику.
Що таке протокол зв'язку SPI?
Термін SPI означає " послідовний периферійний інтерфейс ". Це загальний протокол зв'язку, який використовується для передачі даних між двома мікроконтролерами або для зчитування / запису даних з датчика на мікроконтролер. Він також використовується для зв'язку з SD-картами, регістрами зсуву, контролерами дисплея та багатьма іншими.
Як працює протокол SPI?
SPI-зв'язок - це синхронний зв'язок, тобто він працює за допомогою тактового сигналу, який передається між двома пристроями, які обмінюються даними. Також це повнодуплексний зв'язок, оскільки він може надсилати та отримувати дані за допомогою окремої шини. Для роботи SPI-зв’язку потрібно 5 проводів. Проста схема зв'язку SPI між ведучим і веденим пристроєм показана нижче
П'ять проводів, необхідних для зв'язку, це SCK (послідовний годинник), MOSI (Master Out Slave In), MISO (Master In Slave Out) і SS (Slave Select). Зв'язок SPI завжди відбувається лише між ведучим і веденим. У господаря може бути підключено кілька рабів. Ведучий відповідає за генерацію тактового імпульсу, і він передається всім рабам. Також усі комунікації може ініціювати лише майстер.
Штифт SCK (він же SCL-послідовний годинник) передає сигнал тактової сигналу, який генерується ведучим, із підлеглими. Штифт MOSI (він же SDA –Serial Data Out) використовується для надсилання даних від головного пристрою до меду. Штифт MISO (він же SDI - послідовний вхід даних) використовується для отримання даних від контрольної мережі до головного. Ви також можете слідувати за стрілкою на наведеному малюнку, щоб зрозуміти рух даних / сигналу. Нарешті, штифт SS (він же CS - вибір чіпа) використовується, коли до ведучого підключено більше одного веденого модуля. Це можна використовувати для вибору необхідного веденого. Зразок схеми, де більше одного веденого підключено до ведучого для зв'язку SPI, показаний у схемі нижче.
Різниця між I2C та SPI Communication
Ми вже вивчили зв'язок I2C з PIC, і тому ми повинні бути знайомі з тим, як I2C працює, і де ми можемо їх використовувати, як I2C можна використовувати для взаємодії модуля RTC. Але тепер, навіщо нам протокол SPI, коли у нас вже є I2C. Причиною є те, що як I2C, так і SPI-комунікація є перевагами по-своєму, а отже, специфічною для застосування.
До певної міри можна вважати, що зв'язок I2C має певні переваги перед зв'язком SPI, оскільки I2C використовує меншу кількість виводів, і це стає дуже зручним, коли до шини підключена велика кількість ведених пристроїв. Але недоліком I2C є те, що він має однакову шину для надсилання та прийому даних, а отже, він порівняно повільний. Отже, це суто на основі програми, яка визначає між протоколом SPI та I2C для вашого проекту.
SPI з PIC16F877A за допомогою компілятора XC8:
Досить основ, тепер давайте дізнаємось, як ми можемо використовувати комунікацію SPI на мікроконтролері PIC16F877A за допомогою компілятора MPLABX IDE та XC8. Перш ніж ми почнемо чітко заявляти, що в цьому підручнику йдеться лише про SPI в PIC16F877a з використанням компілятора XC8, процес буде однаковим для інших мікроконтролерів, але можуть знадобитися незначні зміни. Також пам’ятайте, що для таких просунутих мікроконтролерів, як серія PIC18F, сам компілятор може мати вбудовану бібліотеку для використання функцій SPI, але для PIC16F877A нічого подібного не існує, тому давайте створимо його самостійно. Пояснена тут бібліотека буде надана у вигляді заголовкового файлу для завантаження внизу, який може бути використаний для PIC16F877A для зв'язку з іншими пристроями SPI.
У цьому підручнику ми напишемо невелику програму, яка використовує комунікацію SPI для запису та читання даних із шини SPI. Потім ми перевіримо те саме за допомогою моделювання Proteus. Весь код, пов'язаний з регістрами SPI, буде зроблений всередині заголовного файлу, який називається PIC16f877a_SPI.h. Таким чином ми можемо використовувати цей заголовочний файл у всіх наших майбутніх проектах, в яких потрібна комунікація SPI. А всередині основної програми ми просто будемо використовувати функції із заголовного файлу. Повний код разом із заголовком можна завантажити звідси.
Пояснення файлу заголовка SPI:
Усередині файлу заголовка ми повинні ініціалізувати зв'язок SPI для PIC16F877a. Як завжди найкращим місцем для початку є таблиця даних PIC16F877A. Регістрами, які контролюють зв'язок SPI для PIC16F8777a, є SSPSTAT та Реєстр SSPCON. Ви можете про них дізнатися на сторінках 74 і 75 таблиці.
Існує безліч варіантів параметрів, які слід вибрати під час ініціалізації зв'язку SPI. Найбільш часто використовуваний варіант - тактова частота буде встановлена на Fosc / 4 і буде виконана в середині, а годинник буде встановлений як низький в ідеальному стані. Отже, ми також використовуємо ту саму конфігурацію для нашого заголовного файлу, ви можете легко змінити їх, змінивши відповідні біти.
SPI_Initialize_Master ()
Функція ініціалізації SPI Master використовується для запуску зв'язку SPI як ведуча. Усередині цієї функції ми встановлюємо відповідні штифти RC5 і RC3 як вихідні штифти. Потім ми налаштовуємо SSPTAT та реєстр SSPCON, щоб увімкнути комунікацію SPI
порожнеча SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // стор. 74/234 SSPCON = 0b00100000; // стор. 75/234 TRISC3 = 0; // Установити в якості вихідного сигналу для веденого режиму }
SPI_Initialize_Slave ()
Ця функція використовується для налаштування мікроконтролера в робочому режимі для зв'язку SPI. Під час веденого режиму штифт RC5 повинен бути встановлений як вихід, а штифт RC3 повинен бути встановлений як вхід. SSPSTAT і SSPCON встановлюються однаково як для веденого, так і для ведучого.
порожнеча SPI_Initialize_Slave () { TRISC5 = 0; // PIN-код SDO повинен бути оголошений як вихідний SSPSTAT = 0b00000000; // стор. 74/234 SSPCON = 0b00100000; // стор. 75/234 TRISC3 = 1; // Встановити як вихід для головного режиму }
SPI_Write (вхідні символи)
Функція запису SPI використовується для запису даних на шину SPI. Він отримує інформацію від користувача через змінну вхідне, а потім використовує її для передачі до реєстру буфера. SSPBUF буде очищений під час послідовного імпульсу годинника, і дані будуть передаватися в шину побітно.
void SPI_Write (char вхідний) { SSPBUF = вхідний; // Запис даних, наданих користувачем, у буфер }
SPI_Ready2Read ()
Функція SPI Ready to Read використовується, щоб перевірити, чи повністю отримані дані на шині SPI і чи можна їх прочитати. Регістр SSPSTAT має біт, який називається BF, який буде встановлений після отримання даних повністю, тому ми перевіряємо, чи встановлений цей біт, якщо він не встановлений, то нам потрібно почекати, поки він не встановиться, щоб прочитати що-небудь із шини SPI.
непідписаний SPI_Ready2Read () { if (SSPSTAT & 0b00000001) return 1; else повертає 0; }
SPI_Read ()
SPI Read використовується для зчитування даних з шини SPI в мікроконтролер. Дані, що знаходяться в шині SPI, будуть зберігатися в SSPBUF, нам потрібно почекати, поки всі дані збережуться в буфері, а потім ми зможемо прочитати їх у змінну. Ми перевіряємо біт BF реєстру SSPSTAT перед зчитуванням буфера, щоб переконатися, що прийом даних завершено.
char SPI_Read () // Зчитування отриманих даних { while (! SSPSTATbits.BF); // Утримуємо, поки не встановлено біт BF, щоб переконатися, що зчитуються повні дані повернення (SSPBUF); // повернення прочитаних даних }
Основна програма Пояснення:
Функції, описані у наведеному вище розділі, будуть у файлі заголовка, і їх можна буде викликати до основного c-файлу. Тож давайте напишемо невелику програму, щоб перевірити, чи працює зв’язок SPI. Ми просто запишемо мало даних на шину SPI і використаємо моделювання proteus, щоб перевірити, чи отримуються ті самі дані в налагоджувачі SPI.
Як завжди, розпочніть програму, встановивши біти конфігурації, і тоді дуже важливо додати заголовний файл, який ми щойно пояснили, до програми, як показано нижче
#включати
Якщо ви відкрили програму із завантаженого вище zip-файлу, то за замовчуванням файл заголовка буде присутній у каталозі файлу заголовка вашого файлу проекту. В іншому випадку вам доведеться додавати файл заголовка вручну всередину вашого проекту, після додавання файлів проекту це буде виглядати нижче
Усередині основного файлу ми повинні ініціалізувати PIC як Master для зв'язку SPI, а потім всередині нескінченного циклу while ми запишемо випадкові три шістнадцяткові значення в шину SPI, щоб перевірити, чи отримуємо ми те саме під час моделювання.
void main () { SPI_Initialize_Master (); while (1) { SPI_Write (0X0A); __delay_ms (100); SPI_Write (0X0F); __delay_ms (100); SPI_Write (0X15); __delay_ms (100); } }
Зверніть увагу, що випадкові значення, що використовуються в програмі, є 0A, 0F та 15, і вони є шістнадцятковими значеннями, тому ми повинні бачити те саме під час моделювання. Тобто це все, код зроблений, це лише зразок, але ми можемо використовувати ту саму методологію для зв’язку з іншим MCU або з іншими модулями датчиків, що працюють за протоколом SPI.
Імітація PIC за допомогою налагоджувача SPI:
Тепер, коли наша програма готова, ми можемо її скомпілювати, а потім продовжити моделювання. У Proteus є приємна зручна функція, яка називається налагоджувачем SPI , яка може використовуватися для моніторингу даних через шину SPI. Отже, ми використовуємо те саме і будуємо схему, як показано нижче.
Оскільки в моделюванні є лише один пристрій SPI, ми не використовуємо штифт SS, і коли він не використовується, він повинен бути заземлений, як показано вище. Просто завантажте шістнадцятковий файл у мікроконтролер PIC16F877A та натисніть кнопку відтворення, щоб імітувати нашу програму. Після запуску моделювання ви отримаєте спливаюче вікно, яке відображає дані в шині SPI, як показано нижче
Давайте уважніше розглянемо надходять дані та перевіримо, чи вони однакові з тими, що ми писали у нашій програмі.
Дані надходять у тому самому порядку, що ми написали в нашій програмі, і те саме виділено для вас. Ви також можете спробувати змоделювати програму для зв’язку з двома мікроконтролерами PIC, використовуючи протокол SPI. Вам потрібно запрограмувати один PIC як ведучий, а інший як підлеглий. Усі необхідні для цього файли заголовка вже вказані у файлі заголовка.
Це лише проблиск того, що SPI може зробити, він також може читати та записувати дані на кілька пристроїв. Докладніше про SPI ми розглянемо у наступних навчальних посібниках, пов’язуючи різні модулі, що працюють з протоколом SPI.
Сподіваюся, ви зрозуміли проект і навчились з нього щось корисне. Якщо у вас є сумніви, опублікуйте їх у розділі коментарів нижче або скористайтесь форумами для отримання технічної допомоги.
Повний основний код наведено нижче; Ви можете завантажити файли заголовків з усім кодом звідси