Що таке 4 провідний інтерфейс spi. Як працювати з SPI – Теорія. Тимчасова діаграма сигналів

Сьогодні ми починаємо знайомство із шиною SPI (Serial Peripheral Interface).

Ця шина дуже широко використовується в електроніці. Вона дуже зручна, будучи синхронною і повнодуплексною, тому застосовується в багатьох схемах для спілкування між різними цифровими забудовами - датчиками, контролерами, драйверами та іншими пристроями.

Ще одним найважливішим фактором необхідності нашого з нею знайомства є те, що дана шина апаратно організована у контролерах AVR.

Мало того, хочемо ми цього чи не хочемо, з інтерфейсом SPI ми з вами спілкуємося вже давним давно, як тільки вперше почали прошивати наш контролер, оскільки прошивається він саме за допомогою даного інтерфейсу.

Тому хочеться познайомитися з цією шиною ближче.

Давайте відкриємо технічну документацію на контролер Atmega8, відкриємо сторінку, де зображено розпинування даного контролера і подивимося, що від 16 до 19 ніжки і є висновки шини SPI

Тепер трохи докладніше про дані висновки

SS (chip select)- Це ніжка вибору пристрою. Якщо на веденому пристрої на цій ніжці встановиться низький рівень, цей пристрій буде відгукуватися і обмінюватися інформацією по шині SPI, якщо високий, то не буде.

MOSI (master output slave input)- Це ніжка виходу ведучого пристрою та входу веденого пристрою.

MISO (master input slave output)- Навпаки, вихід веденого, вхід ведучого.

SCK- Ніжка синхронізації. До всіх пристроїв, що беруть участь в обміні інформацією по даній шині, подаються синхроімпульси з певною частотою.

Ось схема реалізації шини SPI у контролері Atmega8

Як у будь-якій шині, тут є низка регістрів, у яких зберігається певна інформація.

Нам цікавий SHIFT REGISTER, через нього відбувається обмін інформації. Як тільки на ніжці синхронізації буде певний фронт, або низхідний або висхідний, залежно від налаштування, дані регістри у веденого та ведучого пристрою обміняються інформацією, причому не всією інформацією, а лише одним бітом. Дані регістри зрушать ліворуч і старші біти з кожного регістру підуть у молодші біти такого ж регістру сполученого пристрою. Тобто ведений передасть свій старший біт через ніжку MOSI ведучому, який його запише в зсув, що звільнився, вліво молодший біт, а ведений свій витіснений за рахунок зсуву передасть старший біт через ніжку MISO в молодший біт ведучого. Ось так і йде обмін, тобто за 8 повних циклів тактування вони повністю обмінюються байтами

Як тільки всі 8 біт одного байта інформації передадуться, певний регістр нам просигналізує про те, що цей процес закінчено. Точніше, певний біт певного регістру.

Також у блок-схемі ми бачимо дільник, на вхід якого надходять тактові імпульси і вже потім розділені на певне значення надходять по ланцюжку на ніжку SCK і вже звідти подаються на пристрій на однойменну ніжку. Цим і забезпечується синхронність роботи пристроїв. Частота тактових імпульсів вибирається з найменшої підтримується всіма пристроями, що беруть участь в обміні.

Я говорю у множині, тому що може бути не тільки два пристрої в даному ланцюзі. Як це забезпечується за умови, що пристрої не мають жодних адрес, я зараз і розповім.

Існує кілька способів обіну інформацією між декількома пристроями, тобто коли на один провідний пристрій припадає кілька ведених. Ми розглянемо два найпоширеніші з них.

Перший спосіб – радіальний (натисніть на картинку для збільшення зображення)

Тут майстер направляє дані до певного пристрою, включаючи на ніжці SS логічний 0. При цьому способі можна вибрати тільки один пристрій, також знадобляться кілька вільних ніжок портів контролера.

Є ще один цікавий спосіб - кільцевий або каскадний (натисніть на зображення для збільшення зображення)

Тут ми бачимо, що ніжки вибору всі запаралелені та обмін йде по колу. Тим самим швидкість падає, за рахунок того, що збільшується коло передачі, зате економляться лапки портів.

Все це ми в чергових заняттях вивчимо докладніше, коли використовуватимемо певні пристрої у наших проектах.

Ну, ніби із схемотехнікою передачі даних по шині SPIми розібралися.

Тепер розберемося, як цим процесом управляти лише на рівні апаратних регістрів контролера AVR.

Дані регістри ми бачимо у блок-схемі вище на сторінці.

У Atmega8 існують такі регістри обслуговування шини SPI.

SPDR (SPI Data Register)- Регістр даних, в блок-схемі це DATA BUFFER. У цей регістр ми будемо заносити байт для подальшої передачі на ведений пристрій і з нього ж будемо читати байт інформації, що прийшов з веденого пристрою. Також не обов'язково, що у нас контролер буде провідним пристроєм. Згодом ми зберемо схему із двох контролерів, один із яких буде веденим. Так що саме в цьому регістрі буде байт і для відправки, і для прийому.

SPCR (SPI Control Register)- керуючий регістр

Цей регістр включає наступні біти:

SPIE (SPI Interrupt Enable)- біт, який дозволяє переривання.

SPE (SPI Enable)- біт, що включає шину SPI.

DORD (Data Order)- біт, що встановлює порядок відправлення біт, Якщо він встановлений в 1, то першим відправляється молодший біт, якщо в 0 - старший.

MSTR (Master/Slave Select)- біт, який призначає пристрій провідним або веденим. При встановленні даного біта 1 пристрій буде провідним.

CPOL (Clock Polarity)-полярність синхронізації, визначає, при якому фронті синхронізуючого імпульсу ініціюватиметься режим очікування

Якщо цей біт в 1, то режим очікування буде у нас при висхідному фронті, а якщо в 0, то при низхідному.

CPHA (Clock Phase)— біт, відповідальний за фазу тактування, тобто яким саме фронту здійснюватиметься передача біта.

Подивимося діаграми передачі даних залежно від встановлення CPOL та CPHA

Ось така цікава залежність. Іноді ми іноді бачимо в технічних характеристиках якогось пристрою, що воно, наприклад, може працювати в режимі SPI 0:0 і SPI 1:1, ось це саме стосується налаштування цих бітів.

SPR1, SPR0 (SPI Clock Rate Select)— це біти, відповідальні значення дільника частоти синхронізації, працюють разом із бітом SPI2X, що знаходиться у регістрі статусу. Він також керівник, тому що восьми біт у керуючому регістрі під всі налаштування не вистачило, а в статусному багато вільних.

SPSR (SPI Status Register)- Статусний регістр

SPI2X (Double SPI Speed ​​Bit)- біт, що подвоює швидкість, що працює спільно з бітами SPR1 і SPR0 управляючого регістру.

Подивимося залежність частоти від даних трьох бітів

SPIF (SPI Interrupt Flag)- Прапор переривання. Встановлення цього біта в одиницю ми чекаємо. коли приймаємо байт. Як тільки байт від іншого пристрою з'явиться повністю у нас у буфері, цей прапор встановиться. Цей прапор працює лише у випадку встановлення біта, що дозволяє переривання, а також дозволу глобальних переривань.

WCOL (Write COLlision Flag)— прапор конфлікту, чи колізій, встановиться у разі, якщо під час передачі даних буде конфлікт бітів, якщо під час передачі виконається спроба запису в регістр даних.

Тепер ми, можна сказати, трохи познайомилися з інтерфейсом SPI.

Дивитися відеоурок(натисніть на картинку)

Post Views: 6 294

SPI(Serial Peripheral Bus) - Послідовний периферійний протокол обміну. Цей прокол був розроблений компанією Motorola, але зараз використовується багатьма виробниками. Він призначений для зв'язку мікроконтролерів між собою, а також із всілякою периферією: датчиками, AЦП, мікросхемами пам'яті, годинником. Але все ж таки найчастіше застосування SPI– це запис програми на згадку мікроконтролера. У мікроконтролерах AVRза допомогою SPIможна прошити мікроконтролер не випаюючи з плати, такий спосіб прошивки називається ISP(In System Programming). Хоча назви SPIі ISPдуже співзвучні, це не одне й те саме, AVR SPIвикористовується як фізичний рівень ISP, тобто використовуються лінії SPIдля передачі даних, але сам протокол (програмний рівень) відрізняється.

Для передачі даних у SPI використовується три лінії:

MISO(Master Input Slave Output)- по цій лінії Master(ведучий) приймає дані від Slave(відомого).

MOSI (Master Output Slave Input)– по цій лінії Master надсилає дані Slave.

SCK(Serial Clock)– служить передачі тактового сигналу веденому пристрою.

Також використовується лінія SS(Slave Select)яка визначає пристрій з яким Masterобмінюватиметься даними.

Через те, що багато виробників у своїх пристроях використовують SPI, назви висновків можуть дещо відрізнятися. Нижче наведено таблицю з альтернативними назвами.


SPI буває двох видів апаратний та програмний. При реалізації програмного SPI, ми вручну повинні встановлювати сигнал на ніжках відповідних MISO, MOSI, SSпри цьому смикати за SCK. При апаратній реалізації SPIми передаємо дані в спеціальний регістр, а мікроконтролер сам робить вищеописані маніпуляції, за попередніми налаштуваннями.

Фізична реалізація SPI, являє собою два з'єднані разом зсувні регістри.


Залежно від того, за яким логічним рівнем сигналу SCK, відбувається синхронізація Masterі Slaveі за яким фронтом відбувається захоплення та зсув даних, можливі 4 режими SPI.

  • CPOL = 0 – сигнал синхронізації починається з низького рівня;
  • CPOL = 1 – сигнал синхронізації починається з високого рівня;
  • CPHA = 0 - вибірка даних провадиться по передньому фронту сигналу синхронізації;
  • CPHA = 1 - вибірка даних провадиться по задньому фронту сигналу синхронізації.
На осцилограмах нижче видно як виглядає посилка 0х17 у різних режимах.
CPOL = 0 CPHA = 0


CPOL = 1 CPHA = 0


CPOL = 0 CPHA = 1


CPOL = 1 CPHA = 1

SPI- синхронний інтерфейс, тобто для того, щоб отримати які-небудь дані від Slave, Masterповинен щось відправити. Начебто все зрозуміло, але що якщо Masterвідправляє один байт, а Slaveмає повернути йому два? У такому разі Master повинен відправити йому щось 2 рази, наприклад 0х00.
// Відправляємо команду, у відповідь має прийти два байти Spi_Master_Transmit (chx); // Відправляємо щось для того, щоб прийняти перший байт Spi_Master_Transmit (0X00); touch_x = SPDR; touch_x<<= 8; //отправляем что-нибудь для того чтобы принять второй байт Spi_Master_Transmit(0X00); touch_x |= SPDR; touch_x >>= 3;
На цьому все вище приклад коду взятий з робочого проекту.

Serial Peripheral Interfaceабо SPI- Послідовний периферійний інтерфейс, служить для зв'язку периферії та мікроконтролера. Наприклад, як периферія може бути: дисплей, різні датчики, FLASH пам'ять, SD карта (так, так, SD карта або флешка, яку ви використовуєте в телефонах і фотоапаратах спілкується із зовнішнім світом за допомогою інтерфейсу SPI) і т.д.

На жаль, офіційної документації на інтерфейс SPI немає, тому цей пост грунтується на різних статтях в Інтернеті, власного досвіду та документації на мікроконтролери.

Про те, що таке SPI читайте у статтях вікіпедії

У SPIзавжди є один ведучий і один/кілька провідних.

Передавання даних завжди ініціалізує ведучий.

У SPI використовуються чотири лінії зв'язку:

  • MOSIабо SI- Вихід ведучого, вхід веденого (англ. MasterOutSlaveIn). Служить передачі від провідного пристрою веденому.
  • MISOабо SO- Вхід ведучого, вихід веденого (англ. MasterInSlaveOut). Служить передачі від провідного пристрою.
  • SCLKабо SCK- Послідовний тактовий сигнал (англ. SerialClock). Служить передачі тактового сигналу для ведених пристроїв.
  • CSабо SS- Вибір мікросхеми, вибір веденого (англ. Chip Select, Slave Select).

P.S. Для забезпечення одностороннього зв'язку з одним пристроєм достатньо використовувати SCLK, MOSI(якщо ведений пристрій тільки приймає) або SCLK, MISO(якщо ведений пристрій нічого не приймає, а лише передає інформацію). На вході CSведеного пристрою повинен бути встановлений логічний нуль, інакше ведений не працюватиме.

P.S. Якщо ведене пристрій і передає і приймає, можна обмежитися трьома проводами – MISO, MOSI, SCLK, на вхід CSведеного пристрою також необхідно встановити логічний нуль.

SPIможе бути реалізований у мікроконтролері апаратнотоді завдання з управління інтерфейсом вирішується для кожного мікроконтролера окремо, т.к. Продажі можуть бути різними. Наприклад, для ATmega328Р(Мікроконтролер компанії Atmel) при роботі з SPIнам потрібно самим програмним шляхом встановити на SSлогічний нульпри початку прийому/передачіта встановити логічну одиницюназад при закінчення передачі.

Для передачі даних до веденого пристрою, потрібно в зсувний регістр MASTER-а (на зображення зсувний регістр майстра - « 8 BIT SHIFT REGISTER») записати байт переданої інформації. При цьому автоматично на SCKпочне генеруватися синхросигнал. Це і є апаратна реалізація.

Якщо апаратної підтримки SPI у мікроконтролері немає, то інтерфейс SPI можна завжди реалізувати програмно, тобто. створити програму керуюча ніжками контролера згідно з протоколом обміну SP.

Відмінності у реалізаціях інтерфейсу SPI

Відомі мікросхеми можуть по-різному «інтерпретувати» прийнятий сигнал SPI, відмінність може полягає в наступних моментах:

  • у розмірі передавальних данихабо розмір пакетузазвичай це 8 бітале буває і більше
  • у порядку проходження біт, спочатку старший бітабо спочатку молодший біт
  • по якому рівню синхросигналу передаються дані(з логічної одиниці (HIGH) або логічного нуля (LOW))
  • по якому фронту імпульсу відбувається синхронізація(з підйому або спуску), коротко це називають «фазою синхронізації»

Комбінація « рівня синхронізуючого сигналу» та « фази синхронізації» визначається у специфікаціях як режими роботи SPI. Їх всього 4-те:

Режим Рівень сигналу (CPOL) Фаза (CPHA)
0 0 0
1 0 1
2 1 0
3 1 1

У стовпці « Рівень сигналу» 1-ця, означає, що біт даних, приймаютьсяведеним пристроєм, коли по лінії синхронізації передається нуль, іншими словами - ведений пристрій чекаєі не приймає дані, коли на SCK встановлена ​​логічна 1-ця.

У стовпці « Фаза» 1-ця, означає, що сигнал синхронізації визначається за спадаючому фронту синхроімпульсу, а логічний 0-льпо наростаючому фронту синхроімпульсу.

P.S. Причому якщо в стовпці Рівень сигналу» встановлена 1-ця, то спадаючий і наростаючий фронт, якщо зобразити на діаграмі буде « догори ногами».

На діаграмах, дані 4-е режимиможна зобразити так:

Докладніше про принципи роботи SPI ви можете прочитати у статті

http://www.kit-e.ru/articles/interface/2009_03_53.php

Реалізація SPI на мікроконтролерах ATmega серії AVR (ATmega328P) та «ранніх» МК фірми Motorola

У мікроконтролері ATmega328P(мікроконтролер фірми Atmel серії AVR) можна керувати такими параметрами SPI:

Для налаштування та керуванням SPI інтерфейсом використовують три регістри:

  • Реєстр управління - SPCR
  • Регістр стану - SPSR
  • Регістр даних - SPDR

Докладніше про кожного з них …

Реєстр управління – « SPCR» 0x2C, адреса для запису 0x4C

- Логічна одиниця в 7-му биті(ім'я бита SPIE) – дозволити переривання від SPI(переривання буде в тому випадку якщо встановлено біт глобального дозволу переривань регістру SREG(7-й біт)). Після закінчення передачі байта буде згенеровано переривання.

- Логічна одиниця в 6-му биті(ім'я бита - SPE) - підключити SS, MOSI, MISOі SCKдо портів мікроконтролера ATmega328P PB2, PB3, PB4, PB5.

- Логічна одиниця в 5-му биті(ім'я бита DORD) – визначить, що за SPIспочатку передається молодший розряд, а потім старший– режим LSB. Логічний нуль, навпаки, спочатку передається старший розряд, а далі молодший – режим «MSB».

- Логічна одиниця в 4-му биті(ім'я бита - MSTR) — режим ведучий увімкнути, нуль – увімкнути режим керування

- Логічна одиниця в 3-му биті(ім'я бита CPOL) (полярність сигналу синхронізації або рівень синхронізації) – синхронізаціяведеться по відсутності імпульсу(За логічним нулем) або тактовий сигнал у стані очікування дорівнює 1-ци. Логічний нуль - синхронізація ведеться за присутністю імпульсу (по логічній одиниці) або тактовий сигнал у стані очікування дорівнює 0-лю. За яким фронтом (спад чи підйом) ведеться синхронізація визначається в 2-мубиті ( CPHA).

- Логічна одиниця в 2-му биті(ім'я бита CPHA) (фаза синхронізації) – визначає, що сигнал синхронізації визначається за спадаючим фронтом SCK, а логічний нуль по наростаючому фронту SCK. Причому якщо в CPOL встановлено 1-ця, то спадаючий і наростаючий фронт, якщо зобразити на діаграмі «вгорою».

1-ийі 0-ийбіт спільно з бітом SPI2xу регістрі SPSRвизначають швидкість передачі даних по SPI(або швидкість тактових сигналів по SCK). Дані біти мають сенс лише провідного, веденого вони безглузді, т.к. швидкість прийому залежить від частоти провідного SCK.

Де foscтактова частота генератора SPI, що задає (зазвичай вона дорівнює частоті тактування процесора).

Регістр стану - "SPSR"(Адреса в ATmega328P для читання 0x2D, адреса для запису 0x4Dякщо у вас інший МК, то знайти адреси ви можете в документації)

7-ийбіт регістру SPIF»: SPI Interrupt Flag

У біт встановлюється одиниця, коли передача байтаданих по MOSI закінчено. Якщо встановлено біт дозволу переривання SPI (біт SPIE) у регістрі SPCR, то встановлення прапора SPIF призводить до створення запиту на переривання.

6-ийбіт регістру WCOL»: Write COLlision Flag

Біт конфлікту записуу регістр SPDR. У біт встановлюється одиниця, якщо в час передачіданих виконується спроба запису врегістр даних SPDR.

- з 5-огопо 1-ийбіт – зарезервовані біти, їхнє значення завжди дорівнює 0-лю

0-ийбіт « SPI2X»: Double SPI Speed ​​Bit

Біт « подвійна швидкість передачі даних». Якщо в біт записано одиниця, то швидкістьпередачі даних подвоєна. За допомогою поєднання даного біта та першогоі 0-огобіта ( SPR1, SPR0) регістру SPCR, Визначають швидкість передачіданих з SPI. .

Регістр даних - "SPDR"(Адреса в ATmega328P для читання 0x2E, адреса для запису 0x4Eякщо у вас інший МК, то знайти адреси ви можете в документації)

Розмір регістру, як і вище вказаних. 8 біт. Даний регістр використовується для передачі та читання даних з SPI. Поміщаючи дані до нього, ви запускаєте процес передачі.

Розглянемо 3 приклади роботи з інтерфейсом SPI на ATmega328P в середовищах:

- Arduino

#include byte x = B11000000; //Передається біт byte y = B00000000; //в змінну y буде записуватися приймаючий біт void setup() ( SPI.begin(); /* ініціалізація SPI */ /* ініціалізація в Arduino це означає - встановити одиницю в SS - налаштувати на вихід SS (Slave Select або вибір веденого) - 10 пін - встановити 1-цу в наступних бітах регістра управління SPCR: в 4-ий біт (ім'я біта - MSTR) - режим ведучий включити в 6-й біт (ім'я біта - SPE) - підключити SS, MOSI, MISO і SCK до портів PB4,PB5,PB6,PB7 (10,11,12,13 пін в ардуїно) - налаштувати наступні піни на вихід: SCK (Serial Clock або тактовий сигнал) - 13 пін MOSI (Master Out Slave In або дані від ведучого) - 11 пін У результаті ініцілізації через SPI.begin() конфігурація інтерфейсу SPI у нас виходить наступна: - черговість бітів "MSB", тобто спочатку передається старший розряд, а далі молодший - синхронізація ведеться за присутністю імпульсу або тактовий сигнал у стані очікування дорівнює 0-лю - сигнал синхронізації визначається по наростаючому фронту SCK (два пункти вище вказують, що режим SPI в даному випадку - 0) - швидкість передачі fosc/4 */ // МИ МОЖЕМО ДОІНІЦИЛІЗУВАТИ ДЕЯКІ ПАРАМЕТРИ ЗВ'ЯЗКУ по SPI самі прямування біт //SPI.setBitOrder(MSBFIRST); /* LSBFIRST - спочатку молодший, далі старший MSBFIRST - спочатку старший, далі молодший (коштує за замовчуванням від SPI.begin) */ // частота обміну даними //SPI.setClockDivider(SPI_CLOCK_DIV4); /* визначається як відношення fosc до коефіцієнта, можливі значення якого: /* SPI_MODE0 - нульовий режим SPI_MODE1 - перший режим SPI_MODE2 - другий режим SPI_MODE3 - третій режим */ ) void loop() ( /* РЕАЛІЗАЦІЯ ПЕРЕДАЧІ ДАНИХ ПО SPI */ digitalWrite(10, HIGH); /* від нас потрібно, в SS 1-цу */ y=SPI.transfer(x); ) формується тактовий сигнал */ digitalWrite(10, LOW);/* від нас вимагається, самому встановити в SS 0-ль */ SPI.end(); /* Тобто встановлює 0-оль у 6-й біт (SPE) регістру SPCR */ )

#include

byte x = B11000000; //Передається біт

byte y = B00000000; //в змінну y записуватиметься приймаючий біт

void setup () (

SPI. begin(); /* ініціалізація SPI */

/* ініціалізація в Arduino це означає

Встановити одиницю в SS

Налаштувати на вихід SS (Slave Select або вибір веденого) - 10 пін

Встановити 1-цю в наступних бітах регістра управління SPCR:

У четвертий біт (ім'я біта - MSTR) - режим ведучий включити

У 6-й біт (ім'я біта - SPE) - підключити

SS, MOSI, MISO та SCK

До портів PB4, PB5, PB6, PB7

(10,11,12,13 пін в ардуїно)

Налаштувати наступні піни на вихід:

SCK (Serial Clock або тактовий сигнал) – 13 пін

MOSI (Master Out Slave In або дані від ведучого) - 11 пін

У результаті ініцілізації через SPI.begin()

Конфігурація інтерфейсу SPI у нас виходить така:

Черговість бітів " MSB " , тобто. спочатку передається старший розряд, а далі молодший

Синхронізація ведеться за присутністю імпульсу

Або тактовий сигнал у стані очікування дорівнює 0-лю

Сигнал синхронізації визначається за наростаючим фронтом SCK

(Два пункти вище вказують, що режим SPI в даному випадку - 0)

Швидкість передачі fosc/4

// МИ МОЖЕМО ДОІНІЦИЛІЗУВАТИ ДЕЯКІ ПАРАМЕТРИ ЗВ'ЯЗКУ по SPI самі

// порядок прямування біт

//SPI.setBitOrder(MSBFIRST);

// Частота обміну даними

//SPI.setClockDivider(SPI_CLOCK_DIV4);

/* визначається як відношення

Fosc до коефіцієнта, можливі значення якого:

SPI_CLOCK_DIV2

SPI_CLOCK_DIV4

SPI_CLOCK_DIV8

SPI_CLOCK_DIV16

SPI_CLOCK_DIV32

SPI_CLOCK_DIV64

SPI_CLOCK_DIV128

//Режим роботи SPI

//SPI.setDataMode(SPI_MODE0);

SPI_MODE0 - нульовий режим

SPI_MODE1 - перший режим

SPI_MODE2 - другий режим

SPI_MODE3 - третій режим

void loop ()

/* РЕАЛІЗАЦІЯ ПЕРЕДАЧІ ДАНИХ ЗА SPI */

digitalWrite (10, HIGH); /* від нас вимагається, самому встановити в SS 1-цу */

y = SPI. transfer (x); /* передача по бітно аргументу (байта) і прийом відповіді від веденого уст-ва

Передача здійснюється наданням регістру SPDR значення байта

Причому в цей час автоматично на SCK (13 пін)

Формується тактовий сигнал */

digitalWrite (10, LOW); /* від нас потрібно, самому встановити в SS 0-ль */

SPI. end (); /* відключає шину SPI від 10,11,12,13 пінів */

/ * Тобто. встановлює 0-оль у 6-й біт (SPE) регістру SPCR */

- Atmel Studio (AVR GCC)

#include #include void init_spi() ( DDRB=(1<

#include

#include

void init_spi() (

DDRB = (1<< PB0 ) | (1 << PB1 ) | (1 << PB2 ) | (0 << PB3 ) ;

//Конфігуруємо висновки для SPI (SS, SCK, MOSI - вихід, MOSI вхід)

// SPI initialization

// SPI Type: Master

// SPI Clock Rate: 2000,000 kHz

// SPI Clock Phase: Cycle Start

// SPI Clock Polarity: Low

// SPI Data Order: MSB First

SPCR = (0<< SPIE ) | (1 << SPE ) | (0 << DORD ) | (1 << MSTR ) | (0 << CPOL ) | (0 << CPHA ) | (1 << SPR1 ) | (1 << SPR0 ) ;

Інтерфейси передачі.

Для передачі з одного пристрою в інший чи з однієї мікросхеми в іншу розроблено безліч інтерфейсів передачі. Кожен інтерфейс має як позитивні, і негативні боку, тому необхідно знати які інтерфейси бувають, їх плюси і мінуси і використовувати правильний інтерфейс передачі даних у тій чи іншій ситуації.

Інтерфейси бувають з асинхронною та синхронною передачею даних. При синхронній передачі даних одночасно з даними передається синхросигнал, що дозволяє синхронізуватися приймачеві і передавачу. Приклад такого протоколу служить інтерфейс SPI.

В асинхронній передачі даних синхронізуючий сигнал відсутній. У таких лініях існує небезпека неузгодженості приймача та передавача, внаслідок чого подальші дані будуть прийняті неправильно. Для запобігання цьому в асинхронних інтерфейсах проводиться періодична синхронізація ліній передачі даних. Плюсом таких інтерфейсів є менше провідників, потрібне для передачі.

Розглянемо кілька найпопулярніших інтерфейсів ближче.

Інтерфейс USART.

Інтерфейс USART - послідовний універсальний синхронно-асинхронний приймач-передавач. Передача даних USART здійснюється через рівні проміжки часу. Цей часовий проміжок визначається заданою швидкістю USART і вказується в бодах (Для символів, які можуть приймати значення, що дорівнює лише нулю або одиниці бод еквівалентний бітам в секунду). Існує загальноприйнятий ряд стандартних швидкостей: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 9216

Крім біт даних USART автоматично вставляє в потік мітки, що синхронізують, так звані стартовий і стоповий біти. При прийомі ці зайві біти видаляються. Зазвичай стартовий та стоповий біти відокремлюють один байт інформації (8 біт), проте зустрічаються реалізації USART, які дозволяють передавати по 5, 6, 7, 8 або 9 біт. Біти, відокремлені стартовим та стоповим сигналами, є мінімальною посилкою. USART дозволяє вставляти два стопові біти при передачі для зменшення ймовірності розсинхронізації приймача та передавача при щільному трафіку. Приймач ігнорує другий стоповий біт, сприймаючи його як коротку паузу лінії.

Ухвалено угоду, що пасивним (без даних) станом входу і виходу USART є логічна «1». Стартовий біт завжди логічний "0", тому приймач USART чекає перепаду з "1" в "0" і відраховує від нього часовий проміжок в половину тривалості біта (середина передачі стартового біта). Якщо в цей момент на вході все ще "0", то запускається процес прийому мінімальної посилки. Для цього приймач відраховує 9 бітових тривалостей поспіль (для 8-біт даних) і кожен момент фіксує стан входу. Перші 8 значень є прийнятими даними, останнє перевірочне значення (стоп-біт). Значення стоп-біта завжди «1», якщо реально прийняте інше значення, USART фіксує помилку.

Для формування часових інтервалів передавальний та приймальний USART мають джерело точного часу (тактування). Точність цього джерела має бути такою, щоб сума похибок (приймача та передавача) встановлення часового інтервалу від початку стартового імпульсу до середини стопового імпульсу не перевищувала половини (а краще хоча б чверті) бітового інтервалу. Для 8-біт посилки 0,5/9,5 = 5 % (насправді трохи більше 3 %). Оскільки ця сума помилок приймача і передавача плюс можливі спотворення сигналу в лінії, то допуск на точність тактування USART, що рекомендується, не більше 1,5 %.

Оскільки синхронізуючі біти займають частину бітового потоку, то результуюча пропускна здатність UART не дорівнює швидкості з'єднання. Наприклад, для 8-бітних посилок формату 8-N-1 синхронізуючі біти займають 20% потоку, що для фізичної швидкості 115200 бод дає бітову швидкість даних 92160 біт/с або 11520 байт/с.

Контроль парності

У протоколі USART мають можливість автоматично контролювати цілісність даних шляхом контролю бітової парності. Коли ця функція включена, останній біт даних («біт парності») завжди набуває значення 1 або 0, так щоб кількість одиниць у байті завжди була парною.

Управління потоком

У старі часи пристрої з USART могли бути настільки повільними, що не встигали обробляти потік даних, що приймаються. Для вирішення цієї проблеми модулі USART забезпечувалися окремими виходами та входами управління потоком. При заповненні вхідного буфера логіка приймаючого USART виставляла на відповідному виході забороняючий рівень, і USART, що передає, припиняв передачу. Пізніше керування потоком поклали на комунікаційні протоколи, і потреба в окремих лініях керування потоком поступово зникла.

Фізична реалізація.

USART це протокол обміну, тобто. він визначає спосіб формування біта, параметри передачі байта, швидкість передачі та інше.

А ось фізична реалізація USART-a може бути різна. Наприклад, передачі даних всередині однієї плати сигнали передаються рівнями +5В і 0В. Для передачі даних на довгі відстані та між пристроями застосовуються інші фізичні рівні напруги та стандарти такі як: струмова петля (4-20 мА), RS-232 (COM-порт), RS-485 тощо.

Для перетворення «контролерних» рівнів 0-5В на «стандартні» існує безліч спеціалізованих мікросхем, наприклад ADM202 для RS-232.

Послідовний інтерфейс SPI

Найменування SPI є абревіатурою від "Serial Peripheral Bus", що відображає його призначення – шина для підключення зовнішніх пристроїв. Шина SPI організована за принципом "провідний-підлеглий". Як провідний шини зазвичай виступає мікроконтролер, але їм також може бути програмована логіка, DSP-контролер або спеціалізована ІС. Пристрої, підключені до провідного, є веденими. У тому ролі виступають різноманітних мікросхеми, зокрема. запам'ятовуючі пристрої (EEPROM, Flash-пам'ять, SRAM), годинник реального часу (RTC), АЦП/ЦАП, цифрові потенціометри, спеціалізовані контролери та ін.

Головним складовим блоком інтерфейсу SPI є звичайний зсувний регістр, сигнали синхронізації та введення/виводу бітового потоку якого утворюють інтерфейсні сигнали. Таким чином, протокол SPI правильніше назвати не протоколом передачі даних, а протоколом обміну даними між двома зсувними регістрами, кожен з яких одночасно виконує функцію приймача, і функцію передавача. Обов'язковою умовою передачі по шині SPI є генерація сигналу синхронізації шини. Цей сигнал має право генерувати лише ведучий і від нього залежить робота підлеглого.

Підключення.

Існує три типи підключення до шини SPI, у кожному з яких беруть участь чотири сигнали. Призначення сигналів SPI описано у таблиці 7.1.

Найпростіше підключення, у якому беруть участь лише дві мікросхеми, показано малюнку 7.2. Тут, провідний шини передає дані по лінії MOSI синхронно зі згенерованим ним сигналом SCLK, а підлеглий захоплює передані біти даних по певних напрямках прийнятого сигналу синхронізації. Одночасно з цим підлеглий надсилає свою посилку даних. Подану схему можна спростити виключенням лінії MISO, якщо підпорядкована ІС, що використовується, не передбачає відповідну передачу даних або в ній немає потреби. Односторонню передачу даних можна зустріти у таких мікросхем як ЦАП, цифрові потенціометри, підсилювачі, що програмуються, і драйвери. Таким чином, варіант підключення підлеглої ІС вимагає 3 або 4 лінії зв'язку.

Щоб підпорядкована ІС приймала та передавала дані, крім наявності сигналу синхронізації, необхідно також, щоб лінія SS була переведена в низький стан. В іншому випадку підпорядкована ІС буде неактивна. Коли використовується лише одна зовнішня ІВ, може виникнути спокуса виключення та лінії SS за рахунок жорсткої установки низького рівня на вході вибору підлеглої мікросхеми. Таке рішення вкрай небажано може призвести до збоїв чи взагалі неможливості передачі, т.к. вхід вибору мікросхеми служить для перекладу ІС у її вихідний стан та іноді ініціює виведення першого біта даних.

За необхідності підключення до шини SPI кількох мікросхем використовується або незалежне (паралельне) підключення (рис. 7.3) або каскадне (послідовне) (рис. 7.4). Незалежне підключення найпоширеніше, т.к. досягається при використанні будь-яких SPI-сумісних мікросхем. Тут, всі сигнали, крім вибору мікросхем, з'єднані паралельно, а провідний шини, перекладом того чи іншого сигналу SS в низький стан, задає, з якою підпорядкованою ІВ він обмінюватиметься даними. Головним недоліком такого підключення є необхідність у додаткових лініях для адресації підлеглих мікросхем (загальна кількість ліній зв'язку дорівнює 3+n, де n-кількість підлеглих мікросхем).

У разі нестачі ніжок мікроконтролера можна використовувати мікросхему демультиплексора. Демультиплексор підключає єдиний вхідний сигнал одного з вихідних сигналів, залежно від коду на керуючих ніжках. На рис 7.4 представлено схему підключення демультиплексора. На його вхід подається сигнал SS, який приймає значення 0, якщо необхідно вибрати одну з мікросхем. Номер потрібної мікросхеми у двійковому коді подається на ніжки Am-A0. Це дозволяє зменшити кількість використовуваних мікроконтролерів ніжок до m=log 2 n. Де n – кількість підлеглих мікросхем. Тобто. для підключення 128 пристроїв потрібно 8 висновків мікроконтролера. Один для встановлення дозвільного сигналу і 7 для встановлення номера мікросхеми, що включається. Слід зазначити, що у непідключених ніжках демультиплексора має бути логічна одиниця. В іншому випадку використовується інвертер сигналу, що перетворює логічний нуль на логічну одиницю.

Каскадне включення позбавлене цього недоліку, т.к. тут із кількох мікросхем утворюється один великий зсувний регістр. Для цього вихід передачі однієї ІС з'єднується з входом прийому даних інший, як показано на малюнку 3. Входи вибору мікросхем тут з'єднані паралельно і, таким чином, загальна кількість ліній зв'язку збережено рівним 4. Однак використання каскадного підключення можливе тільки в тому випадку, якщо його підтримка вказана в документації на мікросхеми, що використовуються. Щоб з'ясувати це важливо знати, що таке підключення по-англійськи називається "daisy-chaining".

Протокол передачі

Протокол передачі за інтерфейсом SPI по суті ідентичний логіці роботи зсувного регістру (рис 7.6), яка полягає у виконанні операції зсуву і, відповідно, побитого введення та виведення даних за певними напрямками сигналу синхронізації. Установка даних під час передачі і вибірка прийому завжди виконуються по протилежним напрямам синхронізації. Це необхідно для гарантування вибірки даних після надійного встановлення. Якщо до цього врахувати, що в якості першого фронту в циклі передачі може виступати фронт, що наростає або падає, то всього можливо чотири варіанти логіки роботи інтерфейсу SPI. Ці варіанти отримали назву режимів SPI та описуються двома параметрами:

· CPOL - вихідний рівень сигналу синхронізації (якщо CPOL=0, то лінія синхронізації до початку циклу передачі і після його закінчення має низький рівень (тобто перший фронт наростаючий, а останній - падаючий), інакше, якщо CPOL=1, - високий (тобто перший фронт, що падає, а останній - наростаючий);

· CPHA – фаза синхронізації; від цього параметра залежить, у якій послідовності виконується встановлення та вибірка даних. Якщо CPHA=0, то на передньому фронті в циклі синхронізації буде виконуватися вибірка даних, а потім, на задньому фронті, - установка даних. Якщо ж CPHA=1, то установка даних виконуватиметься по передньому фронту циклі синхронізації, а вибірка - по задньому.

Інформація про режими SPI представлена ​​на рис 7.7 і 7.8.

Провідна та підлегла мікросхеми, що працюють у різних режимах SPI, є несумісними, тому перед вибором підлеглих мікросхем важливо уточнити, які режими підтримуються провідним шини. Апаратні модулі SPI, інтегровані в мікроконтролери, в більшості випадків підтримують можливість вибору будь-якого режиму і тому до них можливе підключення будь-яких підлеглих SPI-мікросхем (належить тільки до незалежного варіанту підключення). Крім того, протокол SPI у будь-якому з режимів легко реалізується програмно.

Інтерфейс RS-485

Інтерфейс RS-485 (інша назва - EIA/TIA-485) - один із найпоширеніших стандартів фізичного рівня зв'язку. Фізичний рівень - це канал зв'язку та спосіб передачі сигналу (1 рівень моделі взаємозв'язку відкритих систем OSI).

Мережа, побудована на інтерфейсі RS-485, є приймачами, з'єднаними за допомогою крученої пари - двох скручених проводів. В основі інтерфейсу RS-485 є принцип диференціальної (балансної) передачі даних. Суть його полягає у передачі одного сигналу по двох дротах. Причому з одного дроту (умовно A) йде оригінальний сигнал, а з іншого (умовно B) - його інверсна копія. Інакше кажучи, якщо одному проводі " 1 " , то іншому " 0 " і навпаки. Таким чином, між двома проводами крученої пари завжди є різниця потенціалів: при "1" вона позитивна, при "0" - негативна (рис 7.9).

Саме цією різницею потенціалів і передається сигнал. Такий спосіб передачі забезпечує високу стійкість до синфазної перешкоди. Синфазною називають перешкоду, що діє на обидва дроти лінії однаково. Наприклад, електромагнітна хвиля, проходячи через ділянку лінії зв'язку, наводить в обох проводах потенціал. Якщо сигнал передається потенціалом в одному дроті відносно загального, як в RS-232, то наведення на цей провід може спотворити сигнал відносно загального, що добре поглинає наведення ("землі"). Крім того, на опорі довгого загального дроту падатиме різниця потенціалів земель - додаткове джерело спотворень. А при диференціальній передачі спотворення не відбувається. Справді, якщо два дроти пролягають близько один до одного, та ще перевиті, то наведення на обидва дроти однакове. Потенціал в обох однаково навантажених проводах змінюється однаково, інформаційна різниця потенціалів залишається без змін.

Апаратна реалізація інтерфейсу RS485

Апаратна реалізація інтерфейсу - мікросхеми приймачів з диференціальними входами/виходами (до лінії) та цифровими портами (до портів UART контролера). Існують два варіанти такого інтерфейсу: RS-422 та RS-485.

RS-422 – повнодуплексний інтерфейс. Прийом та передача йдуть по двох окремих парах проводів. На кожній парі проводів може бути лише по одному передавачу.

RS-485 – напівдуплексний інтерфейс. Прийом та передача йдуть по одній парі проводів із поділом за часом. У мережі може бути багато передавачів, оскільки вони можуть вимикатися в режимі прийому (рис. 7.10).

Розшифрування позначень на рис 7.10

D (driver) – передавач;
R (receiver) – приймач;
DI (driver input) – цифровий вхід передавача;
RO (receiver output) – цифровий вихід приймача;
DE (driver enable) – дозвіл роботи передавача;
RE (receiver enable) – дозвіл роботи приймача;
A – прямий диференціальний вхід/вихід;
B – інверсний диференціальний вхід/вихід;
Y – прямий диференціальний вихід (RS-422);
Z – інверсний диференціальний вихід (RS-422).

Детальніше зупинимося на приймачі RS-485. Цифровий вихід приймача (RO) підключається до порту приймача UART (RX). Цифровий вхід передавача (DI) до порту передавача UART (TX). Оскільки на диференціальній стороні приймач і передавач з'єднані, під час прийому потрібно відключати передавач, а під час передачі - приймач. Для цього служать керуючі входи - дозвіл приймача (RE) та дозволу передавача (DE). Так як вхід RE інверсний, його можна з'єднати з DE і перемикати приймач і передавач одним сигналом з будь-якого порту контролера. При рівні "0" - робота приймання, при "1" - передачу (рис 7.11).

Приймач, отримуючи на диференціальних входах (AB), різниця потенціалів (UAB) переводить їх у цифровий сигнал на виході RO. Чутливість приймача може бути різною, але гарантований пороговий діапазон розпізнавання сигналу виробники мікросхем приймачів пишуть у документації. Зазвичай пороги становлять ± 200 мВ. Тобто, коли UAB > +200 мВ – приймач визначає "1", коли UAB< -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

Всі пристрої підключаються до однієї кручений пари однаково: прямі виходи (A) до одного дроту, інверсні (B) - до іншого.

Вхідний опір приймача з боку лінії (RAB) зазвичай становить 12 КОМ. Так як потужність передавача не безмежна, це створює обмеження кількості приймачів, підключених до лінії. Відповідно до специфікації RS-485 з урахуванням резисторів, що узгоджують, передавач може вести до 32 приймачів. Однак є ряд мікросхем із підвищеним вхідним опором, що дозволяє підключити до лінії значно більше 32 пристроїв.

Максимальна швидкість зв'язку специфікації RS-485 може досягати 10Мбод/сек. Максимальна відстань – 1200 метрів. Якщо необхідно організувати зв'язок на відстані більше 1200 метрів або підключити більше пристроїв, ніж допускає здатність навантаження передавача - застосовують спеціальні повторювачі (репітери).

Інтерфейс I2C.

Цей інтерфейс було запропоновано фірмою Philips, яка застосувала його для організації зв'язку між мікросхемами у телевізорах. I 2 C (абревіатура слів Inter-Integrated Circuit) є двонаправленою асинхронною шиною з послідовною передачею даних. Фізично шина I 2 C є дві сигнальні лінії, одна з яких (SCL) призначена для передачі тактового сигналу, а друга (SDA) для обміну даними. Для керування лініями застосовуються вихідні каскади з відкритим колектором, тому лінії шини повинні бути підтягнуті до джерела живлення +5 через резистори опором 1...10 кОм, в залежності від фізичної довжини ліній і швидкості передачі даних. Довжина з'єднувальних ліній у стандартному режимі може досягати 2 метрів, швидкість передачі даних – 100 кбіт/с.

Всі абоненти шини діляться на два класи – «Ведучий» та «Ведомий». Провідний пристрій створює тактовий сигнал (SCL). Воно може самостійно виходити на шину і адресувати будь-який ведений пристрій для передачі або прийому інформації. Всі ведені пристрої "слухають" шину на предмет виявлення власної адреси і, розпізнавши його, виконують операцію, що пропонується. Крім того, можливий так званий "MultiMaster"-режим, коли на шині встановлено кілька провідних пристроїв, які або спільно поділяють загальні ведені пристрої, або поперемінно є провідними, коли самі ініціюють обмін інформацією, то веденими, коли знаходяться в режимі очікування звернення від іншого провідного пристрою. Режим "MultiMaster" вимагає постійного стеження та розпізнавання конфліктів. У зв'язку з цим, даний режим складніше у реалізації (мається на увазі програмна реалізація) і, як наслідок, рідше використовується у реальних виробах.

У початковий момент часу – в режимі очікування – обидві лінії SCL та SDA перебувають у стані логічної одиниці (транзистор вихідного каскаду з відкритим колектором закритий). У режимі передачі (рис 7.12) біт даних SDA тактується висхідним фронтом SCL. Зміна інформації лінії SDA проводиться при нульовому стані лінії SCL. Веде пристрій може "притримувати" лінію SCL в нульовому стані, наприклад, на час обробки чергового прийнятого байта, при цьому провідний пристрій повинен дочекатися звільнення лінії SCL, перш ніж продовжувати передачу інформації.

Для синхронізації пакетів шини I 2 C розрізняють дві умови - "START" і "STOP", що обмежують початок та кінець інформаційного пакета (рис. 7.13). Для кодування цих умов використовується зміна стану лінії SDA за одиничного стану лінії SCL, що неприпустимо при передачі даних. "START"-умова утворюється з появою низхідного фронту лінії SDA, коли лінія SCL перебуває у одиничному стані, і навпаки, "STOP"-умова утворюється з появою висхідного фронту лінії SDA при одиничному стані лінії SCL.

Передача даних починається по першому висхідному фронту лінії SCL, яким тактується старший біт першого інформаційного байта. Кожен інформаційний байт (8 біт) містить 9 тактових періодів лінії SCL. У дев'ятому такті пристрій-одержувач видає підтвердження (ACK) - низхідний фронт, що свідчить про прийом даних. Слід зазначити, що будь-який абонент шини, як ведучий, так і ведений може в різні моменти часу бути як передавачем, так і одержувачем і відповідно до режиму зобов'язаний приймати або видавати сигнал ACK, відсутність якого інтерпретується як помилка.

Щоб розпочати операцію обміну даними, провідний пристрій видає на шину "START"-умову. За "START"-умовою слідує байт з адресою веденого пристрою (рис 7.14), що складається з семибітової адреси пристрою (біти 1...7) та однобітового прапора операції читання-запису - "R/W" (біт 0). Біт R/W визначає напрямок обміну, причому 0 означає передачу даних від ведучого до веденого (рис 7.14а), а 1 - читання з веденого (рис 7.14б). Всі біти по шині I 2 C передаються в порядку від старшого до молодшого, тобто першим передається 7-й біт, останнім 0-й. За адресою можуть йти один або більше інформаційних байтів (у напрямку, визначеному прапором R/W), біти яких тактуються провідним пристроєм по шині SCL.

При здійсненні операції читання провідний пристрій повинен супроводжувати прочитаний байт сигналом ACK, якщо необхідно прочитати наступний байт, і не видавати сигнал ACK, якщо збирається закінчити читання пакета (див. рис. 7.14б).

Допускається багаторазове відновлення адреси веденого пристрою в одному циклі передачі, тобто передача повторної "START"-умови без попередньої "STOP"-умови (рисунок 7.14в).

Необхідно відзначити деякі особливості мікросхем пам'яті, що працюють за інтерфейсом I 2 C, та процедур обміну даними з ними. По-перше, енергонезалежна пам'ять даних цих мікросхем розбита на сторінки пам'яті, тому при записі байта спочатку відбувається копіювання всієї сторінки у внутрішню оперативну пам'ять мікросхеми, де відбувається зміна потрібної комірки. Після цього проводиться стирання старої сторінки і запис на її місце нової. Ще однією особливістю є те, що старші чотири біти адреси веденого пристрою завжди повинні дорівнювати 1010. Ця вимога регламентована самою фірмою Philips.

Шина 1-Wire використовує лише один провідник для зв'язку та живлення. Режим зв'язку - асинхронний і напівдуплексний, який суворо дотримується схеми ведучий-підлеглий. До однієї і тієї ж шині можуть бути одночасно підключені один або кілька підлеглих пристроїв. До однієї шини може бути підключений лише один провідний пристрій.

Незайнятому стану шини відповідає високий рівень, який формується резистором, що підтягує. Номінал резистора, що підтягує, наводиться в документації на підлеглу ІМС. Усі мікросхеми, підключені до шини, мають бути здатними створювати низький рівень. Якщо вихід мікроконтролера не підтримує три стани, необхідно передбачити драйвер, у якого вихід з відкритим колектором або відкритим стоком

Передача сигналів по шині 1-Wire поділена на тимчасові слоти тривалістю 60 мкс. Одним тимчасовим слотом передається лише один біт даних. Підлеглим пристроям допускається суттєві відмінності від номінальних витримок часу. Однак це вимагає точнішого відліку часу провідним, щоб гарантувати коректність зв'язку з підлеглими, у яких різняться тимчасові базиси.

Основні сигнали шини.

Ведучий ініціює кожен зв'язок на бітному рівні. Це означає, що передача кожного біта, незалежно від напрямку, має бути ініційована провідним. Це досягається установкою низького рівня на шині, який синхронізує логіку решти всіх пристроїв. Існує 5 основних команд для зв'язку по шині 1-Wire: “Запис лог. 1", "Запис лог. 0”, “Читання”, “Скидання” та “Присутність”.

Сигнал “Запис лог. 1”

Сигнал “Запис лог. 1” показано на рис. 7.15. Ведучий встановлює низький рівень протягом 1…15 мкс. Після цього, протягом частини тимчасового слота, що залишилася, він звільняє шину.

Мал. 7.15 - Сигнал «Запис лог. 1»

Сигнал “Запис лог. 0”

Сигнал “Запис лог. 0” показано на рис 7.16. Ведучий формує низький рівень протягом щонайменше 60 мкс, але з довше 120 мкс.

Рис 7.16 - Сигнал «Запис лог. 0»

Сигнал "Читання"

Сигнал “Читання” показано на рис. 7.17. Ведучий встановлює низький рівень протягом 1…15 мкс. Після цього підлеглий утримує шину в низькому стані, якщо хоче передати балку. 0. Якщо потрібно передати балку. 1, він просто звільняє лінію. Сканування шини необхідно виконувати через 15 мкс після встановлення низького рівня на шині. Якщо дивитися з боку ведучого, сигнал "Читання" є, по суті, сигналом "Запис бал. 1». Власне внутрішній стан підлеглого визначатиме сигнал «Запис лог. 1» чи «Читання».

Рис 7.17 – Сигнал «Читання»

Сигнал “Скидання/присутність”

Сигнали "Скидання" та "Присутність" показані на рис 7.18. Зверніть увагу, що часові інтервали імпульсів відрізняються. Ведучий встановлює низький рівень протягом 8 тимчасових слотів (480 мкс), а потім звільняє шину. Цей тривалий період низького стану називається сигнал «Скидання».

Якщо на шині присутній підлеглий, він повинен протягом 60 мкс після звільнення провідним шини встановити низький рівень тривалістю щонайменше 60 мкс. Цей відгук має назву «Присутність». Якщо такий сигнал не виявляється, то ведучий повинен вважати, що немає підключених пристроїв до шини і подальший зв'язок неможливий.

USB (Universal serial bus) розроблявся для оперативного підключення зовнішніх пристроїв до персонального комп'ютера з подальшим знаходженням та встановленням потрібного програмного забезпечення. Живлення малопотужних пристроїв здійснюється безпосередньо через інтерфейс.

Стандарт USB має на увазі наявність лише одного провідного (Host) пристрою. При цьому стандарт підтримує до 127 провідних пристроїв у мережі. Для розрізнення провідних і ведених пристроїв розробили різні види роз'ємів (рис 7.19): Тип А – провідного і Тип У веденого. Прийнято, що напруга 5В є тільки на роз'ємі типу А, що є провідним. Інші ж пристрої живляться безпосередньо від нього.

У стандарті USB використовується 4 екрановані дроти, з яких два передають живлення (+5v & GND) (рис 7.19 та таблиця 7.2). Інші два представляють кручену пару (twisted pair) диференціальних сигналів даних. Використовується схема кодування NRZI(Non Return to Zero Invert, без повернення до нуля з інверсією) для передачі даних із полем синхронізації для синхронізації тактів ведучого та ведених пристроїв.

У стандарті USB 2.0 з'явився стандарт On-The-Go (OTG), у якому запроваджено протокол Host Negotiation Protocol, що дозволяє двом пристроям USB домовитися, хто виконуватиме роль ведучого. Це призначено та обмежено одиночними підключеннями точка-точка, наприклад, мобільний телефон – персональний комп'ютер.

USB підтримує «гаряче» (plug’n’play) з'єднання з драйверами, що динамічно завантажуються і вивантажуються. Користувач просто встромляє пристрій, підключаючи його тим самим до шини. Хост детектує приєднання, опитує новий пристрій і завантажує відповідний драйвер, індикуючи пісочним годинником на екрані момент завантаження (якщо драйвер для пристрою USB вже встановлений в системі). Кінцевий користувач не піклується про термінування, про IRQ(переривання) та адреси портів, ні про перезавантаження комп'ютера (перезавантаження не потрібно). Коли користувач закінчив роботу з USB-пристроєм, він виймає його (або від'єднує кабель), хост виявить відсутність пристрою і автоматично вивантажить драйвер.

SB версії 1.1 підтримує дві швидкості – режим full speed зі швидкістю 12 Mbits/s та режим low speed зі швидкістю 1.5 Mbits/s. Режим 1.5 Mbits/s повільніший і менш чутливий до EMI (перешкод), ніж зменшує вартість феритових кілець і знижує вимоги до якості компонентів.

Кабель для підтримки повної швидкості шини (full-speed) виконується як кручена пара, захищається екраном і може використовуватися для роботи в режимі мінімальної швидкості (low-speed). Кабель для роботи лише на мінімальній швидкості (наприклад, для підключення миші) може бути будь-яким та неекранованим.

У стандарті USB 2.0 вводиться режим High Speed ​​зі швидкістю передачі 480Mbits/s.

Передача даних.

Усі передачі за інтерфейсом ініціюються хостом. Дані передаються як пакетів. В інтерфейсі USB використовується кілька різновидів пакетів:

А) пакет-ознака (token paket) описує тип і напрямок передачі даних, адресу пристрою і порядковий номер кінцевої точки (КТ - частина USB-пристрою, що адресується); пакет-ознаки бувають кількох типів: IN, OUT, SOF, SETUP;

Б) пакет із даними (data packet) містить дані, що передаються;

В) пакет погодження (handshake packet) призначений для повідомлення про результати пересилання даних; пакети узгодження бувають кількох типів: ACK, NAK, STALL.

Передача даних по USB здійснюється наступним чином:

Перший пакет, так званий token, генерується провідним пристроєм для опису типу даних, що передаються, операції передачі (читання або запис), адреса пристрою і кінцевої точки (endpoint). Наступним зазвичай передається пакет даних, що несе корисну інформацію, за яким йде пакет узгодження (handshaking packet), що повідомляє про те, що дані або token були прийняті успішно, або кінцева точка (endpoint) зупинена (stalled) або недоступна для прийняття даних.

Кінцевими точками у стандарті USB називаються джерела та приймачі даних. Всі пристрої повинні підтримувати кінцеву точку 0. Це кінцева точка, яка приймає всі керуючі запити та запити статусу під час енумерації (запит дескриптора для визначення типу підключеного пристрою) та протягом усього часу, коли пристрій залишається працездатним на шині.

Кінцеві точки з номерами від 1 використовуються для передачі інформації користувача. Розглянемо кілька прикладів.

Драйвер пристрою передає кінцеву точку ЕР1 провідного пристрою. Т.к. цей пристрій є провідним, то дані потрапляють в OUT буфер ЕР1. При цьому посилається токен OUT, який говорить про готовність даних до відправки. Отримавши цей токен, ведений пристрій може вважати дані з буфера OUT.

Якщо веденому пристрою потрібно передати на провідне дані, він поміщає їх у буфер IN. У цьому буфері дані будуть доти, доки провідний пристрій не відправить токен IN, запитуючи дані з кінцевої точки. Усі буфери кінцевих точок називаються стосовно провідного пристрою, тобто. вихідний буфер веденого пристрою називається IN т.к. він є вхідним буфером для провідного пристрою.

Передача даних від однієї кінцевої точки в іншу здійснюється через потоки. Потік – логічне з'єднання між хостом та кінцевою точкою (точками).

Потоки також мають набір параметрів, таких як тип передачі (Control, Bulk, Iso або Interrupt), напрямок потоку даних та максимальні розміри пакета/буфера.

Наприклад, потік за умовчанням – це двонаправлений потік, складений із IN кінцевої точки 0 і OUT кінцевої точки 0 з типом передачі control.

USB визначає два типи потоків (pipes)

А) Stream Pipesне мають визначеного USB формату, тому Ви можете надіслати дані будь-якого типу через stream pipe і відновити дані на іншому кінці. Потоки даних послідовні і мають певну спрямованість – IN чи OUT. Stream pipes підтримують типи передач bulk, isochronous та interrupt. Stream pipes можуть керуватися від хоста, або від пристрою.

Б) Message Pipesмають визначений USB формат. Вони керуються хостом, ініціюються запитом, що надсилається від хоста. Дані надсилаються в потрібному напрямку, заданому у запиті. Таким чином, message pipes дозволяють передавати дані в обох напрямках, але підтримують лише передачі control.

Стандарт USB описує чотири типи передачі даних:

А) Керуюча пересилка (control transfer) використовується для конфігурації пристрою, а також інших специфічних для конкретного пристрою цілей.

Б) Потокове пересилання (bulk transfer) використовується передачі великого обсягу інформації.

В) Пересилання з перериванням (iterrupt transfer) використовується для передачі щодо невеликого обсягу інформації, для якого важливе своєчасне його пересилання. Має обмежену тривалість та підвищений пріоритет щодо інших типів пересилок.

Г) Ізохронне пересилання (isochronous transfer) також називається потоковим пересиланням реального часу. Інформація, що передається в такому пересиланні, вимагає реального масштабу часу при її створенні, пересиланні та прийомі.

