SPI або I2C: який використовувати для довгої шини


36

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

Здається, як I2C, так і SPI можуть дозволити серії мікросхем спілкуватися по шині, але я не бачив нічого, щоб говорити про те, як довго це буде. Хтось намагався підключити ці протоколи на відстані декількох футів?


Я провів один раз автобус I2C по кабелю. Заднім числом я повинен був використовувати CAN або RS-485 (мав мікроконтролери на обох кінцях).
Нік Алексєєв

Відповіді:


19

Як вже говорили інші, SPI та I2C можна використовувати на великих відстанях, доки підтягуючі резистори, тактові частоти тощо.

Основними альтернативами (які дадуть кращий захист від шуму) є RS485 та CAN . Обидва з них використовують диференційовані лінії, щоб мінімізувати проблеми із шумом і краще підходять до такої тривалості передачі даних, ніж I2C або SPI. Однак я не думаю, що багато (будь-які?) Аудіо-відеомагнітофони оснащені вбудованою CAN-периферією, що робить CAN використання набагато простіше.

Я б сказав, що найважливіше, що слід враховувати під час вибору шини, - це забезпечити, щоб протокол, який ви використовуєте для спілкування між пристроями, містив CRC або еквівалент, щоб ви могли визначити, чи було отримано повідомлення правильно (CAN це має у складі пакет). Враховуючи це, також корисно мати відповідь типу ACK / NACK як частину протоколу, щоб пошкоджене повідомлення можна було повторно передавати.


Здається, що будь-хто буде працювати. Я в основному думаю про ці два конкретні протоколи, тому що більшість AVR підтримують їх на всьому світі, не додаючи зайвих компонентів. Інакше RS485 або CAN були б хорошим вибором.
edebill

Якщо ви не обмежуєтесь пакетами наскрізних отворів, то ST має свої економічно ефективні та потужні мікроконтролери STM32 та STM8 з CAN, NXP, має ряд мікроконтролерів LPC17xx, а також є кілька інших. CAN стає все більш поширеним (і доступним) для багатьох мікроконтролерів.
DrAl

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

1
У мікрочіпа є кілька ПІК з CAN. microchip.com/wwwproducts/Devices.aspx?dDocName=en010302 . Зізнаюся, вони трохи "прикольні" до програми, особливо в бібліотеках C18 / C30 Microchip. При огляді коду ми спостерігали деякий код бібліотеки, який було важко прочитати через деталі реалізації - буфер передачі, який використовується як буфер прийому, імена прапорців, які насправді протилежні тому, що вони представляють. Звичайно, це не те, що я б порекомендував для когось нового в розробці мікроконтролерів.
Дж. Полфер

2
CAN і RS-485 - це справді яблука та апельсини. CAN визначає протокол рівня бітів, а також фізичний електричний рівень (PHY). RS-485 - це лише специфіка фізичного рівня, вона нічого не вказує про протокол. Ви будете повністю залежати від того, щоб знайти чи реалізувати фактичний протокол поверх RS-485 PHY. CAN був розроблений для навколишнього середовища з високим рівнем шуму, його в основному використовують у автомобільній та обробній промисловості. Його протокол є досить складною системою передачі повідомлень і має дуже високі накладні витрати (низька фактична швидкість передачі даних), але має високу цілісність даних.
Марк

10

Кілька футів не повинні бути проблематичними, просто використовуйте кручені дроти, якщо можете. SPI набагато простіше буферувати (якщо вам потрібно), ніж I2C, оскільки сигнали SPI все односпрямовані, тоді як сигнали I2C знаходяться на спільних лініях.

Чи можуть мікроконтролери AVR керувати веденими режимами I2C та SPI, а також головними режимами? (вам потрібно обоє)


2
кручені дроти ?? НІКОЛИ не перекручуйте дані I2C та годинникові лінії! З SPI це, мабуть, менше проблем, але я б ніколи не крутив сигнальні лінії, якщо це не збалансована пара, і в цьому випадку скручування є дуже хорошою ідеєю.
Wouter van Ooijen

ніколи не кажи ніколи; Я б взяв незначну ємнісну сполуку (через скручування) між даними + годинником у будь-який день замість незначної індуктивної зв'язку до галасливої ​​силової електроніки (через не скручування)
Jason S

4
Вибачте, я, безумовно, не згоден. У 1 стані лінії мають досить високий опір. Побачив це, побачив, що він провалюється. Найкращий варіант - мати низькі струми наземних ліній між або навіть краще по обидва боки ліній I2C.
Wouter van Ooijen

10

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

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


RS485 - це, безумовно, хороший шлях для подібного.
Скотт Мерфі

майте на увазі, що RS485 має два аспекти, відмінні від RS232, які є дещо незалежними: фізичні диференціальні логічні рівні та багатомодальний аспект. Ви можете вибрати + вибирати ці, ми використовували як LVDS, так і RS485 перекладачі з UART (RS232) для точкового переходу без входу в багатопроменеві частини RS485.
Jason S

2
btw RS485 - це не протокол! він визначає лише фізичний шар. Сказавши це, ви можете точно використовувати SPI через RS485 !!! Було б охайним рішенням підтримувати зв’язок у режимі SPI, якщо це потрібно (я припускаю, що він може бути підключений до віддаленого АЦП або подібного). Використовуючи SPI через RS485, вам потрібно буде перевірити частоту
набору

8

Однією з переваг, ще не згаданої SPI над I2C, є те, що всі дроти SPI є однонаправленими і завжди рухаються високими або низькими. Це дозволяє набагато швидше спілкуватися, ніж це можливо з I2C, знижує сприйнятливість до шуму та дозволяє використовувати прості ворота як ретранслятори. Ще один корисний варіант - просте асинхронне спілкування (по одному проводу в кожному напрямку). Єдиний недолік, який я можу побачити при асинхронному спілкуванні, - це те, що для обміну даними зазвичай потрібно, щоб обидві сторони були "неспані" зі стабільним годинником.

Для власного проекту я використав 3-провідний трохи змінений протокол SPI і знайшов результати задовільними. Я без особливих труднощів надсилаю відображувані дані растрових зображень (де випадкові пошкодження даних не мають великої ваги) на 10 Мбіт / с та інші дані в 2,5 Мбіт / с.


Це дуже стара відповідь, але ви б сказали, на яку відстань ви надсилали модифікований протокол SPI? (У цьому і полягає питання ...)
Даніель Гріском

@DanielGriscom: Типово близько 3 футів, над не дуже вражаючим кабелем, але іноді і довше.
supercat

6

Незважаючи на те, що I2C і SPI розроблені для перевезення на коротких відстанях (кілька дюймів), їх можна використовувати на більш тривалих каналах за допомогою належного кабелю та уваги до загальної ємності шини.

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

Я використовував I2C для з'єднання між двома AVR на відстані 8 футів, використовуючи лише підтягуючі резистори та високоякісний, добре екранований, скручений кабель.


вам потрібно стежити за тим, як w / I2C є багатопровідникові кабелі, ємність може призвести до значного сповільнення шини.
Jason S

6

Як багато хто запропонував, I2C та SPI найкраще використовувати на коротких відстанях. Хоча можливо реалізувати рішення за допомогою цих інтерфейсів, я б настійно рекомендував шукати інше, "більш стандартне" рішення (наприклад, Ethernet, RS485, CAN тощо). - Особливо, якщо ви плануєте використовувати кабелі для досягнення відстані 6 футів між мікроконтролерами.


6

Просто FYI, інтерфейс між бездротовим пультом Nintendo Wii та його компаньйоном по Nunchuck використовує I2C по кабелю довжиною близько 3 футів. Існують також трифутові розтяжні кабелі, які продовжують загальну довжину приблизно до 6 футів. Не зовсім такий, як у ваших налаштуваннях (лише два пристрої, з'єднані разом), але це приклад I2C по кабелю у широко використовуваному споживчому продукті.


4

Я працював над проектом за участю близько 80 вузлів на основі AVR в зірковій мережі, що спілкуються через I2C. Це був загальний безлад і врешті не спрацював. Оновлення всіх вузлів зайняло секунди, і одне несправне з'єднання викине всю мережу. Востаннє я розмовляв із хлопцем, який зробив вузли, він сказав, що перестав використовувати I2C для подібних проектів. На жаль, я не знаю, чому конкретно I2C тут був неадекватним.


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

2

З цими короткими відстанями повинно бути легко. Що ви можете зробити, це зрозуміти, що означає ці відстані та ваш кабель з точки зору ємності та імпедансу ліній, і подивіться, які частоти (часи підйому / падіння) ви можете пройти через них. Поза певним моментом найкраще трактувати їх як лінії електропередачі. Якщо це виглядає погано, ви дійсно можете перейти на якусь іншу серійну лінію, наприклад, EIA-232 або 422. Це може означати додатковий чіп з обох кінців, але розтягнеться далеко. Якщо вам дійсно потрібно йти швидко і далеко, вам знадобиться щось більше (ethernet, не рахуйте радіо чи лазера :).


2

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.