haker_fox 61 20 октября, 2018 Опубликовано 20 октября, 2018 (изменено) · Жалоба Добрый день, коллеги! Добрался таки я до чудесного модуля SGPIO в LPC4337. Два дня изучал его только теоретически. Модуль действительно мощный, но чуток запутанный сначала. Ну да ладно. Вот в чём дело: мне нужно выдать хитрую последовательность данных на три ноги SGPIO. Последовательность такая, что её невозможно уложить кратно 32 битам (один сдвиговый регистр в SGPIO) или 64 битам с тем, что зациклить эти регистры на себя. Другими словами, мне нужно каждые 100 мкс выдавать некую повторяющуюся последовательность из трёх параллельных бит, менюющуюся каждую 1 мкс. Это сделать не проблема, но 100 мкс не кратно 32 битам. Т.е. я взял три SGPIO, задал в их слайсах последовательности, и все получилось. Но поскольку слайсы зациклены сами на себя, то я могу получить 32, 64, 128 мкс, но не 100 мкс. Можно, конечно перегружать слайсы по прерыванию, когда POS-счётчик достигнет нулевого значения, но это дополнительное время и джиттер, и не думаю, что будет работать надёжно. Может быть есть какое-то решение моей проблемы, и я проглядел его в user manual? Уже пришла в голову идея затактировать SGPIO от audiopll так, чтобы 1 бит в 128 битной последовательности (4 слайса) был равен по времени 100/128 мкс, ведь он позволяет задавать дробный коэффициент умножения, но идея пока сомнительная (как я понял, будет погрешность в задании частоты). Изменено 14 ноября, 2022 пользователем haker_fox Добавил теги. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 20 октября, 2018 Опубликовано 20 октября, 2018 · Жалоба 17 часов назад, haker_fox сказал: Можно, конечно перегружать слайсы по прерыванию, когда POS-счётчик достигнет нулевого значения, но это дополнительное время и джиттер, и не думаю, что будет работать надёжно. Ну можно не по прерыванию, а по DMA. И организовать на них ещё FIFO (конкатенацией слайсов). А в буфере DMA запрограммируйте все возможные положения последовательности внутри 32-битного слова. Таких положений должно быть целое количество, поэтому буфер можно будет зациклить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 21 октября, 2018 Опубликовано 21 октября, 2018 · Жалоба 6 hours ago, jcxz said: Ну можно не по прерыванию, а по DMA. DMA тоже внесёт задержки, если занята шина, либо работают другие его каналы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 21 октября, 2018 Опубликовано 21 октября, 2018 · Жалоба 5 hours ago, haker_fox said: DMA тоже внесёт задержки, если занята шина, либо работают другие его каналы. А разве в этом МК нет настройки приоритета доступа CPU и DMA? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 21 октября, 2018 Опубликовано 21 октября, 2018 · Жалоба 8 часов назад, haker_fox сказал: DMA тоже внесёт задержки, если занята шина, либо работают другие его каналы. Вы наверное не заметили, но я написал что нужно организовать FIFO на слайсах. Тогда DMA внесёт задержку только в наполнение FIFO, но никак не в осциллограмму. 1 час назад, Arlleex сказал: А разве в этом МК нет настройки приоритета доступа CPU и DMA? Приоритет тут не слишком полезен. Если нужно чтобы импульсы шли без задержек из-за недогрузки сдвиговых регистров, то поможет только буферизация (FIFO). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 21 октября, 2018 Опубликовано 21 октября, 2018 · Жалоба 2 hours ago, Arlleex said: А разве в этом МК нет настройки приоритета доступа CPU и DMA? Вроде как нет. Хотя что-то под названием LOCK фигурирует. 1 hour ago, jcxz said: Вы наверное не заметили, но я написал что нужно организовать FIFO на слайсах. Тогда DMA внесёт задержку только в наполнение FIFO, но никак не в осциллограмму. Почему же заметил, но не предал этому значния. Вернее не осознал. Т.е. я правильно понял, что вы предлагаете наполнять FIFO (слайсы, которые ещё не участвуют в выдвижении на пин), пока другие регистры передаются на пин? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 21 октября, 2018 Опубликовано 21 октября, 2018 · Жалоба 14 минут назад, haker_fox сказал: Почему же заметил, но не предал этому значния. Вернее не осознал. Т.е. я правильно понял, что вы предлагаете наполнять FIFO (слайсы, которые ещё не участвуют в выдвижении на пин), пока другие регистры передаются на пин? Конечно. Я уже смутно помню как в LPC43xx работает SGPIO. Но помню, что слайсы можно конкатенировать в цепочки, строя из них таким образом FIFO. DMA заполняет FIFO непрерывно, по сигналу появления свободного места в FIFO. А из FIFO слова будут копироваться в сдвиговый регистр без всякого влияния задержек шины. Таким образом размер FIFO будет демпфировать эти самые задержки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 21 октября, 2018 Опубликовано 21 октября, 2018 · Жалоба 3 hours ago, jcxz said: Конечно. Я уже смутно помню как в LPC43xx работает SGPIO. Но помню, что слайсы можно конкатенировать в цепочки, строя из них таким образом FIFO. DMA заполняет FIFO непрерывно, по сигналу появления свободного места в FIFO. А из FIFO слова будут копироваться в сдвиговый регистр без всякого влияния задержек шины. Таким образом размер FIFO будет демпфировать эти самые задержки. Понятно, благодарю! На работе попробую) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться