Перейти к содержанию

    

Знатокам SGPIO LPC4337

Добрый день, коллеги!

Добрался таки я до чудесного модуля 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 мкс, ведь он позволяет задавать дробный коэффициент умножения, но идея пока сомнительная (как я понял, будет погрешность в задании частоты).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
17 часов назад, haker_fox сказал:

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

Ну можно не по прерыванию, а по DMA. И организовать на них ещё FIFO (конкатенацией слайсов). А в буфере DMA запрограммируйте все возможные положения последовательности внутри 32-битного слова. Таких положений должно быть целое количество, поэтому буфер можно будет зациклить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
6 hours ago, jcxz said:

Ну можно не по прерыванию, а по DMA.

DMA тоже внесёт задержки, если занята шина, либо работают другие его каналы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5 hours ago, haker_fox said:

DMA тоже внесёт задержки, если занята шина, либо работают другие его каналы.

А разве в этом МК нет настройки приоритета доступа CPU и DMA?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
8 часов назад, haker_fox сказал:

DMA тоже внесёт задержки, если занята шина, либо работают другие его каналы.

Вы наверное не заметили, но я написал что нужно организовать FIFO на слайсах. Тогда DMA внесёт задержку только в наполнение FIFO, но никак не в осциллограмму.

 

1 час назад, Arlleex сказал:

А разве в этом МК нет настройки приоритета доступа CPU и DMA?

Приоритет тут не слишком полезен. Если нужно чтобы импульсы шли без задержек из-за недогрузки сдвиговых регистров, то поможет только буферизация (FIFO).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 hours ago, Arlleex said:

А разве в этом МК нет настройки приоритета доступа CPU и DMA?

Вроде как нет. Хотя что-то под названием LOCK фигурирует.

1 hour ago, jcxz said:

Вы наверное не заметили, но я написал что нужно организовать FIFO на слайсах. Тогда DMA внесёт задержку только в наполнение FIFO, но никак не в осциллограмму.

Почему же заметил, но не предал этому значния. Вернее не осознал. Т.е. я правильно понял, что вы предлагаете наполнять FIFO (слайсы, которые ещё не участвуют в выдвижении на пин), пока другие регистры передаются на пин?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
14 минут назад, haker_fox сказал:

Почему же заметил, но не предал этому значния. Вернее не осознал. Т.е. я правильно понял, что вы предлагаете наполнять FIFO (слайсы, которые ещё не участвуют в выдвижении на пин), пока другие регистры передаются на пин?

Конечно. Я уже смутно помню как в LPC43xx работает SGPIO. Но помню, что слайсы можно конкатенировать в цепочки, строя из них таким образом FIFO.

DMA заполняет FIFO непрерывно, по сигналу появления свободного места в FIFO. А из FIFO слова будут копироваться в сдвиговый регистр без всякого влияния задержек шины. Таким образом размер FIFO будет демпфировать эти самые задержки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 hours ago, jcxz said:

Конечно. Я уже смутно помню как в LPC43xx работает SGPIO. Но помню, что слайсы можно конкатенировать в цепочки, строя из них таким образом FIFO.

DMA заполняет FIFO непрерывно, по сигналу появления свободного места в FIFO. А из FIFO слова будут копироваться в сдвиговый регистр без всякого влияния задержек шины. Таким образом размер FIFO будет демпфировать эти самые задержки.

Понятно, благодарю! На работе попробую)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация