Компромиссы при рассмотрении SPI или I2C?

Какие компромиссы следует учитывать при принятии решения об использовании интерфейса SPI или I2C?

Эта плата акселерометра /гироскопа доступна в двух моделях, по одному для каждого интерфейса. Будет ли проще интегрироваться в проект Arduino?

http://www.sparkfun.com/products/11028

введите описание изображения здесь>> </p></div>
				<div class= spi i2c

109 голосов | спросил Mark Harrison 31 MaramSat, 31 Mar 2012 08:33:24 +04002012-03-31T08:33:24+04:0008 2012, 08:33:24

8 ответов


90

Резюме

  • SPI быстрее.
  • I2C более сложный и не такой простой в использовании, если ваш микроконтроллер не имеет контроллера I2C.
  • I2C требует только 2 строки.

I2C - это система шин с двунаправленными данными на линии SDA. SPI - это двухточечное соединение с данными и данными на отдельных линиях (MOSI и MISO).

По существу SPI состоит из пары регистров сдвига, где вы синхронизируете данные в одном сдвиговом регистре, когда вы синхронизируете данные из другого. Обычно данные записываются в байтах, каждый раз, когда 8 тактовых импульсов последовательно, но это не требование SPI. Если хотите, вы также можете использовать длину слова 16 бит или даже 13 бит. В то время как в I2C синхронизация выполняется стартовой последовательностью в SPI, она выполняется SS (высокий уровень SS активен). Вы сами решаете, сколько часов это так. Если вы используете 13-битные слова, SS защелкнет последний такт в битах после 13 тактовых импульсов.
Так как двунаправленные данные находятся на двух отдельных строках, их легко можно связать.

SPI в стандартном режиме требует не менее четырех строк: SCLK (последовательные часы), MOSI (Master Out Slave In), MISO (Master In Slave Out) и SS (Slave Select). В бидеруальном режиме требуется не менее трех строк: SCLK (последовательные часы), MIMO (Master In Master Out), который является одной из линий MOSI или MISO и SS (Slave Select). В системах с более чем одним подчиненным вам нужна линия SS для каждого подчиненного устройства, так что для ведомых \\ N \ $ у вас есть \ $ N + 3 \ $ линии в стандартном режиме и \ $ N + 2 \ $ линии в двунаправленном режиме , Если вы этого не хотите, в стандартном режиме вы можете подключить ведомые устройства, подключив сигнал MOSI одного подчиненного устройства к MISO следующего. Это замедлит связь, так как вам придется циклически перебирать все данные ведомых.

Как и tcrosley, SPI может работать на гораздо более высокой частоте, чем I2C.

I2C немного сложнее. Поскольку это автобус, вам нужен способ обращения к устройствам. Ваше сообщение начинается с уникальной последовательности запуска: линия данных (SDA) вытягивается на низком уровне, в то время как часы (SCL) высоки, так как остальная часть данных связи разрешается изменять только при низких тактах. Эта последовательность запуска синхронизирует каждое сообщение.
Поскольку связь включает адресацию, для любого количества устройств (до 127) требуется только две строки.

  

изменить
  Очевидно, что линия данных двунаправленная, но стоит отметить, что это также верно для линии часов. Рабы могут растягивать часы для управления скоростью шины. Это делает I2C менее удобным для сдвига уровня или буферизации. (Линии SPI в стандартном режиме являются однонаправленными.)

После отправки каждого байта (адрес или данные) приемник должен подтвердить получение, поместив импульс подтверждения на SDA. Если ваш микроконтроллер имеет интерфейс I2C, это автоматически будет рассмотрено. Вы все еще можете бить его, если ваш микроконтроллер не поддерживает его, но вам придется переключать вывод ввода-вывода с выхода на вход для каждого подтверждения или чтения данных, если только вы не используете контакт ввода-вывода для чтения и один для записи.

При 400 кГц стандарт I2C намного медленнее, чем SPI. Существуют высокоскоростные устройства I2C, работающие на частоте 1 МГц, все еще намного медленнее, чем 20 МГц SPI.

