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

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

Зависит от того, насколько хорошо вы разбираетесь в битах. См. code.google.com/p/fastspi и waitforbigo.com :-)

Ответы (5)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Конкретный процессор не упоминался, поэтому термин «прерывание SSP» в данном контексте не имеет смысла.