Чи безпечно перервати SPI?


17

Я пишу на карту microSD зсередини своєї прошивки, але це найнижча пріоритетна задача, тому її можна перервати іншими завданнями, поки вона знаходиться в середині читання / запису.

Припустимо, я спілкувався з цією карткою microSD за допомогою UART. Проблема під час читання полягала б у тому, що апаратне RX FIFO переповниться, тому максимальна затримка, яку я можу зробити, буде (розмір FIFO × байт / секунду), а під час запису не було б проблем, тому що інший кінець просто чекатиме, поки я надіслати наступний символ.

Як це працює зараз, я використовую SPI? Чи ситуація така, що для записів це не має значення, а для читання це залежить від розміру SPI FIFO?

Відповіді:


22

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

Існує три основні застереження:

  1. Як правило, після початку транзакції на шині SPI жоден провід на шині не може використовуватися для будь-яких інших цілей, поки ця транзакція не буде завершена. Взагалі, це означає, що переривання може не використовувати шину SPI, за винятком випадків, коли це єдине, що буде використовувати шину (можливо, переривання може мати ексклюзивне використання шини в деяких випадках, і для основної програма для ексклюзивного використання в інші часи). Деякі пристрої містять спеціальні штифти, щоб вони "ігнорували" шину посеред транзакції, але навіть маючи такі функції, я б не рекомендував намагатися перервати призупинення транзакції SPI на одному пристрої, здійснити транзакцію з іншим пристроєм, а потім дозвольте базовому коду відновити транзакцію з першою. Краще, щоб переривання було використано окрему шину SPI.
  2. Деякі пристрої можуть вести себе дивно, якщо транзакція триває занадто довго. Наприклад, деякі мікросхеми годинника в реальному часі не подвоюють двічі регістри часу / дати, а замість цього фіксують будь-які події "заздалегідь", що мали місце під час транзакції, та застосовують їх після завершення транзакції. Якщо транзакція займає стільки часу, що настає друга подія заздалегідь заздалегідь, ця подія буде ігнорована, внаслідок чого годинник сповзає на таку кількість часу. Я дійсно не бачу приводу для створення чіпа таким чином (навіть якщо не хотілося, щоб вартість подвійного буферизації даних була вказана, що програмне забезпечення, відповідальне за забезпечення його узгодженості, було б дешевше, ніж додавання логіки "відстрочення оновлення", і мінімізували б ймовірність порушення годин), але такі мікросхеми існують.
  3. Є кілька пристроїв, які використовують сигнал годинника та даних, але вони використовують "паузу" для позначення кадрування. Останнім прикладом цього, з яким я стикався, була світлодіодна світлодіодна струна контролера на лампу. Мені не дуже подобаються такі конструкції (можна було б так само добре вказати на обрамлення, використовуючи три послідовні піднімаючі краї на проводі даних без жодного втручаного годинника), але знову ж таки, такі пристрої існують.

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


3
+1 Приємно! Повністю погоджуйтеся з усіма своїми думками / фрустраціями. Бачив його занадто багато разів.
DrFriedParts

11

Перевіряючи копію специфікації (яку я не можу навести з причин авторського права / NDA), частота SPI задається починаючи з 0 Гц, що означає статичну роботу. Під SPI ви отримуєте дані лише під час роботи пристрою, тому якщо ви використовуєте апаратний SPI, ви отримаєте щось лише після надсилання даних (навіть якщо 0 / не хвилює). Тож у цьому відношенні це відрізняється від UART, де ви можете отримати назад непотрібні дані в будь-який час.


Тож я можу турбуватись лише про те, що на MicroSD-картці є якась вбудована система очікування, але не сама SPI?
Муїс

5
Згідно з характеристиками з усіх, що я міг бачити, на SD-картці також не повинно бути жодної форми таймауту, тому насправді не бачите, що у вас виникнуть проблеми. Роки тому я написав якийсь спеціальний код, і під час налагодження було одноразово переходити код, залишаючи, скажімо, 10 секунд або більше між операціями SPI, і все було добре.
PeterJ

1
+1, Можливість запустити SPI до 0 Гц корисно знати для налагодження. Спасибі.
Anindo Ghosh

1
Варто зазначити, що на деяких SPI-пристроях вихідні дані можуть змінюватися лише на певному краю годинника, але на деяких інших вихідні дані можуть іноді змінюватися асинхронно; це особливо часто зустрічається з "зайнятим" бітом. На деяких мікросхемах, якщо хтось встановив стан "зайнятого" біта, і він все ще знаходиться на виході, коли частина стає не зайнятою, вихід буде асинхронно змінюватися. На деяких інших мікросхемах повідомлення про стан "зайнятості" не змінюватиметься, доки він не повторно працює. Обидві конструкції мають переваги та недоліки, тому корисно знати, що існують обидва типи конструкцій.
supercat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.