Является ли SPI значительно быстрее, чем бит-бэнг?

У меня есть проект, основанный на картинке 18f4550. Для записи в сдвиговый регистр 595 есть ли явное преимущество в использовании spi по сравнению с обычными контактами ввода-вывода? Я слышал, что spi быстрее, но я не уверен, как это сделать. Использует ли он другие, более быстрые часы, чем остальная часть чипа, или он просто более эффективен? Я могу передать байт через обычные контакты ввода-вывода за довольно небольшое количество инструкций. Использует ли spi меньше вычислительной мощности? Я буду довольно часто переключаться во время довольно интенсивных вычислений, поэтому я хочу, чтобы как можно больше циклов было посвящено моему процессу, а не выходило из него.

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

Вы можете сделать SPI с помощью битового удара.

Ответы (4)

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

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

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

Да это ^. Как упоминает Крис, самое большое преимущество использования аппаратных периферийных устройств заключается в том, что вы можете передать байт данных из потока на периферийное устройство и получить уведомление через прерывание, если оно закончило его перемещение и готово для следующего байта. Это освобождает использование вашего процессора для других целей, пока байт смещается, что может составлять время жизни в машинных циклах, учитывая скорость передачи этих последовательных протоколов.
Не всю жизнь для SPI. Если вы говорите о скорости, то вы вполне можете использовать SPI на частоте 10 МГц, что составляет всего 10 инструкций PIC на полной скорости. Это вряд ли возраст. Примерно достаточно времени, чтобы подготовить следующий байт. Едва хватает времени, чтобы обслужить прерывание.
Было бы справедливо сказать, что многое зависит от предполагаемой/требуемой скорости передачи данных, которая не была указана. Однако, как я уже отмечал, если микропроцессор является ведущим, он может свободно отправлять следующий байт с опозданием, при условии, что приложение может допустить неравномерность/снижение пропускной способности.
@Rocketmagnet, я исправляюсь. SPI намного быстрее, чем я думал - я думаю, я смешал его с более медленными последовательными протоколами, такими как UART (где 9600 бод - это ~ 10 кГц).
Также обратите внимание, что мастер SPI относительно легко взломать. Подчиненный SPI может быть несколько сложнее, так как выбор микросхемы и тактовые переходы должны быть специально синхронизированы и обработаны (например, вывод внешнего прерывания). Я часто использую стиль SPI master bit bang в своих проектах, особенно если мне не нужна высокая производительность, но нужна чистая плата (также подходит для домашнего травления). Также обратите внимание, что обычной практикой является обратное: сдвиг данных в регистры сдвига (HC595 и т. д.) с использованием SPI и GPIO (защелка).

Преимущества бит-бэнга:

  • Полный контроль над протоколом.
  • Если время выполнения инструкций на микроконтроллере быстрее, чем скорость передачи SPI, оно может быть быстрее, но это маловероятно. Потребуется очень-очень низкая скорость передачи SPI с относительно высокоскоростным микроконтроллером.
  • Может иметь меньшую задержку, чем прерывание SPI.
  • Выбор пинов.

Недостатки бит-бэнга:

  • Требуется гораздо больше кода для обработки -Время скорости передачи данных -Надежная выборка полученных битов -Обработка границ кадра *Каждый сегмент кода выше требует времени, которое можно было бы потратить на выполнение другого кода.

Преимущества СПИ:

  • Регистр конфигурации обрабатывает синхронизацию скорости передачи данных, выборку полученных битов и обработку счетчиков кадров.
  • Большинство микроконтроллеров с SPI имеют выделенный вектор прерывания для каждого периферийного устройства SPI (дважды проверьте свой микроконтроллер!)
  • После настройки нужно только проверить, пуст/заполнен ли буфер SPI TX/RX и записать/прочитать байт.
  • Если доступен DMA, SPI может передавать большие буферы непрерывных данных без вмешательства программного обеспечения.

Недостатки СПИ:

  • Дополнительное периферийное устройство для изучения и настройки (это действительно недостаток?)
  • Требуются дополнительные контакты или мультиплексирование контактов
  • Дополнительные затраты (как правило, незначительные для современных микроконтроллеров)
  • У меня были проблемы с шумом при использовании SPI, но они были на прототипах плат на относительно высоких скоростях (10 МГц).
  • Сильно ограниченный выбор контактов

Для меня преимущества бит-бэнга незначительны по сравнению с преимуществами SPI. Недостатков битового взрыва намного больше, чем у SPI. Основные три причины, по которым я могу выбрать бит-бэнг, это

  1. Пользовательский низкоскоростной протокол
  2. Если связь низкоскоростная, а у остальной части приложения низкие требования к вычислительным ресурсам.
  3. Или если скорость связи низкая и выбор пин-кода является серьезной проблемой

На PIC обычная реализация в стиле SPI с битовым взрывом занимает около пяти циклов на бит; немного поработав над частями 18Fxx, можно сократить это количество примерно до четырех (за счет примерно трех циклов на байт дополнительных служебных данных). Это время добавляется к любому времени, необходимому для выборки данных (обычно три цикла на байт). Итак, цифра около 40-43 циклов на байт. При использовании аппаратного SPI скорость повышается до двух циклов на бит плюс пара дополнительных циклов на байт (некоторые другие могут обрабатывать взаимные передачи, но PIC, которые я видел, не могут), и пока SPI отправляет байт процессор может выбрать следующий, обеспечивая общее время около 18 циклов на байт — выигрыш в скорости примерно в 2,5 раза.

Привет. Есть ли у вас учебник по высокоскоростному битбангу в сборке PIC? Я пытаюсь оптимизировать свою программу PIC, после некоторого головокружения я достиг скорости 5 циклов / бит (установите данные на ВЫСОКИЙ, тестовый бит и установите данные на НИЗКИЙ, в противном случае пропустите его, установите часы на НИЗКИЙ, установите часы на HIGH). Но было бы интересно посмотреть, как кто-то другой мог бы сделать это по-другому. Мне также интересно узнать о решении 4 цикла/бит на PICF18.
На большинстве PIC я бы обычно использовал подход с пятью циклами, который вы описываете. Есть два способа улучшить его до четырех в некоторых ситуациях: (1) либо вычислить байт, биты которого указывают, что бит отличается от предыдущего, а затем использовать либо "btfsc flipBits,_/btf DATA_PIN ", либо "btrsc flipBits , / xorwf DATA_PORT,f" [где W содержит правильную битовую маску]. В качестве альтернативы, можно сократить цикл, используя IORWF или ANDWF для одновременной установки вывода данных в известное состояние и перевода часов в режим ожидания.
Успех. Теперь я достиг 4 циклов/бит. Моя новая процедура: при инициализации загрузить битовую маску в W, загрузить байт в общую память, выбрать банк порта. Чтобы передать бит, ANDWF регистр порта и W, таким образом, и часы, и данные устанавливаются в НИЗКИЙ одновременно. Затем проверьте бит и либо пропустите его, либо установите данные на ВЫСОКИЙ уровень, наконец, установите часы на ВЫСОКИЙ уровень. Спасибо за подсказку, теперь это так быстро, как только может быть.

Для бита (BB) вы забыли упомянуть:

  1. Подгружает процессор на время связи. (SPI загружает регистры, а затем возвращает вам, чтобы вы сделали что-то еще)
  2. Фоновые прерывания могут серьезно мешать коду BB, что делает его полезным только в однопоточных проектах, помните, что код BB должен уделять 100% внимания работе с протоколом.