забирать поток данных 1 бит по DMA

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
SIM31
Это не хвост, это антенна
Сообщения: 1363
Зарегистрирован: Чт апр 04, 2013 22:22:57
Откуда: Белгород, РФ

забирать поток данных 1 бит по DMA

Сообщение SIM31 »

Думаю вот, можно ли быстро забирать поток данных с какой-либо ноги микроконтроллера, проект типа логического анализатора. Частота входного сигнала например 15 МГц, или бит/с. Все остальные ноги не нужны, только 1 бит со всего порта.

Понятно что можно на ПЛИС сделать преобразование данные в 1 бит->32 бит, как сдвиговый регистр, и параллельно загружать в контроллер, там получится 0.46 МГц, можно и программно обрабатывать, по прерыванию.

Интересны возможности МК в этом плане.

1. Может ли DMA работать с битовым потоком. Вроде как нет, есть что-то для захвата цифровых видеопотоков, но там весь порт задействован и специфический формат.

2. По таймеру как часто может МК захватывать 1 бит? Вроде как там несколько операций:

Код: Выделить всё

считали данные порта
выделили 1 бит (младший)
записали его младшим в регистр (предварительно сместив влево)
если он 32й по счету перекинули регистр в память
вроде как 4 такта, плюс десяток на вход по прерыванию от таймера. Ну или можно без таймера забирать данные с порта пока не кончится память, далее данные обработать на компе.
При частоте
STM32F103 на 72МГц / 14 = 5 МГц на глазок частота опроса порта, для STM32F4 с его 192МГц уже 13 МГц, вроде нормально.

3. SPI, на борту МК всех почти есть и так сдвиговый регистр, нужно только обеспечить линию Serial Clock внешнюю, на входе будет сразу готовые 8-16 бит, которые можно забирать по DMA. Вроде даже некоторые МК позволяют аппаратно выдавать заданную частоту на некоторые ноги. Или использовать свой SPI в режиме мастера. До 20 МГц некоторые работают, есть упоминания.
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: забирать поток данных 1 бит по DMA

Сообщение КРАМ »

Причем тут вообще ДМА? ДМА работает не с портами, а с ВНУТРЕННЕЙ ШИНОЙ контроллера. Иногда с общей шиной. а иногда с выделенной - зависит от архитектуры. Задача и ЕДИНСТВЕННАЯ ФУНКЦИЯ ДМА - передача данных по внутренней шине от одного устройства на этой шине к другому, МИНУЯ центральный процессор.
Прием с асинхронной шины - это не просто сдвиг, а специальный детектор приходящей последовательности, который представляет из себя специальный регистр с утроенной (как правило) частотой тактирования и анализом полученной сигнатуры с целью определения собственно данных.Это и есть приемник УАРТ.
Прием синхронного потока осуществляется обычным модулем SPI.
Реклама
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: забирать поток данных 1 бит по DMA

Сообщение B@R5uk »

SIM31, в некоторых STM32-микроконтроллерах есть область памяти, которая является битовым массивом. Обращаться к ней можно как к байтам, но задействован в каждом из них только младший бит. Каждые 8 байт этого битового массива являются зеркалом 8 бит одного байта в оперативной памяти. Возможно, с помощью DMA получится слать байт с GPIO в этот битовый массив, при этом будет сохраняться только нулевой бит, причём реально в оперативке будет заполняться один бит за каждую посылку.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: забирать поток данных 1 бит по DMA

Сообщение КРАМ »

При работе ДМА в режиме М2М происходит автоматический декремент адреса как у Source, так и у Destination. Поэтому "размножать" данные с одного адреса на множество других не выйдет.
В режиме Р2М или М2Р регистры порта не имеют bit-banding доступа. И вообще порты не могут синхронизировать транзакции, а значит потребуется таймер для тактирования. И зачем тогда весь этот геморрой? С таким же успехом можно тактировать собственный SPI ...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: забирать поток данных 1 бит по DMA

Сообщение B@R5uk »

КРАМ, вы видимо не поняли, в чём заключается моё предложение.
КРАМ писал(а):С таким же успехом можно тактировать собственный SPI
Можно, не спорю.
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: забирать поток данных 1 бит по DMA

Сообщение КРАМ »

B@R5uk писал(а):КРАМ, вы видимо не поняли, в чём заключается моё предложение.
Из Вашего предложения по bit-banding следовал только один вывод. Источником данных является битовое "зеркало" порта в ОЗУ (один разряд-пин).
Приемником - битовое "зеркало" массива принятых данных. Так как в адресе "зеркала" младшие 4 разряда - это номер бита, то линейная развертка адреса в ДМА даст и линейное побитовое заполнение ОЗУ. Но только если по источнику не будет автодекремента.
Реклама
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: забирать поток данных 1 бит по DMA

Сообщение B@R5uk »

И да, я тут вспомнил, что в STM32 нет понятия порта ввода-вывода, в отличие от, например, AVR, Z80 или 8086. Там всё в оперативке в одном адресном пространстве находится. Так что Ваши замечания, КРАМ, возможно, и имеют смысл, но на другой платформе.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: забирать поток данных 1 бит по DMA

Сообщение КРАМ »

Нахождение в одном адресном пространстве еще не означает одинакового доступа. Аппаратно периферия может быть расположена на шинах так, что при определенных условиях проведения транзакций оная периферия будет недоступна системе.
Но ПО СУЩЕСТВУ вопроса Вы совершенно правы. Я не слишком много работаю с СТМ32 и потому еще не привык к ряду особенностей изложения материала в даташитах.
Разговор с Вами сподвиг меня разобраться в очередном вопросе. За что Вам спасибо.
Таким образом, режим ДМА Mem2Mem по сути означает лишь одно - запуск транзакций ведется не от внешнего источника (периферии), а от системной частоты.
А названия периферия и память почему то заменили традиционные Source и Destination, внося совершеннейшую неразбериху. Периферия там вообще не причем.
Так что взглянув на это дело под другим углом, я разобрался в функционале ДМА.
Еще раз спасибо.
:beer:
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: забирать поток данных 1 бит по DMA

Сообщение B@R5uk »

Всегда пожалуйста! :music:
КРАМ писал(а):...А названия периферия и память почему то заменили традиционные Source и Destination...
Я же говорю, там нет разделения на регистры периферии, ПЗУ, ОЗУ и прочее, всё не только находится в одном адресном пространстве, но доступ ядра МК и блока DMA ко всему унифицирован и производится через одну и ту же шиновую матрицу, как изображено на этой схеме:

Изображение

После знакомства таким подходом лично мне кажутся смешными те искусственные проблемы со страничной адресацией невменяемого для 8-мибитной системы памятью и с недостатком регистров ввода-вывода, которые возникают у старших микроконтроллеров PIC и AVR.
Вложения
stm32f103xx_func_diag.gif
(17.96 КБ) 1041 скачивание
Galizin
Мучитель микросхем
Сообщения: 478
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: забирать поток данных 1 бит по DMA

Сообщение Galizin »

bit-banding не будет работать с dma. bit-banding делает процессор, а dma идет в обход процессора. Где то на эту тему было обсуждение.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: забирать поток данных 1 бит по DMA

Сообщение КРАМ »

B@R5uk писал(а):доступ ядра МК и блока DMA ко всему унифицирован и производится через одну и ту же шиновую матрицу, как изображено на этой схеме:
Дело как раз в Bus Matrix.
И состоит оно в том, что ОЗУ сидит непосредственно на этой матрице, а периферия через вторичные шины.
Именно это и создает разные возможности доступа к ОЗУ и периферии. даже тактирование в шинах различное.
Вот и с бит-бэндинг все таки вылезли проблемы.
Собственно мы и не можем однозначно утверждать через какой канал мы получаем доступ к ресурсу. Вроде бы ОЗУ, ан нет... :dont_know:
B@R5uk писал(а):искусственные проблемы со страничной адресацией невменяемого для 8-мибитной системы памятью и с недостатком регистров ввода-вывода, которые возникают у старших микроконтроллеров PIC и AVR.
У "старших" ПИКов нет никакой страничной адресации, проблем с портами и с доступом к ним. У них даже бит-бэндинг не требуется и атомарный доступ к порту обеспечен непосредственно, без специальных регистров сброса и установки. И вообще они 16-разрядные.
:)
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: забирать поток данных 1 бит по DMA

Сообщение B@R5uk »

Galizin писал(а):Где то на эту тему было обсуждение.
А что тут обсуждать, если это действительно так, то это должно быть оговорено в мануале. Номер странички не скажите?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: забирать поток данных 1 бит по DMA

Сообщение КРАМ »

B@R5uk писал(а):Номер странички не скажите?
Не скажет.

PM0024 Programming Manual Cortex-M4 стр.31

Изображение

Фактически сие означает, что по корневому вопросу я все таки оказался прав. :dont_know:
Да и как может осуществляться битовый доступ к памяти (включая периферию), которая имеет БАЙТНУЮ организацию? А весь механизм бит-бэндинга находится в ядре.
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: забирать поток данных 1 бит по DMA

Сообщение B@R5uk »

А где написано, что именно процессор занимается бит-бэндингом? Из приведённой вами таблички это ещё не следует, впрочем, как и обратное.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: забирать поток данных 1 бит по DMA

Сообщение КРАМ »

Из приведенной таблички следует, что запись в bit banding происходит по процедуре RMW.
Возникает резонный вопрос: если это доступ к биту, то зачем читать и что там модифицировать?
Процедура RMW как раз и существует из-за невозможности получить НЕПОСРЕДСТВЕННЫЙ атомарный доступ к регистру памяти.
Поэтому читается ВСЕ СЛОВО, затем модифицируется ОДИН БИТ, и в завершение записывается ВСЕ СЛОВО.
Что бы получить атомарный доступ непосредственно в памяти, нужно иметь ОДНОБИТНУЮ АДРЕСАЦИЮ ШИНЫ. То есть КАЖДОЕ УСТРОЙСТВО на шине должно иметь полный дешифратор на КАЖДЫЙ РАЗРЯД своих данных.
Сам принцип прямого доступа к памяти (DMA) полностью исключает какую либо модификацию данных за неимением регистров на которых такая модификация может происходить. Данные передаются as is.
PS. На той же странице мануала внизу:
Bit band accesses can use byte, halfword, or word transfers.
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: забирать поток данных 1 бит по DMA

Сообщение B@R5uk »

Нет не убедили. Вы пытаетесь найти логическое обоснования своему мнению. Это не тот путь, который работает в проектировании с использованием готовых документированных компонентов. В качестве объективного доказательства своего мнения на счёт работы МК вы должны привести отрывок документации производителя, в котором чёрным по белому написано, какой блок ответственен за bit-banding и какие блоки имеют или не имеют доступ к этому ресурсу. Чтение между строк и гадание на кофейной гуще не приводит ни к чему хорошему, кроме флуда. То же самое касается и меня, но я пока не нашёл внятного подтверждения ни моего, ни вашего мнения.

Вот в этом документе утверждается, что компонент System Bus ответственен за битовое связывание, чем бы этот компонент не был, но не понятно, имеет ли этот компонент связь с DMA. Там же далее написано, что ядро МК может быть принуждено простаивать, если операция связывания битов УЖЕ выполняется. Однако не понятно, каким устройством может быть инициализирована предыдущая операция: самим процессором, либо же каким-то ещё устройством.

Так что лично для меня вопрос открыт.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25291
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: забирать поток данных 1 бит по DMA

Сообщение КРАМ »

Ну все это конечно разговоры. Однако есть ПРАКТИКА.
И эта практика 3 минуты назад нам показала, что при записи из массива с 0xFFFF по адресу 0x22000000 посредством ДМА никакой перезаписи не произошло (в отличии от транзакции в 0х20000000, которая привела к логичным единицам в младших разрядах 16 адресов, начиная с 0х22000000), а при ПРОГРАММНОЙ записи в тот же регистр появилась единица в младшем разряде 0х20000000.
Так что ПРАКТИКА подтвердила мои выводы.
ЗЫ. Контроллер STM32F303 на плате Дискавери.
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: забирать поток данных 1 бит по DMA

Сообщение B@R5uk »

ОК, жаль, конечно, что не работает, будет считать вопрос закрыт.
Ответить

Вернуться в «ARM»