Синхронна передача даних за інтерфейсом SPI
Інтерфейс SPI (Serial Peripheral Interface) служить обмінюватись даними з периферійними пристроями. Як такі пристрої можуть виступати прості зсувні регістри або буквено-цифрові модулі індикації, а також складні процесори або системи реєстрації даних. Багато компаній-виробників пропонують великий вибір пристроїв з інтерфейсом SPI.
У разі обміну даними по інтерфейсу SPI мікроконтролер працює в режимі ведучого пристрою (Master), взаємодіючи з одним або декількома блоками (Slave). Схема передачі за інтерфейсом SPI мікроконтролерів AVR/PIC показано на рис. 7.6 (MSB – старший розряд, a LSB – молодший розряд байта).

Мал. 7.6. Схема передачі даних за інтерфейсом SPI мікроконтролерів AVR
Провідний пристрій перебирає активну частину обміну даними, викликаючи передачу і керуючи процесом. Ведений пристрій не може бути активним. Воно приймає та передає дані лише тоді, коли відбувається його активізація з боку провідного пристрою по лінії /SS. Провідний пристрій також генерує такт передачі по вихідній лінії SCK. Для веденого блоку висновок SCK є входом, через який він отримує від Master-пристрою сигнали, що тактують.
Якщо ведений пристрій активізується провідним по лінії /SS, то починається обмін даними: Master записує байт, що підлягає передачі, у свій зсувний регістр даних (для мікроконтролерів AVR – регістр SPDR, для мікроконтролерів PIC – регістр SSPBUF). За допомогою кожного виробленого тактового імпульсу Master переміщує один біт даних на вихід MOSI/SDO, а Slave одночасно у зворотному напрямку передає один біт на вхід MISO/SDI провідного блоку. Таким чином, протягом циклу SPI, що складається з восьми тактовихімпульсів, Master та Slave обмінюються байтом даних.
Після закінчення передачі в регістрі стану інтерфейсу SPI встановлюється прапор відповідного запиту на переривання. Цей прапор вказує на закінчення передачі та викликає запит на переривання після того, як у регістрі керування SPI буде встановлений розряд дозволу на переривання від інтерфейсу SPI. У режимі Master поточна передача даних може бути передчасно завершена видачею в лінію /SS сигналу лог. 1.
До інтерфейсу SPI провідного пристрою можна підключати кілька ведених пристроїв (приклад для мікроконтролерів AVR - на рис. 7.7), проте активним буде тільки те з них, на вхід /SS якого буде подано рівень балка. 0. Виходи MISO незадіяних ведених блоків знаходяться у високоомному стані та не впливають на процес передачі даних.
У прикладі на рис. 7.7 пристрій G2, з погляду провідного пристрою, є лише блоком передачі (наприклад, ЦАП з інтерфейсом SPI), а пристрій G3 лише блоком прийому.

Мал. 7.7. Підключення кількох ведених пристроїв до одного провідного SPI (для AVR)
У мікроконтролерах AVR як лінії SPI використовуються висновки порту (табл. 7.2). У мікроконтролерах PIC для синхронної послідовної передачі даних використовується порт MSSP, що працює в режимі інтерфейсу SPI або I2С. Ліній SPI відповідають висновки порту А і С (табл. 7.2).
Таблиця 7.2. Розподіл виводів портів для ліній інтерфейсу SPI
| Лінія | Мікроконтролери AVR | Мікроконтролери PIC |
| /SS | Розряд 4 порти В | Залежить від моделі (наприклад, розряд 5 порту А) |
| MOSI (SDO) | Розряд 5 порту В | Розряд 5 порту С |
| MISO(SDI) | Розряд 6порту В | Розряд 4 порти С |
| SCK | Розряд 7 порту В | Розряд 3 порти С |
Регістри управління та стану SPI у мікроконтролерах AVR
| SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 |
Мал. 7.8. Реєстр управління SPCR мікроконтролерів AVR
По закінченні передачі через інтерфейс SPI апаратна частина встановлює в регістрі стану SPCR розряд SPIF (прапор переривань від інтерфейсу SPI). Цей прапор вказує на завершення передачі, і приводить до запиту на переривання як тільки в регістрі керування SPCR буде встановлений розряд SPIE, а в регістрі стану SREG - прапор загального дозволу переривань I.
Розряд SPE активує інтерфейс SPI (лог. 1) або відключає його (лог. 0). Після надходження сигналу скидання цей розряд набуває значення балка. 0, і цим система SPI вимикається.
Якщо розряд DORD містить балку. 0, то спочатку буде передано старший розряд байта даних. За DORD = 1 першим передається молодший розряд.
Коли MSTR містить лог. 0, система SPI визначається як ведена (Slave), а при MSTR = 1 вона буде визначена як ведуча (Master). Коли лінія /SS в режимі Master налаштована як вхід, то розряд MSTR при низькому рівні сигналу на виведенні /SS скидається в балку. 0 і тим самим інтерфейс SPI визначається як Slave. І тут у регістрі стану встановлюється прапор SPIF.
Коли розряд CPOL містить балку. 0, то на виході SCK у неактивному стані знаходиться сигнал низького рівня. Якщо CPOL = 1, то SCK в неактивному стані перебуває сигнал високого рівня. За допомогою цього розряду, а також розряду СРНА (вибір фази синхронізації) встановлюється один із чотирьох режимівпередачі даних з інтерфейсу SPI (табл. 7.3).
Розряди SPR1 і SPR0 під час роботи інтерфейсу SPI як Master служать для вибору тактової частоти лінії SCK. Якщо система SPI налаштована як Slave, ці розряди немає ніякого значення. Взаємозв'язок між розрядами SPR1, SPR0 і частотою імпульсів лінії SCK показано в табл. 7.4.
Таблиця 7.3. Режими передачі даних за інтерфейсом SPI в МК AVR
| CPOL | СРНА | Опис режиму |
| Master переводить лінію /SS у стан балка. 0. Для відповідного веденого блоку передача починається по спадаючому фронту цього сигналу. Його вихід MISO переходить із високоомного в активний стан, і старший розряд байта, що знаходиться в його регістрі даних SPDR, з'являється на виході MISO. Власне передачу даних Master починає записом байта даних, що підлягає передачі, в свій регістр SPDR. Після цього на виході MOSI провідного блоку з'являється старший розряд. Протягом першої половини першого тактового імпульсу тактова лінія залишається в стані спокою для того, щоб забезпечити стабільну установку на відповідному вході біта даних. По фронту, що наростає, першого і кожного наступного тактового імпульсу приймаються біти, розташовані на входах Master і Slave, а по спадаючому фронту наступний біт зрушується далі. Після восьмого тактового імпульсу передача даних завершена, прапори SPIF у регістрах стану ведучого та веденого блоків встановлені, а вміст зсувних регістрів будуть перенесені у відповідні приймальні буфери. Вихід MOSI провідного блоку повертається у стан спокою (лог. 1), але в виході MISO веденого блоку, зазвичай, перебуває старший розряд байта, щойно прийнятого провідним блоком. Одночасно зі скиданням лінії /SS у вихіднестан (лог. 1) Master завершує передачу, Slave стає неактивним, яке вихід MISO перетворюється на високоомний стан | ||
| Аналогічно описаному вище випадку з тією різницею, що стан спокою тактової лінії встановлюється тут при лог. 1, біти даних приймаються за першим і кожним наступним тактовим імпульсом, а зсув здійснюється по наростаючому фронту сигналу | ||
| Щоб при цьому режимі почати передачу даних, Master, як і в першому випадку, переводить лінію /SS в стан лог. 0. Блок Slave розблокований, і його вихід MISO переходить із високоомного в активний стан. Логічний рівень на MISO цього випадку не визначено, але, зазвичай, на MISO перебуває молодший розряд байта, переданого під час попередньої передачі від Slave до Master. Власне передачу даних Master в цьому режимі починає за допомогою запису байта даних, що підлягає передачі, регістр SPDR. Для веденого блоку передача починається по фронту, що наростає, тактового сигналу. Старші розряди підлягають передачі байтів у ведучому та веденому блоках за допомогою наростаючого фронту першого тактового імпульсу встановлюються на виході MOSI провідного блоку (виході MISO веденого блоку). По спадаючому фронту першого і кожного наступного тактового імпульсу вони переносяться на входи Master і Slave, а по фронту, що наростає, наступний розряд зсувається. Після восьмого тактового імпульсу передача даних завершується, встановлюються прапори SPIF в регістрах стану інтерфейсів Master і Slave, а їх зсувних регістрів переноситься у відповідні буфери прийому. Вихід MOSI провідного блоку повертається у стан спокою (лог. 1), на виході MISO веденого блоку залишається молодший розряд байта, що переданого провідному блоку. Одночасно з поверненням довихідний стан лінії /SS (лог. 1) Master завершує передачу загалом, Slave стає неактивним, яке вихід MISO перетворюється на високоомний стан. | ||
| Аналогічно описаному вище нагоди стій різницею, що станом спокою тактової лінії тут є балка. 1, а біти даних зрушуються по спадаючому фронту першого і кожного наступного тактового імпульсу, а приймаються по фронту, що наростає |
Таблиця 7.4. Частота імпульсів лінії SCK залежно від розрядів SPR1, SPR0
| SPR1 | SPR0 | Частота імпульсів у лінії SCK |
| Частота системної синхронізації / 4 | ||
| Частота системної синхронізації /16 | ||
| Частота системної синхронізації / 64 | ||
| Частота системної синхронізації /128 |
розряд 6 - прапор WCOL - встановлюється в тому випадку, коли під час передачі даних через інтерфейс SPI робиться спроба запису в регістр даних SPI, що призводить до руйнування щойно переданого байта даних. Тому поточна передача даних доводиться до завершення, а новий байт не записується в зсувний регістр інтерфейсу SPI. Прапор WCOL повинен бути скинутий користувачем вручну за допомогою зчитування регістру стану та подальшого звернення до регістру даних інтерфейсу SPI;
розряд 7 - прапор SPIF - вказує на завершення передачі і викликає запит на переривання, як тільки в регістрі керування SPCR буде встановлений розряд SPIE, а в регістрі стану SREG - розряд I. Коли лінія /SS в режимі Master налаштована як вхід, то при низькому рівень сигналу на виведенні лінії /SS також буде встановлений прапором SPIF. Прапор SPIF автоматично скидається апаратною частиною при виконанні підпрограми обробки переривання від інтерфейсу SPI.Альтернативно, скидання може бути виконане вручну за допомогою зчитування регістру стану SPSR і подальшого звернення до регістру даних інтерфейсу SPI.