ответил stevenvh 31 MaramSat, 31 Mar 2012 11:20:52 +04002012-03-31T11:20:52+04:0011 2012, 11:20:52
35

(edit: Чтобы быть ясным, многие из следующих проблем связаны с целостностью сигнала, вызванной использованием устройств I2C /SPI с использованием платы на борту, как правильно указывает Olin.)

Если у вас есть ограничения, которые сильно подталкивают вас к меньшему количеству проводов (у нас был один проект с герметично закрытым разъемом, что каждый дополнительный контакт был довольно дорогим), избегайте I2C, когда это возможно, и придерживайтесь SPI.

SPI довольно легко справляется на аппаратном и программном обеспечении. В аппаратных средствах есть две разделяемые линии передачи данных: Master In Slave Out (MISO или SOMI) и Master Out Slave In (MOSI или SIMO), общий тактовый генератор и один чип для каждого устройства. Линия CS выходит на низкое, тактовые циклы и существенно сдвигают входные биты и сдвигают выходные биты, пока транзакция не завершится, и в этот момент линия CS идет высоко. Когда их линия CS высока, подчиненные устройства не обмениваются данными: они игнорируют строки CLK и MOSI и помещают их вывод MISO в состояние с высоким импедансом, чтобы позволить кому-то другому его использовать.

Если у вас есть микроконтроллер с несколькими SPI-устройствами и он имеет встроенную периферийную систему SPI, отправьте CS-выход микроконтроллера на демультиплексор (например, 74HC138) и управляйте адресными линиями, чтобы выбрать устройство между транзакциями SPI; вы пишете слова в регистр, чтобы поставить их в очередь для вывода, и прочитайте их после того, как контакт CS поднят высоко.

Поскольку сигналы SPI являются однонаправленными, они могут быть буферизированы, используются через изолирующий барьер с цифровыми изоляторами и могут быть отправлены с борта на борт с помощью линейных драйверов, таких как LVDS. Единственное, о чем вам нужно беспокоиться, это задержка распространения в оба конца, которая ограничит вашу максимальную частоту.


I2C - совершенно другая история. Хотя это намного проще с точки зрения электропроводки, только с двумя проводами SCL и SDA, обе эти линии являются общими двунаправленными линиями, которые используют устройства с открытым стоком с внешним pullup. Существует протокол для I2C, который начинается с передачи адреса устройства, так что можно использовать несколько устройств, если каждый имеет свой собственный адрес.

С аппаратной точки зрения очень сложно использовать I2C в системах с существенным шумом. Чтобы буферизировать или изолировать линии I2C, вам нужно прибегнуть к экзотическим ИС - да, они существуют, но их не так много: мы использовали один на один проект и поняли, что вы можете использовать один изолятор, но вы не можете использовать два в серии - он использовал небольшие падения напряжения, чтобы выяснить, какая сторона была движущей силой вещей, а две серии были двумя.

Пороги логического уровня I2C зависят от Vcc, поэтому вы должны быть очень осторожны, если используете 3V /3.3V и 5V устройства в одной системе.

Любые сигналы, которые используют кабель более чем на одну ногу или две, должны беспокоиться о емкости кабеля. Емкость 100pf /метр не слишком обычна для многожильного кабеля. Это приводит к тому, что вам приходится замедлять работу шины или использовать более низкие резисторы для подтягивания, чтобы иметь возможность правильно управлять дополнительной емкостью и соответствовать требованиям времени нарастания.

Итак, скажем, у вас есть система, которую, по вашему мнению, вы хорошо спроектировали, и вы можете справиться с большинством проблем с целостностью сигнала, а шум редок (но все еще присутствует). О чем вы должны беспокоиться?

