Как стать автором
Обновить

Высокоскоростной SPI to Ethernet конвертер, при чем здесь DMA?

Уровень сложностиСредний
Время на прочтение13 мин
Количество просмотров4.9K
Всего голосов 11: ↑11 и ↓0+11
Комментарии34

Комментарии 34

"Конечно, в байте 8 бит, но SPI контроллер требует наличие паузы между посылками байтов.."

По-моему, в общем случае это не так. SPI - это сдвиговый регистр. Если у нас размер регистра SPI 32 бита, то как минимум 4 байта будут сдвинуты без дополнительных пауз. Обычно SPI имеет больше, чем один регистр, а в случае c DMA - это будет блок памяти. Т е паузы будут лишь между блоками.

Но если используем два буфера DMA (обычно это для звука) то пауз нет вообще.

Вообще, я осцилографом смотрел - паузы были,

потом я же привел ссылку на даташит процессора, там можно найти настройки SPI :

BITS: Bits Per Transfer

The BITS field determines the number of data bits transferred. Reserved values should not be used.

минимум: 0 8_BIT 8 bits for transfe

максимум: 8 16_BIT 16 bits for transfer

откуда вы взяли:

 Если у нас размер регистра SPI 32 бита, то как минимум 4 байта будут сдвинуты

совершенно не понятно. У меня выбрано

минимум: 0 8_BIT 8 bits for transfer

Я взял из своего опыта. ESP,Telink STM32.

Никогда не делал 1 байт по SPI в чем смысл тогда.

У Всех 32 битных микроконтроллеров регистры 32 бита.

Например вод данные у ESP8266 ( дешовый чип не ровня вашему)

Основной формат связи SPI ESP8266 - это команда + адрес + данные для чтения/записи, которые
являются,
• Команда: обязательна; длина: 1 ~ 16 бит; главный вывод и подчиненный ввод (MOSI).
• Адрес: необязательно; длина: 0 ~ 32 бита; главный выход и подчиненный вход (MOSI).
• Чтение/запись данных: необязательно; длина: 0 ~ 512 бит (64 байта); главный вывод и подчиненный
ввод (MOSI) или главный ввод и подчиненный вывод (MISO).

Ну у Вашего возможно и меньше.

---------------------------

Относительно задержки в Вашем процессоре.

Если я правильно понял документацию то она делается в следующих случаях:

40.7.3.4 Задержки при передаче.
На рисунке 40-9 показано изменение выбора микросхемы при передаче и последовательные передачи на одном и том же выборе микросхемы.
Для изменения формы сигнала при передаче можно запрограммировать три задержки:
 Задержка между выборками микросхемы — программируется только один раз для всех выборок микросхемы путем записи поля DLYBCS в
SPI_MR. Задержка деактивации подчиненного устройства SPI управляется с помощью DLYBCS. Если
к ведущему устройству подключено только одно ведомое устройство SPI, поле DLYBCS настраивать не нужно. Если несколько ведомых устройств
устройства подключены к ведущему устройству, DLYBCS должны быть настроены в зависимости от максимальной
задержки отключения. Обратитесь к разделу 56.13.1.5 и разделу 56.14.1.5.
 Задержка перед SPCK — независимо программируется для каждого выбранного чипа путем ввода поля DLYBS. Задержка
активации подчиненного устройства SPI управляется с помощью DLYBS. Обратитесь к разделу 56.13.1.5 и разделу 56.14.1.5,
чтобы определить DLYBS.
 Задержка между последовательными передачами — независимо программируется для каждого выбранного чипа путем ввода
поля DLYBCT. Время, необходимое подчиненному устройству SPI для обработки полученных данных, управляется с помощью
DLYBCT. Это время зависит от активности подчиненной системы SPI

-------------------

Т е это связано с устройствами на которые передается, а не с байтами данных.

Это уже как вы реализуете! Но по DMA SPI обычно работает непрерывно. Т. е. между байтами может паузы и не быть вовсе. А вот если работать с прерываниями, то там непрерывный обмен (пауза между байтами) реализовать сложно. И обрабатывать через прерывания непрерывный поток не получится - нужна пауза. Вообще на SPI при скорости от 1Мб и выше, прерывания - плохая идея. Но еще раз повторю, непрерывный поток битов по SPI (без пауз между байтами) - явление нормальное. Поэтому выбор DMA - правильная идея.

Если сдвиговый регистр буферизован (а часто именно так) и частота ядра позволяет успевать обработать прерывание за время передачи сдвигового регистра, то можно и без пауз. На 300 МГц ядре при 12 тактах на прерывание SPI на 20 МГц даже по прерыванию будет без пауз. просто ядро будет вечнозанятое.

"просто ядро будет вечнозанятое " - Ты должен был бороться с загрузкой Ядра, а не возглавить его.

300МГц...

вечнозанятое ядро это когда на каком-то мелком МК без дма был приём данных в режиме spislave как раз на частоте ядра (у некоторых МК клоки ядра и периферии совсем развязаны), так там тех самых 8 тактов на байт хватило впритык только на бесконечный цикл while(1) *buf++ = SPIDR; выходить из которого пришлось по прерыванию от таймера, в котором руками подправлялся адрес возврата на стэке, чтобы вернуться за пределы цикла.

"Чтобы обеспечить такую частоту сигнала синхронизации SPI нам нужен процессор, у которого тактовая частота была бы еще в 3 (три, минимум!) раза больше, чем частота тактов SPI"

По-моему это далеко не так.

Например, ESP8266 тактовая частота процессора аж 80 МГц, а частота SPI всего 10MГц.

Если надо SPI 20 MГц, то надо искать процессор с SPI на 20 МГц. На частоту процессора вообще смотреть при данном поиске нет смысла.

У автора

SPI нам нужен процессор, у которого тактовая частота была бы еще в 3 (три, минимум!) раза больше, чем частота тактов SPI

лажа написана (а о 3 чтениях - это ближе к USART). Типично - это частота генератора, деленная на 2 (у некоторых на 4). Другое дело, - какая частота доходит до модуля SPI (это по поводу ESP8266, у других контроллеров/SOC может быть по другому).

Если надо SPI 20 MГц, то надо искать процессор с SPI на 20 МГц. На частоту процессора вообще смотреть при данном поиске нет смысла.

Еще и как смотреть. Поток то надо обработать. Есть контроллеры с 20 МГц SPI и с 40МГц ядром, - так они не успеют просто....

У ESP есть канал SPI который работает с флеш. Его частота 80 МГц, равная частоте процессора.

SPI это сдвиговый регистр, какой поток надо обрабатывать при сдвиге данных?

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

Это вообще не по теме. Вы же не форму импульсов канала SPI исследуете.

"Нам надо принимать данные с последовательного синхронного порта SPI и отправлять эти данные в Ethernet порт, а точнее в один из открытых TCP/IP сокетов"

Ту у вас путаница. Ethernet порт - это физическая линия

"Протоколы Ethernet работают на физическом уровне модели OSI, предоставляя средства для передачи данных между устройствами. " https://ru.wikipedia.org/wiki/Ethernet

а TCP/IP сокет - логическая.

"Сетевой сокет - это программная структура внутри сетевого узла компьютерной сети, которая служит конечной точкой для отправки и получения данных по сети. Структура и свойства сокета определяются интерфейсом прикладного программирования (API) для сетевой архитектуры. "

https://en.wikipedia.org/wiki/Network_socket#Stream_socket

Две большие разницы. Очевидно Вы используете второе, тогда первое вообще не по теме.

вы считаете логическая линия может существовать в отсутствии физической? Телепатическая связь между микросхемами?

физически это может быть WiFi а не Ethernet-port.

А сокет будет все тот же.

но у меня то был и есть:

38. Ethernet MAC (GMAC)

The Ethernet MAC (GMAC) module implements a 10/100 Mbps Ethernet MAC compatible with the IEEE 802.3 standard. ...

38. - это номер раздела все из того же Даташит.

Так мой вопрос был о том, куда вы все таки выводили в ethernet порт или в сокет?

Если в сокет, то для вас разницы никакой, что у вас было.

так в LWIP сокет который подняли над этим Ethernet MAC (GMAC),

просто мне пришлось внутрь LWIP тоже лазить (он же в исходниках), в код который управляет непосредственно этим Ethernet MAC (GMAC), там какое-то ограничение было странное на размер отправляемых пакетов - пришлось найти и обезвредить.

Теперь понятно.

Вариант взять в качестве конвертера готовый W5500 не рассматривался?

Я точно, конечно, не помню, но вполне возможно что рассматривал.

Я разные варианты тогда смотрел, такого который мог передавать 2 Мега-байта в секунду не было и сейчас нет.

Достаточно посмотреть максимальную тактовую частоту системы, частота SPI (и значит бит рейт) будет примерно в 4 раза меньше в самом лучшем случае, но должна быть еще меньше на практике, а чтобы получить байт рейт надо еще на 8 делить как минимум.

Ну по даташиту у W5500 скорость SPI до 80 МБит/c. Там конечно протокол получится посложнее, придется на куски пакеты разбивать, но по-моему 2 мегабайта в секунду вполне реально обеспечить. Будет время попробую померять.

но там странно как-то написано в ПДФ-ке, действительно:

FSCK SCK Clock Frequency = 80/33.34 MHz

типа от 33 до 80, но также написано:

Even though theoretical design speed is 80MHz,

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

только как говорится: "Кто ж ему даст?"

если тактовая частота всего устройства:

5.5.3 Crystal Characteristics

Frequency 25 MHz

Откуда он 80 МГц возьмет?

Там вот такие вопросы практического плана возникают,

Потом у них, там свой протокол работы с устройством, а у нас свой протокол прописан документацией, они не вполне совместимы, так это еще и выяснять надо, это риск.

Но самое главное: у меня выбора не было - мне дали уже сделанную железку-модуль, программатор, переходную плату, среда разработки (тогда еще Атмеловская студия была), у меня задача софт писать.

Будет время попробую померять.

если получится, мне бы было очень интересно!

Если можно я бы даже осциллограммы посмотрел!

 "циркулярный буфер"

может лучше сказать "циклический буфер"  

Для получения отладочных данных имхо проще было бы целевое устройство spi слэйвом сделать и через ft232h по усб с него данные забирать.

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

специально зашифровано название проца этого ведь?

да я просто старался не акцентировать внимание на конкретный проц, чтобы исключить подозрения в рекламе. даташит есть.

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

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

В соседнем топике - ссылки и цены на paduk. я то думал - чтобы злая американская фирма не удивилась как это мы до сих качаем даташиты и где то используем. Стоит на их сайте географическая заглушка "Access Denied. You don't have permission to access "http://www.microchip.com/" on this server." Можно смело давать ссылку, это скорее антирекллама будет :)

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

очень крупные такие детали.

по моему опыту разница в том что где-то деталей и, соответственно, функциональности больше, а где то меньше.

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

  Wait(Conf.EnabledInteruptSignal);
  *Conf.DstPtr = *Conf.SrcPtr;
  Conf.DstPtr += Conf.IncrementDst;
  Conf.SrcPtr += Conf.IncrementSrc;

Интересная статья. Спасибо.

Хотя автор пишет без полного понимания управления на уровне аппаратных регистров, и сам в этом признается:

Как оказалось, помимо регистров, DMA имеет еще и структуры-настройки. Честно сказать, очень долго вникал в принцип работы с этими структурами. Ранее, во времена STM32, я пользовался готовой библиотекой

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

Я конечно уже совсем не помню как там настраивается DMA в STM, а тем более в К1986ВЕ92QI, нужно вспоминать со справочником (то есть с ДатаШитом, с пдф-кой)

но функция бесконечной передачи (например) там должна быть реализована, по крайней мере в STM, а это значит что автору не хватило опыта или каких-то базовых знаний чтобы понять как правильно решить проблему с:

то нужно настроить его структуру заново ...

после всех передач — нужно восстановить изначальное значение для передачи синусоиды повторно.

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

Эта задача должна решаться правильной настройкой структур DMA по крайней мере я бы попытался это сделать.

А вообще кейс из той статьи достаточно сильно, можно даже сказать принципиально отличается от моего тем что задействовано третье устройство для синхронизации передачи - таймер (1-е сам DMA, 2-е устройство DAC - надо считать регистры каких модулей участвуют в конфигурации).

У меня 1-е сам DMA, 2-е SPI, потом у меня одновременно 2 канала создаются, правда в статье об этом мельком упоминается.

В общем тут до фига можно написать еще, как видите, не знаю кому это интересно.

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

вопрос выравнивания адреса этих структур это уже - нечто другое

скорее всего необходимость выравнивания адреса там нужна, потому что это ранняя версия архтектуры ARM, там Теги: cortex-m3

а у меня cortex-m7. Теперь когда вы обратили внимание на это выравнивание, я вспомнил то, что знаю с 2001 года где-то - мы тогда боролись с ексепшенами при не выравненных обращениях к int-ам на ARM-ах.

То есть, если я прав про выравнивание, это проблема не с DMA, а с фундаментальными знаниями об ARM-архитектуре и истории ее развития.

Вот такие бывают "тайные знания", их там действительно не мало!

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории