Есть ли разница между использованием встроенного модуля SPI и бита?

25

Есть ли разница между ними, или это просто вопрос абстракции? Моя интуиция говорит, что нет никакой разницы, но я бы хотел быть неправым.

Skaevola
источник
1
Зависит от того, насколько ты хорош в этом. См. Code.google.com/p/fastspi и waitforbigo.com :-)
Роберт Аткинс

Ответы:

33

Фактическое периферийное устройство контроллера SPI в MCU часто может работать намного быстрее, чем битовый интерфейс. Конечно, это зависит от MCU, но я не удивлюсь, увидев SPI-контроллер, работающий на частоте 30+ МГц, в то время как битовая синхронизация может быть ограничена до 1 МГц (если вам повезет).

Но это еще не все. Во время битового микроконтроллера MCU занят этим. Это сдвигает данные и вертит линии GPIO. Это значит, что больше ничего нельзя делать. При использовании контроллера SPI контроллер занят выполнением всего этого, а MCU может выполнять другие действия.

Таким образом, с реальным контроллером SPI фактическая передача SPI происходит намного быстрее, и MCU возвращает несколько циклов, которые он может использовать для других задач.

Дитрих Эпп
источник
11

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

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

Amoch
источник
Причиной здравомыслия является мусор. Часто для настройки оборудования SPI в соответствии с требуемой конфигурацией требуется больше времени на чтение данных периферийных устройств SPI, чем на написание основного кода SPI, и, таким образом, только на чтение таблицы ведомых устройств.
Олин Латроп
Я признаю, что был немного сенсационным с моим замечанием о здравомыслии, но (по общему признанию, неписаное) намерение состояло в том, что с увеличением сложности приложения увеличивается и бремя обеспечения того, чтобы система в целом продолжала функционировать в намеченные сроки. Я реализовал это обоими способами, и я знаю, что предпочел бы использовать периферийные устройства, даже если мне потребуется несколько минут, чтобы прочитать лист данных.
Amoch
6

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

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

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

Есть несколько преимуществ для использования SPI master в прошивке. Аппаратные средства SPI иногда не очень удобны в настройке. Всегда существует проблема того, что именно должно произойти немедленно, когда утверждается выбор ведомого. Тогда первый бит записывается в строки данных? Что если часы начнут снижаться и линии данных должны быть зафиксированы на заднем фронте? Иногда это важно, иногда нет. С мастером SPI встроенного ПО вы можете быть более щадящим и, возможно, использовать одну и ту же процедуру для связи с разными подчиненными. Например, вы можете убедиться, что линия данных MOSI (Master Out Slave In) стабильна по обоим краям тактовой частоты. Оборудование SPI, как правило, этого не делает, поэтому такое оборудование необходимо будет переконфигурировать в зависимости от того, с каким ведомым устройством оно взаимодействует в данный момент.

Другое преимущество мастера SPI встроенного программного обеспечения состоит в том, что вы можете выбрать произвольное количество битов для каждой последовательности SPI. Аппаратные средства обычно ограничены кратными 8 битам. Большинство устройств предназначены для передачи целых байтов, но часто не требуют их. Например, 10-битный A / D, скорее всего, сначала отправит 10 бит данных, а затем отправит 0 или мусор после этого, если вы продолжите синхронизировать его. Если вы используете аппаратный SPI, вы будете вынуждены передавать 16 бит и маскировать мусор. Все будет работать нормально, но в этом случае мастер SPI-микропрограммы может быть быстрее, чем аппаратное обеспечение, поскольку он передает только минимально необходимые 10 бит.

Основными преимуществами аппаратных SPI-мастеров является то, что прошивка может инициировать передачу байтов, затем отключиться и сделать что-то еще. Синхронизация также обычно может быть быстрее, чем может достичь даже развернутый цикл прошивки. Обратите внимание, что, хотя оба эти преимущества могут быть важны в определенных обстоятельствах, они часто не имеют значения. Большая часть кода SPI, который использует аппаратное обеспечение для передачи байта, затем сразу переходит в цикл ожидания для аппаратного обеспечения, чтобы завершить передачу. Также внимательно проверьте требования к времени подчиненного устройства. Устройства SPI обычно бывают быстрыми в целом, но есть случаи, когда вам все равно нужно замедлять аппаратное обеспечение, чтобы соответствовать максимальной скорости, с которой может работать подчиненное устройство.

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

Вы можете использовать SPI-слэйвы в микропрограммном обеспечении, но это сложно, вам нужно тщательно рассчитывать циклы и задержки, и вы обычно заканчиваете реализацией некоторого подмножества протокола, который, как вы знаете, использует ваш конкретный мастер. Например, однажды мне пришлось спроектировать цифровой эквивалент старой аналоговой платы контроллера (им нужны были дополнительные функции, которые не могут быть разумно реализованы в аналоговом режиме, и они хотели что-то меньше, дешевле в производстве и более стабильно). Эта плата взаимодействовала с остальной частью системы через шину SPI. Старая аналоговая плата имела двухканальный ЦАП для установки контрольных значений и двухканальный АЦП для считывания измеренных значений. Реализовать обе эти функции в одном процессоре было непросто, и это включало выяснение того, какое подмножество аппаратного протокола D / A и A / D SPI фактически использовал существующий мастер. Это также включало процессор, который мог работать значительно быстрее, чем тактовая частота SPI. В конце я использовал три прерывания, одно для каждого выбора ведомого и одно для нарастающего фронта линии часов. Последнее должно быть прерыванием с наивысшим приоритетом в системе, иначе требование задержки не может быть выполнено.

Как бы то ни было, суть в том, что SPI master прошивки является простым, небольшим, быстрым и гибким, и нет никаких причин, чтобы избегать его. С другой стороны, для ведомого вам действительно нужно аппаратное обеспечение, или вы должны проснуться и очень тщательно подумать о времени, задержке и тому подобном.

Олин Латроп
источник
Нашли ли вы какие-либо подчиненные реализации микроконтроллера, которые могут вести себя как типичные аппаратные SPI-устройства (например, позволяя ведущему устройству в любой момент дать преимущество CS и читать состояние и использовать CS для обозначения границ команд? Большинство реализаций, которые я видел, этого не делают даже сообщить, был ли фронт CS между текущим байтом и предыдущим.
суперкат
@supe: Да, это проблема. Ведомое оборудование SPI обычно игнорирует тактовые и входные данные и поддерживает высокую выходную линию выходных данных, когда выбор микросхемы не подтвержден, но обычно не сообщает вам, где находятся границы выбора микросхемы. По крайней мере, с использованием оборудования PIC SPI, которое я помню, вам придется настроить собственное прерывание для выбора микросхемы для этого.
Олин Латроп
Мне было интересно, если вы знали о каких-либо приличных реализациях. Я думаю, нет. Проблема с использованием аппаратного прерывания на проводе выбора заключается в том, что если переход на проводе выбора происходит очень скоро после отправки байта, ведомому устройству может быть трудно решить, произошло ли это до или после рассматриваемого байта. Я нахожу удивительным, что почти каждая микросхема имеет подчиненную реализацию SPI, но кажется, что ни одна из них не может быть использована как обычное аппаратное ведомое устройство SPI. Ситуация в некоторой степени похожа на порт подчиненного процессора на PIC по сравнению с 8048.
Supercat
У подчиненного порта процессора 8048 есть адресный контакт; когда данные записываются извне в 8048, 8048 фиксирует состояние этого вывода и делает его доступным для своего кода (обычно первый байт команды записывается на один адрес, а параметры или данные - на другой). Чтение одного адреса даст то, что код 8048 помещает туда, но некоторые биты, считываемые с другого адреса, генерируются оборудованием 8048, чтобы указать, готов ли он для чтения или записи данных.
суперкат
+1 за то, что указал на разницу: бить мастера (легко) и раба (гораздо сложнее).
tcrosley
1

Это зависит от того, для чего вы делаете SPI. Если вы заинтересованы в получении максимальной скорости передачи данных, аппаратное обеспечение всегда быстрее, чем битбэнг (например, чип-корт-манипулятор в Teensy 3, я могу выдавать данные со скоростью 22 Мбит / с, используя аппаратную поддержку SPI, против ~ 4,5 Мбит / с с бит-бенгингом ( также может обрабатывать произвольное количество битов на передачу от 3 до 16 - полезно при отправке данных в 12-битных порциях для определенных светодиодных контроллеров!)). На 16 МГц avrs разница немного меньше, самая высокая скорость передачи данных с аппаратным обеспечением, кажется, высокая 4/5 Мбит / с, в то время как битрейгинг составляет около 2,3 Мбит / с.

Кроме того, если вы используете аппаратную поддержку, опять же, в зависимости от рассматриваемого микроконтроллера, у вас есть доступные варианты использования контроллеров DMA для перемещения ваших данных, позволяя вашему коду вернуться к другим, потенциально более интересным вещам, чем присмотр за данными. написать.

Все вышеперечисленное зависит от того, является ли аппаратный SPI вообще опцией.

RDG
источник
0

Если вы используете SPI, вы не можете использовать прерывание SSP для обработки связи. Это не так важно для SPI для многих целей

Скотт Сейдман
источник
1
Никакого конкретного процессора не было упомянуто, поэтому «прерывание SSP» в данном контексте является бессмысленным термином.
Олин Латроп