Комментарии 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МГц ядром, - так они не успеют просто....
"Отступление для тех, кто знает и помнит про теорему Котельникова-Найквиста, нам не нужно исследовать какую-нибудь форму сигнала, нам надо в течение каждого периода тактовой частоты импульсов синхронизации 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-архитектуре и истории ее развития.
Вот такие бывают "тайные знания", их там действительно не мало!
Высокоскоростной SPI to Ethernet конвертер, при чем здесь DMA?