Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Синхронизация 2-х SSP в LPC2366
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Dopler
Нужно получить некоторое подобие 2-х битного ЦАПа на частоте ~10МГц. Для этого есть идея использовать параллельно 2 SSP, т.е. выводить синхронно два битовых потока. Встает вопрос - как их синхронизировать. Сначала хотел сделать 1 SSP мастером, второй слейвом (с объединением клоков). В таком случае синхронизация получилась бы автоматически. Но оказалось, что
Цитата
In Slave mode, the SSP clock rate provided by the master must not exceed 1/12 of the
SSP peripheral clock


Может быть, есть еще какие-нибудь варианты? Желательно, конечно, обеспечить одновременность начала битовых потоков, но в крайнем случае можно рассмотреть варианты постоянного сдвига на целое число бит.
zltigo
Цитата(Dopler @ Oct 12 2008, 14:41) *
Может быть, есть...

Конечно - использовать естественным образом I2S на удвоенной частоте добавив к нему примитивный дешифратор битового потока на два.
Dopler
Цитата(zltigo @ Oct 12 2008, 16:55) *
Конечно - использовать естественным образом I2S на удвоенной частоте добавив к нему примитивный дешифратор битового потока на два.


Дешифратор может и примитивный, но все равно громоздкий. Как минимум сдвиговый регистр+триггер.

Вот если бы SSP поддерживал бы слова 2 бита, то триггер бы не понадобился, хватило бы только сдвигового регистра и сигнала FS.
zltigo
Цитата(Dopler @ Oct 12 2008, 16:03) *
Как минимум сдвиговый регистр+триггер.

Сдвиговый-то зачем? Пара D триггеров запоминающие каждый свой бит из потока и триггер делящий для них частоту. Можно одним корпусом, можно из "одногейтовых" набрать...
Dopler
Цитата(zltigo @ Oct 12 2008, 18:11) *
Сдвиговый-то зачем? Пара D триггеров запоминающие каждый свой бит из потока и триггер делящий для них частоту. Можно одним корпусом, можно из "одногейтовых" набрать...


И работать не будет, так как без линии задержки на выходе будем иметь две последовательности, сдвинутые на один период двойной частоты
Нажмите для просмотра прикрепленного файла
zltigo
Цитата(Dopler @ Oct 12 2008, 16:36) *
И работать не будет...

Уж не знаю, что Вы там себе нарисовали, что такое str и почему оно идет на 1/4 частоте клоков, ибо:
- на I2S имеется чередующийся битовый поток, естественно, c частотой 1/2 клоков;
- имеется клок по rising edge которого поток семплируется;
- делим этот клок на два;
- получившимся клоком rising edge семплируем (записываем в первый триггер) нечетные биты для первого
выходного потока
- falling edge (rising c инверсного выхода тригера делящего частоту) семплируем четные биты во втором триггере для второго битового потока.
В результате получаем два битовых потока на половинной частоте исходного клока.
Единственно, что в результате получаем от I2S два потока максимум на 72MHz/4. Это соответствует озвученному ранее "~10MHz"?
Dopler
Цитата(zltigo @ Oct 12 2008, 19:25) *
Уж не знаю, что Вы там себе нарисовали, что такое str и почему оно идет на половинной частоте клоков, ибо:
- имеется чередующийся битовый поток, естественно, c частотой клоков;
- имеется клок по rising edge которого поток семплируется;
- делим этот клок на два;
- получившимся rising edge семплируем (записываем в первый триггер) биты для первого
выходного потока
- falling edge (rising c инверсного выхода тригера делящего частоту) семплируем биты во втором триггере для второго битового потока.


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

Цитата
В результате получаем два битовых потока на половинной частоте исходного клока.


Получать-то мы их получаем, но не синхронными! Более того сдвиг не равен одному биту, а равен половине, что тоже не годится.


Цитата(zltigo @ Oct 12 2008, 19:25) *
Уж не знаю, что Вы там себе нарисовали, что такое str и почему оно идет на 1/4 частоте клоков, ибо:
озвученному ранее "~10MHz"?


Не успеваю отвечать, как сообщение изменяется.
str - это и есть поток, 2 единицы, 2 нуля подряд
он и есть 1/2 а не одна 1/4 (clk2 = clk1*2)


На всякий случай прикладываю осцилограму, что надо получить:
Нажмите для просмотра прикрепленного файла

Т.е. сплошной поток на удвоенной частоте 11001100 синхронно преобразуется в два потока 1010 на одинарной частоте. На самом деле такое легко реализуется сдвиговым регистром и триггером.



А если я просто соседними командами запишу в буфер SSP0 и SSP1 (с настроенными DMA), насколько детерменированным/постоянным будет сдвиг между выходными потоками?
zltigo
Цитата(Dopler @ Oct 12 2008, 17:49) *
Это все понятно

Это хорошо.
Цитата
т.е. выходная последовательность будет сдвинута на пол бита или на период исходной частоты.
Получать-то мы их получаем, но не синхронными! Более того сдвиг не равен одному биту, а равен половине, что тоже не годится.

Не знаю, что там у Вас дальше, но полученные потоки можно/нужно семплировать сложенным по ИЛИ прямой и поделенной тактовыми - фронт на 3/4 тактовой соответствует установившимся значениям по обеим каналам.
Цитата
А если я просто соседними командами запишу в буфер SSP0 и SSP1 (с настроенными DMA), насколько детерменированным/постоянным будет сдвиг между выходными потоками?

