|
|
  |
Разработка параллельного синхронного интерфейса, arm 23xx |
|
|
|
Feb 28 2011, 07:26
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 7-12-10
Пользователь №: 61 451

|
Необходимо разработать параллельный синхронный интерфейс 6 разрядов данные, 1 разряд синхросигнал. Для этого я использовал быстрые порты ввода вывода и таймер(для установления частоты синхросигнала 640 КГц). Пробовал выдавать данные с использованием прерывания таймера и без. В обоих случаях не удается добиться четкой частоты, при добавлении кода на заполнения буффера или контроля счетков, частота начинает уплывать - длительность синхроимпульсов не четкая. Возможны ли другие пути решения задачи?
|
|
|
|
|
Feb 28 2011, 15:52
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(SmileGobo @ Feb 28 2011, 02:26)  Необходимо разработать параллельный синхронный интерфейс 6 разрядов данные, 1 разряд синхросигнал. Для этого я использовал быстрые порты ввода вывода и таймер(для установления частоты синхросигнала 640 КГц). Пробовал выдавать данные с использованием прерывания таймера и без. В обоих случаях не удается добиться четкой частоты, при добавлении кода на заполнения буффера или контроля счетков, частота начинает уплывать - длительность синхроимпульсов не четкая. Возможны ли другие пути решения задачи? А она действительно нужна -- четкость дилтельности синхроимпульсов? И если нужна, какой допустимый джиттер? 640 килогерц -- круто. У вас всего < 120 клоков на каждый пакет данных. Прерывания тут естественно не катят. Синхроклок от PWM, и обновления данных на выходе по флагу прерывания от PWM. Но без собственно прерываний -- все должно делаться в основном цикле, который должен быть вылизан до предела. Правда, какую-либо еще осмысленную задачу этот процессор уже не вытянет. Если еще эти данные надо как-то нетривиально генерировать, то надо делать буфер на внешнем устройстве. Пик или CPLD. Вываливать данные наружу через DMA, а внешний буфер уже их будет выплевывать с нужной скоростью. И только отслеживать в софте заполненность внешнего буфера.
Сообщение отредактировал ar__systems - Feb 28 2011, 16:38
|
|
|
|
|
Mar 1 2011, 07:45
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 7-12-10
Пользователь №: 61 451

|
Цитата А она действительно нужна -- четкость длительности синхроимпульсов? И если нужна, какой допустимый джиттер? Нужна очень! Необходимо соблюдать четко синхросигнал - 640 КГц и данные 320 отклонения в пределах 3%. Проблема еще в том что синхросигнал имеет такую структуру ....10101010101010 10001010101.... - эта так называемая вырезка генерируется с частотой 8КГц Цитата 640 килогерц -- круто. У вас всего < 120 клоков на каждый пакет данных. А как вы расчитали что менее 120 клоков? я работаю на частоте 72Мгц Вы говорите об использовании DMA, когда я выдавал данные через SSP проблем не было завязать его с DMA, а куда привязывать DMA в случае параллельного интерфейса,возможно его связать с портом вывода?
|
|
|
|
|
Mar 1 2011, 09:10
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(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 в случае параллельного интерфейса,возможно его связать с портом вывода? Если сообщите марку МК, придётся меньше гадать.
|
|
|
|
|
Mar 1 2011, 11:07
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 7-12-10
Пользователь №: 61 451

|
Прошу прощения сразу не догадался сказать марку - lpc2378 NXP. В целом эта программа пойдет и на 68 процессор Собственно я еще раз погонял на осциллографе без логического анализатора, и вроде как частота выдерживается, так что вопрос исчерпан. Единственное хотелось бы узнать как связать порт ввода/вывода и DMA и на сколько это возможно. Спасибо за уделенное внимание
Сообщение отредактировал SmileGobo - Mar 1 2011, 11:08
|
|
|
|
|
Mar 1 2011, 14:00
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(SmileGobo @ Mar 1 2011, 02:45)  Проблема еще в том что синхросигнал имеет такую структуру ....1010101010101010001010101.... - эта так называемая вырезка генерируется с частотой 8КГц Можно и без внешней. Ставите счетчик и в нужные моменты времени меняте Duty Cycle у PWM. Без внешнего буфера DMA вам не поможет. Более разумный и простой вариант все (данные и клок) валить DMA в UART на частоте 6.4МГц, а оттуда каким-то десериализатором распараллеливать.
Сообщение отредактировал ar__systems - Mar 1 2011, 14:38
|
|
|
|
|
Mar 2 2011, 06:31
|

Местный
  
Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897

|
Цитата(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 Обратите внимание на применение развернутого цикла, только так удалось добиться нужной скорости и стабильной частоты.
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
Mar 4 2011, 16:32
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 7-12-10
Пользователь №: 61 451

|
Спасибо за советы буду пробовать
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|