Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Разработка параллельного синхронного интерфейса
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
SmileGobo
Необходимо разработать параллельный синхронный интерфейс 6 разрядов данные, 1 разряд синхросигнал. Для этого я использовал быстрые порты ввода вывода и таймер(для установления частоты синхросигнала 640 КГц). Пробовал выдавать данные с использованием прерывания таймера и без. В обоих случаях не удается добиться четкой частоты, при добавлении кода на заполнения буффера или контроля счетков, частота начинает уплывать - длительность синхроимпульсов не четкая. Возможны ли другие пути решения задачи?
scifi
Синхросигнал должен вырабатываться таймером без вмешательства процессора (функция PWM или что-то в этом духе). Данные тоже желательно выдавать без процессора, при помощи DMA.
ar__systems
Цитата(SmileGobo @ Feb 28 2011, 02:26) *
Необходимо разработать параллельный синхронный интерфейс 6 разрядов данные, 1 разряд синхросигнал. Для этого я использовал быстрые порты ввода вывода и таймер(для установления частоты синхросигнала 640 КГц). Пробовал выдавать данные с использованием прерывания таймера и без. В обоих случаях не удается добиться четкой частоты, при добавлении кода на заполнения буффера или контроля счетков, частота начинает уплывать - длительность синхроимпульсов не четкая. Возможны ли другие пути решения задачи?
А она действительно нужна -- четкость дилтельности синхроимпульсов? И если нужна, какой допустимый джиттер?

640 килогерц -- круто. У вас всего < 120 клоков на каждый пакет данных. Прерывания тут естественно не катят. Синхроклок от PWM, и обновления данных на выходе по флагу прерывания от PWM. Но без собственно прерываний -- все должно делаться в основном цикле, который должен быть вылизан до предела.

Правда, какую-либо еще осмысленную задачу этот процессор уже не вытянет. Если еще эти данные надо как-то нетривиально генерировать, то надо делать буфер на внешнем устройстве. Пик или CPLD. Вываливать данные наружу через DMA, а внешний буфер уже их будет выплевывать с нужной скоростью. И только отслеживать в софте заполненность внешнего буфера.
SmileGobo
Цитата
А она действительно нужна -- четкость длительности синхроимпульсов? И если нужна, какой допустимый джиттер?

Нужна очень! Необходимо соблюдать четко синхросигнал - 640 КГц и данные 320 отклонения в пределах 3%.

Проблема еще в том что синхросигнал имеет такую структуру ....1010101010101010001010101.... - эта так называемая вырезка генерируется с частотой 8КГц

Цитата
640 килогерц -- круто. У вас всего < 120 клоков на каждый пакет данных.
А как вы расчитали что менее 120 клоков? я работаю на частоте 72Мгц

Вы говорите об использовании DMA, когда я выдавал данные через SSP проблем не было завязать его с DMA, а куда привязывать DMA в случае параллельного интерфейса,возможно его связать с портом вывода?
scifi
Цитата(SmileGobo @ Mar 1 2011, 10:45) *
Проблема еще в том что синхросигнал имеет такую структуру ....1010101010101010001010101.... - эта так называемая вырезка генерируется с частотой 8КГц

Такие вырезки желательно внешней логикой формировать. Наверняка можно два выхода PWM скомбинировать при помощи одной логической ячейки и получить желаемое.

Цитата(SmileGobo @ Mar 1 2011, 10:45) *
А как вы расчитали что менее 120 клоков? я работаю на частоте 72Мгц

72000000 / 640000 = 112.5

Цитата(SmileGobo @ Mar 1 2011, 10:45) *
Вы говорите об использовании DMA, когда я выдавал данные через SSP проблем не было завязать его с DMA, а куда привязывать DMA в случае параллельного интерфейса,возможно его связать с портом вывода?

Если сообщите марку МК, придётся меньше гадать.
SmileGobo
Прошу прощения сразу не догадался сказать марку - lpc2378 NXP. В целом эта программа пойдет и на 68 процессор
Собственно я еще раз погонял на осциллографе без логического анализатора, и вроде как частота выдерживается, так что вопрос исчерпан.
Единственное хотелось бы узнать как связать порт ввода/вывода и DMA и на сколько это возможно.
Спасибо за уделенное внимание
ar__systems
Цитата(SmileGobo @ Mar 1 2011, 02:45) *
Проблема еще в том что синхросигнал имеет такую структуру ....1010101010101010001010101.... - эта так называемая вырезка генерируется с частотой 8КГц

Можно и без внешней. Ставите счетчик и в нужные моменты времени меняте Duty Cycle у PWM.

Без внешнего буфера DMA вам не поможет.

Более разумный и простой вариант все (данные и клок) валить DMA в UART на частоте 6.4МГц, а оттуда каким-то десериализатором распараллеливать.
Dron_Gus
Цитата(ar__systems @ Mar 1 2011, 17:00) *
Более разумный и простой вариант все (данные и клок) валить DMA в UART на частоте 6.4МГц, а оттуда каким-то десериализатором распараллеливать.

Тогда уж SPI. И валить на сдвиговый регистр с защелкой.
InsolentS
Цитата(SmileGobo @ Feb 28 2011, 12:26) *
Необходимо разработать параллельный синхронный интерфейс 6 разрядов данные, 1 разряд синхросигнал. Для этого я использовал быстрые порты ввода вывода и таймер(для установления частоты синхросигнала 640 КГц). Пробовал выдавать данные с использованием прерывания таймера и без. В обоих случаях не удается добиться четкой частоты, при добавлении кода на заполнения буффера или контроля счетков, частота начинает уплывать - длительность синхроимпульсов не четкая. Возможны ли другие пути решения задачи?

Делаю тоже самое на LPC, только 16бит и частота 8 МГц (!) для управления TFT экраном (без встроенного контроллера). Тактовую частоту (2штуки) выдаю ШИМом, а ногами махаю в ассемблерной вставке:
Код
;функция, посылающая на экран 320 слов из буфера
ClkPulseBuff    STMFD SP!, {R1-R4}
                LDR R1,=FRAMEDELAY                
                LDR R4,=FIO0PINU

;задержка перед началом строки
FrameDelay1     SUBS R1,R1,#1
                BNE  FrameDelay1

;вывод данных

                GBLA    count
count           SETA    0
                WHILE   count<320
count           SETA    count+1

                LDRH R2,[R0],#2        
                STRH R2,[R4]      

                WEND                    

                LDMFD SP!, {R1-R4}
                BX  LR

Вызывается так
Код
extern void ClkPulseBuff(unsigned short *buff);


Важно чтобы порты были подключены по-порядку и, желательно, были выровнены по байту или слову, например, P0.15 - P0.31

Обратите внимание на применение развернутого цикла, только так удалось добиться нужной скорости и стабильной частоты.
SmileGobo
Спасибо за советы буду пробовать
defunct
Можно поставить в помощь внешний более простой контроллер, который только и будет тем заниматься, что принимать поток данных по SPI и разворачивать в 6-ти битный интерфейс.
Разгрузите свой ARM, а то если дергать ногами - будет у вас 80% ресурсов проца на фигню эмуляцию интерфейса уходить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.