Чип-к-чип протокол связи через SPI

Я пытаюсь разработать эффективный протокол связи между микроконтроллером с одной стороны и процессором ARM на многоядерном чипе TI с другой стороны через SPI.

Требования к необходимому протоколу:

1 - Мультисессия с поддержкой очередей, так как у меня есть несколько потоков отправки / получения, поэтому будет более одного приложения, использующего этот протокол связи, и мне нужен протокол для обработки этих запросов в очереди (я буду держать буфер, если передача это очередь, но мне просто нужен протокол для управления планированием очередей).

2 - Работает через SPI в качестве основного протокола.

3 - Простая проверка ошибок.

В этой теме: "Простой последовательный протокол связи точка-точка ", PPP был рекомендуемым вариантом, однако я вижу, что PPP выполняет только часть работы.

Я также нашел проект Lightweight IP (LwIP), в котором используется PPP через последовательный порт (который, как я предполагаю, я могу использовать через SPI), поэтому я подумал о возможности использования любого из протоколов верхнего уровня, такого как TCP / UDP, для выполнения остальной части требуемые рабочие места. К счастью, я обнаружил, что TI включает LwIP как часть своего программного обеспечения Ethernet в стартовом пакете программного обеспечения, которое, как я полагаю, облегчит перенос, по крайней мере, на стороне чипа TI.

Итак, мои вопросы:

1 - Допустимо ли использовать LwIP для этой схемы связи? Не приведет ли это к большим накладным расходам из-за заголовков IP, которые не нужны для связи точка-точка (на уровне микросхемы), и не снизит пропускную способность?

2 - Будет ли TCP или любой аналогичный протокол, находящийся в LwIP, обрабатывать очередь запросов на передачу, например, если я запрашиваю передачу через сокет, в то время как канал связи занят передачей / получением запроса для другого сокета (сеанса) другого потока, будет ли это управляться стеком протоколов? Если да, то какой уровень протокола управляет им?

3. Является ли их стек более эффективным протоколом, чем LwIP, который соответствует указанным выше требованиям?

Обновление 1. Дополнительные моменты для рассмотрения

1 - SPI - единственный доступный вариант, я использую его с доступными GPIO, чтобы указать мастеру, когда у ведомого есть данные для отправки.

2 - Текущий реализованный (нестандартный) протокол использует DMA с SPI и формат сообщения 《STX_MsgID_length_payload_ETX》 с фиксированной длиной фрагментов сообщения, однако основным недостатком текущей схемы является то, что мастер ожидает ответа на сообщение. (не фрагмент) перед отправкой другого, что снижает пропускную способность и не использует полнодуплексный характер SPI.

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

4- Какие протоколы более высокого уровня могут обычно использоваться выше SPI для установления нескольких сеансов и решения очереди / планирования сообщений?

Обновление 2: еще одна полезная ветка: Хороший протокол / стек последовательной связи для встроенных устройств? "

Обновление 3: Я взглянул на протокол Modbus, кажется, он определяет уровень приложения, а затем непосредственно уровень канала данных для последовательной связи, что звучит так, чтобы пропустить ненужные накладные расходы слоев сетевых протоколов.

Как вы думаете, это будет лучший вариант, чем LwIP по назначению? Кроме того, существует ли широко используемая реализация с открытым исходным кодом, такая как LwIP, но для Modbus?


person Wessam    schedule 24.09.2013    source источник
comment
spi - это главный подчиненный сервер, а не двунаправленный. Если вы хотите использовать lwip или какой-либо другой протокол, вы, вероятно, захотите использовать serial / uart, а не spi. lwip будет иметь много накладных расходов, вместо этого вы, вероятно, могли бы просто заняться своими делами.   -  person old_timer    schedule 24.09.2013
comment
@dwelch - USB также является ведущим / ведомым, но это легко решается периодическим опросом ведомых устройств.   -  person Chris Stratton    schedule 24.09.2013
comment
К сожалению, SPI - это доступный вариант, я уже использую его вместе с другим GPIO, чтобы указать мастеру, когда данные доступны на ведомом.   -  person Wessam    schedule 25.09.2013
comment
Крис, понимает, но также понимает, что usb был разработан для этого, и большая часть опросов встроена в оборудование, а не обязательно то, что программное обеспечение должно постоянно делать.   -  person old_timer    schedule 25.09.2013
comment
Конечно, выполнение опроса в программном обеспечении - это небольшая неэффективность, но похоже, что в OP все равно реализован аппаратный сигнал внимания, так что это не будет проблемой.   -  person Chris Stratton    schedule 25.09.2013


Ответы (2)


Я думаю, что, возможно, вы слишком многого ожидаете от скромного SPI.

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

PPP полезен при установлении соединения между двумя произвольными конечными точками, когда конечные точки фиксированы и известны a priori, PPP не будет служить никакой другой цели, кроме как излишне усложнять вещи.

SPI не очень сложный и не гибкий интерфейс и, вероятно, не подходит для тяжелых протоколов общего назначения, таких как TCP / IP. Поскольку «адресация» на SPI выполняется путем физического выбора микросхемы, адресация, присущая таким протоколам, не имеет смысла.

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

В любом случае я предлагаю вам разработать что-то конкретное для вашей цели. Поскольку SPI не является сетью как таковой, вам нужно только средство для адресации потоков на выбранном узле. Это может быть просто STX<thread ID><length><payload>ETX.

Добавлено 27 сентября 2013 г. в ответ на комментарии. Обычно SPI, как следует из названия, используется для подключения к периферийным устройствам, и в этом контексте протокол определяется периферийным устройством. EEPROMS, например, обычно используют общий или, по крайней мере, совместимый командный интерфейс от поставщиков, а интерфейс SPI карты SD / MMC использует стандартизированный тест команд и протокол.

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

Я бы посоветовал вам, если вы хотите использовать общий сетевой стек, абстрагироваться от SPI с драйверами устройств на каждом конце, которые предоставляют SPI стандартный интерфейс потока ввода-вывода (open (), close (), read (), write () и т. д.), то вы можете использовать протоколы PPP и TCP / IP более высокого уровня (хотя PPP, вероятно, можно избежать, поскольку соединение является постоянным). Однако это было бы привлекательно только в том случае, если оба узла уже поддерживали эти протоколы (например, под управлением Linux), в противном случае это потребует значительных усилий и кода с небольшой выгодой и, конечно же, не будет «эффективным».

person Clifford    schedule 24.09.2013
comment
Большинство из этих моментов (кроме, возможно, максимальной пропускной способности) также применимы к USB, но считается вполне разумным запускать сетевые протоколы через USB к внешним сетевым адаптерам, и это было даже в эпоху USB 12 МБ / с, с которой, вероятно, может соответствовать SPI. с умеренной осторожностью. На самом деле нет причин, по которым одни и те же методы решения, такие как ведущий, периодически опрашивающий ведомые устройства, не могли бы использоваться с SPI. - person Chris Stratton; 24.09.2013
comment
@ChrisStratton: Верно, но вряд ли стоит затраченных усилий (по крайней мере, для описанного приложения). USB намного сложнее, чем SPI, и определяет оборудование, межсоединения, программные стеки и профили устройств. SPI не определяет ничего из этого, а контроллеры SPI гораздо более примитивны, на самом деле вы можете реализовать SPI с помощью GPIO и программного обеспечения. Расплата с USB - возможность подключения к сторонним устройствам; с SPI сторонние устройства, такие как карты SD / MMC и EEPROM, используют гораздо более простые протоколы. - person Clifford; 25.09.2013
comment
Вы также можете реализовать USB с GPIO. Дело в том, что если SPI - это то, что доступно, его можно заставить работать - вас беспокоит неэффективность, а не препятствия. - person Chris Stratton; 25.09.2013
comment
Спасибо за ваш ответ и комментарии, вы имеете в виду, что ppp выполняет работу, которая уже выполняется spi, поскольку соединение уже установлено? Пожалуйста, обратитесь к отредактированному вопросу, чтобы узнать о некоторых дополнительных моментах, связанных с вашим ответом. - person Wessam; 25.09.2013
comment
@ChrisStratton: Я никогда не слышал, чтобы кто-нибудь реализовывал побитовый USB-порт, и был бы удивлен, если бы он был успешным или даже совместимым с USB-IF. Битовый SPI является обычным явлением. - person Clifford; 25.09.2013
comment
@Wessam: Я говорю, что PPP выполняет работу, которая не имеет отношения к фиксированному / постоянному между известными и никогда не меняющимися устройствами. SPI не обрабатывает установление соединения, потому что соединение всегда есть. - person Clifford; 25.09.2013
comment
Битовый USB-порт (как правило, ведомая сторона) довольно часто используется на моделях серии attiny и atmega без настоящего USB-интерфейса. По сравнению с этим, запустить протокол более высокого уровня через аппаратный SPI просто. - person Chris Stratton; 25.09.2013
comment
@Clifford: Да, я понял, так какие стандартные протоколы более высокого уровня обычно используются через spi? - person Wessam; 26.09.2013
comment
@Wessam: Мой комментарий был слишком длинным, поэтому я добавил к ответу. - person Clifford; 27.09.2013
comment
@Clifford: Спасибо за последнее добавление, пожалуйста, проверьте обновление 3 в вопросе. - person Wessam; 27.09.2013

