Jump to content
parovoZZ

Философия аппаратного SPI - чем занять МК?

Recommended Posts

Только что, ARV сказал:

Синхронизация обновления значения в регистре требуется далеко не всегда.

Действительно не убирается :) !!! синхронизация с чем???

Share this post


Link to post
Share on other sites
1 минуту назад, ARV сказал:

Я вас не понимаю

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

но это совсем сложно, не заморачивайтесь :)

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

Просто я понял так, что вы считаете, что без синхронизации с моментом обновления регистра читать из него при помощи DMA и складывать в память бессмысленно... И потому возразил: смысл есть. Но понять вас, профессионалов, и вправду не всегда просто :)

Share this post


Link to post
Share on other sites
3 часа назад, my504 сказал:

В случае непрерывного перезапуск не требуется.

Я уже объяснил, почему циклический режим неприменим почти нигде при работе с внешним железом. Непрерывно лить большие потоки данных надо нечасто. Гораздо чаще работа идет по принципу запрос-ответ. И пока нет запроса, слать ничего не надо. Либо на МК просто валятся порции данных через какой-то промежуток времени. Я не говорю, что DMA - то плохо. Но лепить его в каждую дырку - это, по меньшей мере, бред. Любой ресурс МК надо использовать грамотно и проблемы отпадут сами собой =)

 

2 часа назад, my504 сказал:

При попытке Барса выдать какие то формальные правила применения ДМА.

Вы пытаетесь выдать ровно такие же правила, но для своей области применения.:crazy:

3 часа назад, my504 сказал:

А Вы не пробовали загружать в основном цикле некий параметр внешнего устройства, который висит на SPI (или  I2C), при этом сам обмен автоматически и непрерывно поддерживается DMA? Там для обмена вообще непрерывно шлется эта переменная и адресный байт впереди. Запустили - забыли. Считаем в суперлупе и иногда модифицируем переменную, которая и засылается в это внешнее устройство.

Нет, таких задач пока не было.

 

3 часа назад, ruhi сказал:

какую проблему решает копирование значения регистра в память посредством ДМА,

Тот же FSMC интерфейс...

Share this post


Link to post
Share on other sites
                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

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

Подробнее...

1 минуту назад, BARS_ сказал:

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

Произвольно взятые примеры из ТОЛЬКО ОДНОГО  разрабатываемого прибора, который у меня на столе сейчас.

1. Загрузка удаленного на 6 метров STN дисплея через мост UART-RS485-UART-I2C. Пакеты по 1057 байт В ОДНУ СТОРОНУ. Никаких запросов нет. Просто попеременно посылается 2 буфера. Один работает на ДМА-УАРТ, второй загружается из софта. Драйвер возвращает указатель на доступный к загрузке массив.

2. Загрузка DDS (частота синусоиды). SPI ТОЛЬКО В ОДНУ СТОРОНУ. Небольшие пакеты (8 слов по 16 бит) с рейтом 8 мбит.

3. Внешний АЦП-SPI загрузка в одну сторону по реквестам от цепочки семплирующий ШИМ - синхронный Output Compare. Сам ШИМ является запуском преобразования, от него запускается  Output Compare, который и создает запросы на транзакции.

Могу взять другое серийное устройство - там половина интерфейсов на ДМА не имеют никаких запросов, а те,которые как бы имеют,  используют для запроса-ответа РАЗНЫЕ КАНАЛЫ ДМА, то есть каждый из них тоже односторонний.

18 минут назад, BARS_ сказал:

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

Я как раз ОТВЕРГАЮ какие либо "правила", предлагая включить здравый смысл и понимание механизма работы ДМА.

Share this post


Link to post
Share on other sites

В новой аттине не всё так однозначно. SPI флаги (впрочем, как и АЦП-ные) при входе в прерывание сами не сбрасываются. Необходимо выполнить какое-то условие или вручную записать "1". Флаг DREIF (пустой буфер на передачу) так и вообще сбрасывается только в момент записи данных в буфер. И больше никак. Вот и как в таких условиях работать? На повестке дня - трансивер. Это значит, что будет передача всего одного байта и прием трех байт. Период передачи - пара раз в секунду. Поэтому принято решение ничего не трогать и работать "по старинке". Любой другой вариант порождает накладные расходы и увеличивает интервал общения с трансивером.

Share this post


Link to post
Share on other sites
8 часов назад, parovoZZ сказал:

Любой другой вариант порождает накладные расходы и увеличивает интервал общения с трансивером.

О каких "накладных расходах" может идти речь, когда речь идет о СЕКУНДАХ?

По поводу флагов. Вы пытаетесь привести флаги к событиям, но есть такое мнение, что они могут соответствовать СОСТОЯНИЯМ. Это другой подход. Он ничем не хуже, а часто и лучше.

Share this post


Link to post
Share on other sites
13 часа назад, my504 сказал:

Вы пытаетесь привести флаги к событиям, но есть такое мнение, что они могут соответствовать СОСТОЯНИЯМ. Это другой подход. Он ничем не хуже, а часто и лучше.

Так вот это я и называю "по старинке".

Share this post


Link to post
Share on other sites

По какой еще "старинке"? 

Любые автоматические действа с флагами хороши только для стандартных задач.

Не вижу никаких проблем для Вашего проекта. К чему это ворчание?

Share this post


Link to post
Share on other sites

Я запрашиваю значение регистра. Функция выглядит так:

	//... Передать и принять байт данных
 uint8_t SPI_ReadByte(uint8_t data)
 {
	uint8_t temp;

	while(!(SPI0.INTFLAGS & SPI_DREIF_bm));			// проверка готовности буфера 

	SPI0.DATA = data;								// помещаем данные в буфер. Флаг DREIF очищается

	SPI0.INTCTRL = SPI_RXCIE_bm;					// разрешаем прерывание после приема байта (и только его)

	Sleep(SLPCTRL_SMODE_IDLE_gc);					// 

	while(!(SPI0.INTFLAGS & SPI_RXCIF_bm));			// удостоверимся, что есть непрочитанный байт в буфере приема

	temp = SPI0.DATA;								// читаем приемный буфер. Флаг RXCIF очищается

	return temp;
 }

Или предлагается работать через указатели? В главном цикле проверяем, не сдвинулся ли указатель RX данных и если да, то читаем? Но тогда программа усложниться в разы - сперва запрашиваем статус буфера трансивера, затем запрашиваем длину принятых данных и уже потом их читаем. И, кроме как ждать принятия данных на текущий запрос, других способов общения с трансивером я здесь не вижу.

В 09.05.2019 в 07:13, my504 сказал:

О каких "накладных расходах" может идти речь

о потере времени между сеансами общения.

Share this post


Link to post
Share on other sites
28 минут назад, parovoZZ сказал:

о потере времени между сеансами общения.

Потере на то, чтобы крутиться в пустом цикле?

Вы издеваетесь над здравым смыслом. При скважности "сеансов общения" в десятки тысяч - сброс флага за 1 маш.цикл  НИКАК НА ПРОИЗВОДИТЕЛЬНОСТЬ НЕ ВЛИЯЕТ.

Share this post


Link to post
Share on other sites
В 08.05.2019 в 15:02, ARV сказал:

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

у @my504 там получалось что надо значение регистра по приходу слова копировать в ячейку памяти по ДМА (видимо по событию прерывания от SPI),

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

во первых не пропустить момент обновления;

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

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

Так вот, если вы используете ДМА, в данном случае, этот период разрешенного чтения сокращается (из регистра еще надо скопировать и только потом можно читать!!!), может быть совсем чуть чуть сокращается, но опять же, повторю:

задача становится реальной только при определенных условиях, скорость СПИ-ай в данном случае является таким условием актуальности задачи

по мне так все это очевидно, но такое разжевывание помогает в том числе себя проверить, что тоже ни когда не вредно :) !!!  Вот человек который все знает/понимает на основании этого давит авторитетом, но разжевать не умеет, скорее всего что то все таки не знает и не понимает :) опыт показывает!!!

Есть и другие проблемы, в СПИ-ай должен быть бит (флаг) переполнения буфера чтения - как раз для отслеживания ситуации с затиранием не прочитанного значения, и при использовании ДМА его не получится использовать!

Share this post


Link to post
Share on other sites
В 10.05.2019 в 15:42, my504 сказал:

Потере на то, чтобы крутиться в пустом цикле?

Поясню.

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

2-ой вариант. Кладем данные в буфер, каким-либо образом отмечаем отправленную команду и уходим из функции (-//-). Далее уходим на прерывание, сбрасываем флаг, читаем буфер, каким-либо образом помечаем, что получены данные, выходим из прерывания. В основном цикле производим проверку новых данных.

2-ой вариант подлиннее будет. Разумеется, что если у нас дисплей и нам с него взять нечего(!), то 2-ой вариант в самый раз, особенно если буфер "длинный".

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By parovoZZ
      AREF  - внутренний ИОН 1.1в
      Вот такой код снятия результатов:
      temp = ADC; if (ADCH & (1<<ADCH1)) // Если значение отрицательное { temp |= 0xFC00; temp = (~temp) + 1; } Value_current_lsb = (uint8_t)(temp >> 2); Никак не пойму - на выбранные дифф. входы надо подать 85 мВ, чтобы АЦП выдал 0. Но это могу списать на внутренний ОУ в виде УГ. Если подаю  -1,1 в - то получаю 127.  Здесь все верно. Но при подаче положительного смещения те же 127 получаю уже при 0,72в. Что за ерунда? Неужели ОУ на столько УГ? Либо же где-то теряется разряд?
    • By parovoZZ
      Ну, собственно, сабж. Питание - от 2.4 и до 3.6. На сигнальном выводе необходима половина напряжения питания (по постоянке, разумеется).
    • By parovoZZ
      Не секрет, что адресация глобальных переменных прямая, а переменных в стеке - косвенная. Стек в AVR программный, то бишь откусывается от ОЗУ. Так вот вопрос - при передаче в функцию (и обратно) больших объемов данных (которые невозможно передать через РОН) все же что будет производительнее - через глобальные переменные или через параметры? Понятно, что в функцию вида
      uint8_t My_super_function (uint8_t data); переменные уйдут через РОН,  а вот в такую
      void My_super_function (uint8_t *data, uint8_t *ret); через стек? Так может ну его нафик, стек этот?
    • By parovoZZ
      Поставил LUFA, следом абсолютно не нужный мне ASF. Но в упор не понимаю - как создать проект на базе этой библиотеки из студии? Приходится вручную копировать папку с заголовочниками LUFA, прописывать пути в makefile, лишние телодвижения по добавлению папки в свойства проекта. Если я это делаю всё вручную, то тогда для чего это расширение? Примеры я могу и так покрутить. ЗЫ - не слишком высокий скилл в юзании Atmel Studio/
×
×
  • Create New...