Существует множество условий ошибок, с которыми вы должны быть готовы:

  • Ведомое устройство не подтверждает конкретный байт. Вы должны обнаружить это и остановить и перезапустить последовательность связи. (С SPI вы можете обычно читать данные, которые вы отправляете, если хотите убедиться, что они были получены без ошибок.)

  • Вы читаете байт данных с ведомого устройства, и устройство «загипнотизировано» из-за шума на линии часов: вы отправили необходимые 8 часов для чтения этого байта, но из-за шума , ведомое устройство считает, что оно получило 7 тактов и все еще передает 0 в строке данных. Если устройство получило 8-й такт, оно должно было бы высвободить линию передачи данных так, чтобы мастер мог поднять или опустить линию передачи данных для передачи бит ACK или NACK, или мастер мог передать условие остановки (P). Но ведомое устройство все еще держит линию данных на низком уровне, тщетно ожидая других часов. Если мастер не готов попробовать дополнительные часы, шина I2C застрянет в тупике. В то время как я использовал несколько микроконтроллеров, которые обрабатывают обычные условия ACK /NACK, я никогда не использовал тот, который успешно справляется с этим пропущенным битом бит (или дополнительным тактом), и мне пришлось выйти из автоматического режима I2C, banging mode, добавлять часы до тех пор, пока линия передачи данных не будет высокой, и повторно войдите в автоматический режим I2C.

  • Действительно ужасный случай, когда ведущий записывает данные на одно ведомое устройство, а другое подчиненное устройство неправильно интерпретирует адрес устройства и думает, что переданные данные предназначены для него. Из-за этого у нас были устройства I2C (расширители ввода-вывода), которые из-за этого иногда регистрируются неправильно. Обнаружение этого случая практически невозможно, и чтобы быть уверенным в шуме, вы должныпериодически устанавливайте все регистры, так что, если вы столкнулись с этой ошибкой, по крайней мере, она будет исправлена ​​через короткий промежуток времени. (SPI никогда не сталкивается с этой проблемой - если у вас случится сбой в линии CS, он никогда не будет сохраняться долгое время, и вы не получите данные, случайно прочитанные неверным подчиненным устройством.)

Многие из этих условий могут быть правильно обработаны в протоколе, если обнаружено обнаружение ошибок (коды CRC), но у немногих устройств есть это.


Я нахожу, что мне нужно создать сложное программное обеспечение в моем ведущем устройстве I2C для обработки этих условий. На мой взгляд, это просто не стоит, если ограничения на проводку не заставят нас использовать I2C, а не SPI.

ответил Jason S 1 AMpSun, 01 Apr 2012 05:36:39 +040036Sunday 2012, 05:36:39
15

В общем, SPI - это более быстрая шина - тактовая частота может быть в диапазоне МГц. Однако SPI требует не менее 3 строк для двунаправленной связи и дополнительного подчиненного устройства для каждого устройства на шине.

I2C требует только 2 строки, независимо от того, сколько у вас устройств (в пределах, конечно). Скорость, однако, находится в диапазоне кГц (типично 100-400 кГц).

Большинство микроконтроллеров, в настоящее время, имеют аппаратную поддержку для обеих шин, поэтому обе они одинаково просты в использовании.

ответил Armandas 31 MaramSat, 31 Mar 2012 10:54:04 +04002012-03-31T10:54:04+04:0010 2012, 10:54:04
14

Плата взлома для устройства в SparkFun предназначена только для версии I2C (MPU-6500). Версия MPU-6000 имеет интерфейсы SPI и I2C на одном чипе, и я не вижу, что у SparkFun есть плата с этим чипом. Поэтому я считаю, что вы ограничены использованием I2C, если вы хотите использовать эту конкретную плату. Но я по-прежнему рекомендую использовать I2C в вашей ситуации по следующим причинам.

В общем, вы обнаружите, что шина I2C проще в использовании с аппаратной точки зрения, чем шина SPI. I2C представляет собой двухпроводную шину (SCL /SDA):

SCL - последовательные часы.
SDA - последовательные данные (двунаправленные).

SPI - это 4-проводная шина (SCLK /MOSI /MISO /CS):

SCLK - Серийные часы.
МОСИ - Мастер-аут, Раб-в. Данные от CPU к периферийному.
MISO - Мастер-в, Раб. Данные от периферии к CPU.
CS - выбор микросхемы.

У вас может быть несколько устройств, подключенных к одной шине I2C. Каждое устройство имеет свой собственный набор адресов, встроенных в чип. Фактически адрес передается по шине в виде первого байта каждой команды (вместе с битом чтения /записи). Это, наряду с некоторыми другими накладными расходами, требует больше бит для передачи по шине I2C и SPI для той же функциональности.

Различные классы устройств (память, ввод-вывод, ЖК-дисплей и т. д.) имеют разные диапазоны адресов. Некоторые устройства, которые обычно используются более одного раза в системе (например, расширитель ввода-вывода PCF8574), используют одну или несколько адресных линий (AD0-2 для PCF8574), которые могут быть привязаны высоко или низко, чтобы указать низкие разряды адреса. MPU-6500 имеет одну такую ​​адресную строку (AD0), поэтому две из них могут использоваться в одной и той же системе.

У вас также может быть несколько устройств на шине SPI, но каждое устройство должно иметь свою собственную линию выбора чипа (CS). Поэтому 4-проводное описание немного ошибочно - это действительно трехпроводный интерфейс + один дополнительный провод на устройство. Я не знаком с сериями плат Arduino, но я считаю, что это сделало бы SPI более сложным для Arduino, поскольку, если вам понадобилось много строк выбора микросхем, это начало бы обременительно с общими назначениями штырей, используемыми различными экранами ,

Я считаю, что большинство плат Arduino работают на 5 вольт, а некоторые более новые - на 3,3 В. MPU-6500 работает на 3,3 В. Если минимальное входное «высокое» напряжение для шины I2C на 5-вольтовом процессоре составляет 3 В или ниже, вы можете избежать проблем с преобразованием уровня, просто предоставив резисторы 10K для подтягивания до 3.3 В на линиях SCL и SDA, поскольку шина разомкнута, коллектор. Удостоверьтесь, что все 5 В внутренних pullups на CPU отключены.

Однако я проверил данные для ATmega2560 (например, с использованием ADK 5v Arduino), а его минимальное входное «высокое» напряжение - 0,7 * Vcc или 3,5v, что больше 3,3 В. Так что вам нужно что-то вроде преобразования активного уровня. TI PCA9306 , который требует подтягиваний резисторов на обеих сторонах микросхемы 5v и 3.3v, стоит всего 78 центов в единичных количествах.

Зачем тогда выбирать SPI через I2C? В основном потому, что SPI можно запускать намного быстрее - до нескольких десятков МГц в некоторых случаях. I2C обычно ограничивается 400 кГц. Но это не проблема акселерометра MPU-6050/6000, так как он работает на частоте 400 кГц для I2C, и только 1 МГц для SPI - не так уж и много.

ответил tcrosley 31 MaramSat, 31 Mar 2012 10:44:25 +04002012-03-31T10:44:25+04:0010 2012, 10:44:25
12

SPI можно запускать намного быстрее, чем I2C (некоторые устройства SPI работают более 60 МГц, я не знаю, допускает ли «официальная» спецификация I2C устройства более 1 МГц). Реализация ведомого устройства с использованием любого из протоколов требует аппаратной поддержки, в то время как обе обеспечивают легкую реализацию «программных бит-бэнд» мастеров. При относительно минимальном оборудовании можно построить подчиненный I2C ведомый, который будет работать корректно, даже если хост может произвольно решить игнорировать шину до 500US за раз, без необходимости дополнительных проводок. Однако надежная операция SPI даже с поддержкой аппаратного обеспечения , как правило, требует, чтобы либо добавили провод установления связи, либо же, что хост «вручную» добавил задержку после каждого байта, равного наихудшему ответу ведомого устройства время.

Если бы у меня были мои барабанщики, поддержка SPI контроллеров содержала бы несколько простых дополнительных функций, обеспечивающих 8-битную прозрачную двунаправленную передачу данных между контроллерами с поддержкой и пробуждением, используя в общей сложности три однонаправленных провода (часы и MOSI [master-out-slave-in] от ведущего, MISO [master-in-slave-out] от подчиненного устройства). Для сравнения, эффективная и надежная связь между микроконтроллерами с «штоковыми» SPI-портами, когда оба процессора могут независимо задерживаться на произвольные промежутки времени, требует использования гораздо большего количества проводов (Chip-Select, Clock, MISO и MOSI для запуска с, плюс какой-то провод подтверждения от подчиненного устройства. Если ведомый может асинхронно запускать передачу данных (например, потому что кто-то нажал кнопку), тогда нужно либо использовать еще один провод в качестве сигнала «пробуждения», либо иметь мастер повторно опросить ведомое устройство, чтобы узнать, есть ли у него данные.

I2C не предоставляет всех способностей, которые мог бы иметь мой «улучшенный» SPI, но он предлагает встроенные возможности установления связи, которые отсутствуют в SPI, и во многих реализациях он может быть заблокирован для обеспечения пробуждения, даже если master - бит-бит. Поэтому для межпроцессорной связи я настоятельно рекомендую I2C по SPI, за исключением случаев, когда требуются более высокие скорости, чем SPI, и использование дополнительных контактов приемлемо. Для межпроцессорной связи, где требуется низкий уровень выводов, UART имеют много рекомендаций, чтобы рекомендовать их.

ответил supercat 2 PMpMon, 02 Apr 2012 20:57:54 +040057Monday 2012, 20:57:54
8

Этот вопрос был тщательно изучен в превосходных ответах здесь, но, возможно, есть еще одна точка зрения на I 2 C, которую я мог бы предложить с точки зрения производителя микросхем.

Электрический интерфейс I 2 C представляет собой открытый коллектор . Теперь дышите и подумайте о последствиях. Используя I 2 C, я могу создать чип, который полностью не зависит от рабочего напряжения шины. Все, что мне нужно сделать, это потянуть линию SDA на низком уровне, если мне это нравится, и сравнить напряжения SCL и SDA с некоторым пороговым напряжением на основе заземления, которое я могу выбрать. И если я не буду оставлять нормальные высокозащитные структуры и заменять их другими структурами, я могу сделать чип, который может полностью жить своей жизнью, не зависящей от остальной системы - SCL, SDA никогда не подают ток на мой чип, а я конечно же, не будет подавать ток на эти контакты. Вот почему это такая хорошая шина для часов реального времени и других подобных маломощных вещей.

ответил PkP 17 WedEurope/Moscow2014-12-17T02:12:54+03:00Europe/Moscow12bEurope/MoscowWed, 17 Dec 2014 02:12:54 +0300 2014, 02:12:54
4

Одна вещь, которую я не видел в других ответах, заключается в том, что I2C поддерживает несколько мастеров на одной и той же шине. Если вам нужна двунаправленная связь и вы не хотите использовать метод на основе опроса, I2C выполнит эту работу.

На больших расстояниях CAN имеет одинаковую возможность и более надежный. Но CAN - это асинхронный протокол, который требует аппаратной поддержки и приемопередатчика, поэтому он может не быть вариантом в недорогой системе.

ответил Adam Haun 17 WedEurope/Moscow2014-12-17T03:03:49+03:00Europe/Moscow12bEurope/MoscowWed, 17 Dec 2014 03:03:49 +0300 2014, 03:03:49
0

Используйте протокол SPI и записывайте свои биты непосредственно на устройство, когда часы синхронизации растут. Логическая схема xnor может использоваться для соответствия «домашнему» адресу из памяти, чтобы выбрать желаемое устройство, как если бы это было устройство i2c.

i2c интегрирует автомат в формате устройства, стандартный ... и т. д. сложные и разные, с spi вы можете использовать spi-память для отображения видео на экране, но не i2c.

ответил lansuperman 3 Maypm17 2017, 20:14:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132