Поточні пересилання характеризуються гарантованою безпомилковою передачею даних між хостом та функцією за допомогою виявлення помилок при передачі та повторного запиту інформації. Коли хост стає готовим приймати дані від функції, він у фазі передачі пакета-ознака посилає функції IN-пакет. У відповідь на це функція у фазі передачі даних передає хосту пакет з даними або, якщо вона н

з номіналами від 10 Ом до 1 МОм);

  • сполучні дроти (наприклад, ось такий гарний набір);
  • персональний комп'ютер із середовищем розробки Arduino IDE.
  • 1 Опис послідовногоінтерфейсу SPI

    SPI – Serial Peripheral Interface або «Послідовний периферійний інтерфейс»- це синхронний протокол передачі даних для поєднання провідного пристрою (Master)з периферійними пристроями (Slave). Провідним пристроєм часто мікроконтролер. Зв'язок між пристроями здійснюється за чотирма проводами, тому SPI іноді називають «чотирьохпровідний інтерфейс». Ось ці шини:

    Існує чотири режими передачі даних ( SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), обумовлені поєднанням полярності тактових імпульсів (працюємо за рівнем HIGH або LOW), Clock Polarity, CPOL, і фазою тактових імпульсів (синхронізація по передньому або задньому фронті тактового імпульсу), Clock Phase, CPHA.

    Малюнок пояснює цю таблицю.

    Інтерфейс SPI передбачає кілька варіантів підключення керованих пристроїв: незалежнеі каскадне. При незалежному підключенні до шини SPI провідний пристрій звертається до кожного керованого пристрою індивідуально. При каскадному підключенні ведені пристрої спрацьовують по черзі, як каскадом.


    Види підключення пристроїв для роботи за інтерфейсом SPI: незалежне та каскадне

    2 Реалізація інтерфейсу SPIна платах сімейства Arduino

    В Arduino шини інтерфейсу SPI знаходяться на певних портах. Кожна плата має свою відповідність висновків. Для зручності висновки продубльовані та винесені також на окремий роз'єм ICSP(In Circuit Serial Programming, програмування пристрою, включеного в ланцюг, за послідовним протоколом). Зверніть увагу, що на роз'ємі ICSP немає пін вибору веденого - SS, т.к. мається на увазі, що Arduino буде використовуватися як провідний пристрій у мережі. Але при необхідності ви можете призначити будь-який цифровий висновок Ардуїно як SS.

    На малюнку наведено стандартну відповідність висновків шин SPI для Arduino UNO і Nano.


    3 Бібліотека для роботиз інтерфейсом SPI

    Для Arduino написана спеціальна бібліотека, яка реалізує протокол SPI. Підключається вона так: на початку програми додаємо #include SPI.h.

    Щоб розпочати роботу за протоколом SPI, потрібно задати налаштування і потім ініціалізувати протокол за допомогою процедури SPI.beginTransaction(). Можна виконати це однією інструкцією: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))

    Це означає, що ми ініціалізуємо протокол SPI на частоті 14 МГц, передача даних, починаючи з MSB (найбільш значного біта), як SPI_MODE0.

    Після ініціалізації вибираємо ведений пристрій, переводячи відповідний пін SS у стан LOW.

    Потім передаємо веденому пристрою дані командою SPI.transfer().

    Після передачі повертаємо SS у стан HIGH.


    Робота з протоколом завершується командою SPI.endTransaction().

    Бажано мінімізувати час виконання між інструкціями SPI.beginTransaction() і SPI.endTransaction(), щоб не виникло накладок, якщо інший пристрій спробує ініціалізувати передачу даних, використовуючи інші налаштування.

    4 Підключення зсувного регіструдо Arduino

    Розглянемо практичне застосування інтерфейсу SPI. Запалюватимемо світлодіоди, керуючи 8-бітовим зсувним регістром по шині SPI. Підключимо до Arduino зсувний регістр 74HC595. До кожного з 8 виходів регістру через обмежувальний резистор підключимо по світлодіоду номіналом 220 Ом. Схема наводиться малюнку.


    5 Скетч для керування зсувним регістромза інтерфейсом SPI

    Напишемо такий скетч.

    #include const int pinSelect = 8; // пін вибору регістру void setup() ( SPI.begin(); // ініціалізація інтерфейсу SPI pinMode(pinSelect, OUTPUT); //digitalWrite(pinSelect, LOW); // Вибір веденого пристроїв (реєстру) SPI.transfer(0); // Очищаємо вміст регістра digitalWrite(pinSelect, HIGH); // Кінець передачі Serial.begin(9600); } void loop() ( for (int i=0; i )

    Спочатку підключимо бібліотеку SPI та ініціалізуємо інтерфейс SPI. Визначимо пін 8 як пін вибору веденого пристрою SS. Очистимо зсувний регістр, надіславши в нього значення "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, нам потрібно було б для кожного світлодіода використовувати окремий порт.

    Ми вивчили найпростіший приклад роботи Arduino із шиною SPI. Докладніше розглянемо роботу кількох зсувних регістрів за незалежного і каскадного підключення в окремій статті.