Полный произвол, тем более, что "две соседних" команды относятся к периферии висящей на меееедленной периферийной шине.
Цитата
str - это и есть поток...

Ну так рисуйте нормально - уменьшите длительность бита str с четырех до двух клеток, ибо написанное словами полностью не соответствует рисунку.
Dopler
Цитата(zltigo @ Oct 12 2008, 20:01) *
Не знаю, что там у Вас дальше, но полученные потоки можно/нужно семплировать сложенным по ИЛИ прямой и поделенной тактовыми - фронт на 3/4 тактовой соответствует установившимся значениям по обеим каналам.


Ладно, из удвоенного потока тем или иным способом два одиночных выделить можно.
Но может "как-нибудь так"?
zltigo
Цитата(Dopler @ Oct 12 2008, 18:21) *
Но может "как-нибудь так"?

Неа....
Dopler
Цитата(zltigo @ Oct 12 2008, 20:01) *
Ну так рисуйте нормально - уменьшите длительность бита str с четырех до двух клеток, ибо написанное словами полностью не соответствует рисунку.



как же я до двух уменьшу, когда там 2 единицы подряд идут
zltigo
Цитата(Dopler @ Oct 12 2008, 18:27) *
как же я до двух уменьшу, когда там 2 единицы подряд идут

То, что там идет подряд или не подряд, это дело десятое - рисуются БИТЫ, а не их значение. Длительность бита в I2C один период CLK а не два.
Если у Вас почему-то ВСЕГДА идут биты по одинаковым парам, то я вообще перестал понимать что мы тут вообще обсуждаем, ибо это прото два совершенно одинаковых потока....
Dopler
Цитата(zltigo @ Oct 12 2008, 20:33) *
То, что там идет подряд или не подряд, это дело десятое - рисуются БИТЫ, а не их значение. Длительность бита в I2C один период CLK а не два.
Если у Вас почему-то ВСЕГДА идут биты по одинаковым парам, то я вообще перестал понимать что мы тут вообще обсуждаем, ибо это прото два совершенно одинаковых потока....


К сожалению, квартус стирает границу между двумя битами, если они имееют одинаковое значение.
Вот, поправил в паинте.


Нажмите для просмотра прикрепленного файла
zltigo
Цитата(Dopler @ Oct 12 2008, 18:47) *
Вот, поправил в паинте.

Теперь осталось 0 и 1 расставить правильно в соответствии с КАНАЛАМИ а не значениями битов и задание готово smile.gif
Цитата
квартус

Если у Вас CPLD/FPGA подключается, то тогда вообще проблем '0' smile.gif. Делайте двойную скорость и не морочте голову!
Dopler
Цитата(zltigo @ Oct 12 2008, 20:54) *
Теперь осталось 0 и 1 расставить правильно в соответствии с КАНАЛАМИ а не значениями битов и задание готово smile.gif


так оно так и расставлено 1100 в двойной последовательности соответсвует 10 в первом канале и 10 во втором, но уже на пониженной частоте


Цитата
Если у Вас CPLD/FPGA подключается, то тогда вообще проблем '0' smile.gif. Делайте двойную скорость и не морочте голову!


Как раз всеми силами стараюсь CPLD не подключить (всмысле обойтись).


Ладно, этот вариант я понял.

Может быть есть какие-то шансы воспользоваться контроллером SD/MMC и его 4-х битной шиной?
А это у всех LPC ограничение максимального клока в pclk/12 для режима slave?
zltigo
Цитата(Dopler @ Oct 12 2008, 19:06) *
так оно так и расставлено

Расставлены зачем-то конкретные значения битов, а не номера каналов.
Цитата
Как раз всеми силами стараюсь CPLD не подключить (всмысле обойтись).

На и на шустрой рассыпухе все получится...
Цитата
А это у всех LPC ограничение максимального клока в pclk/12 для режима slave?

Нет, бывает и 1/8 smile.gif у тех, которые 60MHz.....
Вы там особо за SSP*2 не переживайте, если непрерывные потоки на 10Mbit гнать надо, ибо байтики медленно подносятся из-за скорости шины, если только оба GPDMA под это не отдать.
Dopler
Цитата(zltigo @ Oct 12 2008, 21:21) *
Нет, бывает и 1/8 smile.gif у тех, которые 60MHz.....
Вы там особо на SPI*2 не рассчитывайте, если непрерывный поток гнать надо...



Да его непрерывно и не надо, пакетами по 52мкС. Устройство - генератор Pal сигнала для телевизора. Хочется получить 4 цвета - черный, серый, серый, белый. Будет использоваться 7" китайский LCD, родное разрешение которог 480х234 пиксела. Вот эти 480 в строке и определяют частоту 9.2 МГц. Т.е. я себе представлял это дело так - прерывание от таймера - строчный импулс - запускаем SSP на 480 бит.



Раньше с ARM имел дело только эпизодически, сюда хотел применять самый мелкий циклон3. Но цена LPC просто убивает (особенно, если вспомнить, сколько на этот циклон еще стабилизаторов питания надо)

Цитата(zltigo @ Oct 12 2008, 21:21) *
Вы там особо за SSP*2 не переживайте, если непрерывные потоки на 10Mbit гнать надо, ибо байтики медленно подносятся из-за скорости шины, если только оба GPDMA под это не отдать.


Отдать оба GPDMA не жалко, ибо от сего девайса нужно только по нажатию на кнопочку брать конкретную картинку из dataFlash, класть ее себе в ОЗУ а из ОЗУ рисовать на телевизор.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.