Я предполагаю, что вы действительно не хотите или не имеете места для полного стека ip (lwip) на микроконтроллере? Это просто звучит как перебор. Почему бы просто не свернуть свою собственную простую структуру пакетов, чтобы переместить элементы данных, которые вам нужно переместить. В зависимости от того, как spi поддерживается с обеих сторон, вы можете или не сможете использовать его для определения кадра для ваших данных, если бы не простой шаблон начала, длина и конечная контрольная сумма и, возможно, шаблон хвоста было бы достаточно для поиска границ пакетов в поток (не отличается от решения для последовательного порта / uart). Вы даже можете использовать для этого решение PPP с шаблоном начала, и я думаю, что шаблон конца с полезной нагрузкой использует двухбайтовый шаблон всякий раз, когда шаблон начала появляется в данных. Я сейчас не помню всех подробностей.

Каким бы ни был ваш фрейм, добавьте тип пакета и ваши рукопожатия, или, если данные будут просто микроконтроллером для активации, вам даже не нужно этого делать.

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

Я не могу представить, что lwip управляет вашими очередями за вас. Я предполагаю, что вам нужно будет сделать это самостоятельно. различные очереди могут захотеть поговорить с одним драйвером, который имеет дело с одной шиной spi (при условии, что существует одна шина spi с выбором нескольких микросхем). Это также зависит от того, как вы используете интерфейс spi, если вы позволяете руке разговаривать с несколькими микроконтроллерами, и пакеты данных разбиваются на немного от этого контроллера, немного от этого контроллера, так что никому не нужно ждать, чтобы задолго до того, как они получат еще несколько байтов данных. Или весь фрейм должен переместиться с одного микроконтроллера, прежде чем перейти к следующему прерыванию gpio, чтобы вытащить данные этих парней? Короче говоря, я предполагаю, что вам нужно управлять общим ресурсом так же, как и в любой другой ситуации, когда у вас есть несколько пользователей общего ресурса (rtos, полноценная операционная система и т. Д.). Я вообще не помню lwip, но с полнофункциональным интерфейсом приложений сокетов Berkeley пользователь мог писать отдельные приложения, где каждое приложение заботилось только об одном TCP или UDP-порту, а библиотеки и драйверы управляли разделением этих пакетов для каждого приложения, а также все правила для стека IP.

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

person old_timer    schedule 25.09.2013
comment
Спасибо за подробный ответ, на самом деле текущая реализованная схема, упомянутая в пункте 2, уже отлично работает с недостатком полудуплекса и блокировки при ответе на одно сообщение. Вот почему я ищу стандартный стек, который обычно используется поверх SPI, даже чтобы реализовать его стандартным образом, а не заново перепроектировать с возможными внесенными недостатками. - person Wessam; 26.09.2013