Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: I2S, кодек
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
Daria
Здравствуйте. Скажите, можно ли управлять подачей фреймов на выводе TF?
импульсы формируются на выводе, сразу после конфигурации ssc. Если я настраиваю старт работы передатчика по перепаду фрейма (AT91C_SSC_START_RISE_TF| AT91C_SSC_CKO_DATA_TX в регистре TCMR), то передатчик работает постоянно, даже если в буфере и нет данных, отправляя default значение.
Я понимаю, что ssc в основном предназначен для работы с кодеками, но мне нужно организовать обмен между устройством и блоком управления для него следующим образом:
Блок управления реагирует на нажатие кнопки и отсылает пакет данных, принимает ответ и "молчит" до следующего нажатия. Управляемое устройство принимает данные по положительному перепаду фрейма, фрейм должен быть длиной в один бит - устройство готовое, закрытое и изменению не подлежит.
Можно ли формировать фрейм только, когда это нужно? rolleyes.gif
aaarrr
А нужен ли SSC в данном случае? Событие происходит редко, данных, как я понимаю, немного - так не проще ли руками передать/принять?
Daria
Цитата(aaarrr @ Jan 17 2010, 13:10) *
А нужен ли SSC в данном случае? Событие происходит редко, данных, как я понимаю, немного - так не проще ли руками передать/принять?

Да я бы с удовольствием передавала бы просто по spi, но все дело в том, как формировать этот фрейм длиной в один бит, по которому устройство будет принимать и передавать данные.
Я думала - можно ли как-то использовать для этого вывод NCS0?
aaarrr
Да я вообще имел в виду "ногодрыганье" - не подходит?
Daria
Цитата(aaarrr @ Jan 17 2010, 15:09) *
Да я вообще имел в виду "ногодрыганье" - не подходит?

А как мне так точно синхронизовать "ногодрыганье" с аппаратными тактами? Фрейм длиной один такт, задержка между фронтом фрейма и фронтом синхроимпульса - полтакта

aaarrr, так все-таки - можно или нельзя управлять фреймами? smile.gif Может, я просто не понимаю, как sad.gif
aaarrr
Цитата(Daria @ Jan 17 2010, 18:00) *
А как мне так точно синхронизовать "ногодрыганье" с аппаратными тактами? Фрейм длиной один такт, задержка между фронтом фрейма и фронтом синхроимпульса - полтакта

Если контроллер у вас работает в режиме слейва, но при этом должен выдавать наружу FS, то это будет затруднительно. Если мастер - то какие проблемы?

Цитата(Daria @ Jan 17 2010, 18:00) *
aaarrr, так все-таки - можно или нельзя управлять фреймами? smile.gif Может, я просто не понимаю, как sad.gif

Настолько гибко нельзя - все таки это вывод данных привязан к FS, а не наоборот.

Вообще, опишите подробнее интерфейс (сигналы, скорость, количество передаваемых данных и т.п.) - может, что-нибудь и придумаем.
Daria
Цитата(aaarrr @ Jan 17 2010, 22:12) *
Вообще, опишите подробнее интерфейс (сигналы, скорость, количество передаваемых данных и т.п.) - может, что-нибудь и придумаем.

пакет данных - 32 слова по 16 бит, устройство принимает данные по положительному перепаду фрейма ( фрейм длиной один бит), данные фиксируются по отрицательному перепаду синхроимпульса, скорость 12МГц. устройство управления - мастер, принимающее - слейв, принимает и отправляет данные по фреймам и тактам мастера. Вроде все laughing.gif
aaarrr
Т.е. передается 32 шестнадцатибитных слова, каждое из которых снабжено FS длиной в один бит, правильно?
Daria
Цитата(aaarrr @ Jan 18 2010, 00:38) *
Т.е. передается 32 шестнадцатибитных слова, каждое из которых снабжено FS длиной в один бит, правильно?

Нет, FS в начале пакета из 32 шестнадцатибитных слов, т.е. FS подается через каждые 512 битrolleyes.gif
Да, забыла добавить, MCK у меня 48МГц
aaarrr
Цитата(Daria @ Jan 18 2010, 22:54) *
Нет, FS в начале пакета из 32 шестнадцатибитных слов, т.е. FS подается через каждые 512 битrolleyes.gif

Тогда все совсем плохо.

Нет, можно, конечно, извратиться:
- запустить первое слово с FS
- немедленно запретить и перепрограммировать передатчик
- передать оставшиеся 7 слов
- немедленно после загрузки последнего запретить передатчик

Вот только я одного не понимаю: контроллер в режиме мастер, данных кот наплакал - 512 бит "по нажатию кнопки" - зачем аппаратная передача?
Или прямо так строго 12МГц нужно выдержать (хотя это странно для синхронного приемника)? Или, возможно, слейву нужны эти клоки постоянно между передачами?
Daria
Цитата(aaarrr @ Jan 18 2010, 23:03) *
Тогда все совсем плохо.

Нет, можно, конечно, извратиться:
- запустить первое слово с FS
- немедленно запретить и перепрограммировать передатчик
- передать оставшиеся 7 слов
- немедленно после загрузки последнего запретить передатчик

Ох. а spi нельзя использовать? и фрейм как-то с помощью NPCS делать?
Цитата(aaarrr @ Jan 18 2010, 23:03) *
Вот только я одного не понимаю: контроллер в режиме мастер, данных кот наплакал - 512 бит "по нажатию кнопки" - зачем аппаратная передача?
Или прямо так строго 12МГц нужно выдержать (хотя это странно для синхронного приемника)? Или, возможно, слейву нужны эти клоки постоянно между передачами?

Последнее. после определенной команды он должен начать отсылать данные пакетами по 512 бит постоянно, т.е. ему нужны будут постоянные клоки и фреймы через каждые 512 бит. и 12МГц тоже надоsmile.gif Ну и потом, устройство готовое, уже теперь не прикапаешься -" почему". надо и точка laughing.gif
aaarrr
Цитата(Daria @ Jan 18 2010, 23:42) *
Ох. а spi нельзя использовать? и фрейм как-то с помощью NPCS делать?

У SPI с постоянством клока будут проблемы при подъеме CS. В приведенном выше извратном алгоритме для SSC - тоже.

Цитата(Daria @ Jan 18 2010, 23:42) *
Последнее. после определенной команды он должен начать отсылать данные пакетами по 512 бит постоянно, т.е. ему нужны будут постоянные клоки и фреймы через каждые 512 бит. и 12МГц тоже надоsmile.gif Ну и потом, устройство готовое, уже теперь не прикапаешься -" почему". надо и точка laughing.gif

Разве что какую-нибудь внешнюю логику прикрутить для вырезания 7/8 FS (вполне дешевый и сердитый вариант). Или заменить SAM на что-нибудь с McBSP wink.gif
Daria
Цитата(aaarrr @ Jan 18 2010, 23:58) *
Или заменить SAM на что-нибудь с McBSP wink.gif

Там как раз в устройстве TMS стоит с McBSP biggrin.gif
А, кстати, не объяcните, чем он от ssc отличается? когда проектировали плату, думали, что это примерно одно и то же, и влепили SAM с ssc laughing.gif
aaarrr
Цитата(Daria @ Jan 19 2010, 23:07) *
А, кстати, не объяcните, чем он от ssc отличается? когда проектировали плату, думали, что это примерно одно и то же, и влепили SAM с ssc laughing.gif

Степенью навороченности.

Кстати, наврал я вам вчера: вполне можно генерировать 1 FS на 16 слов средствами SSC (стыдно, ведь сам же этим и пользуюсь).
Только произвольно начинать останавливать передачу очень проблематично. Протокол общения со слейвом не допускает постоянного обмена?

Могу предложить такой вариант с использованием PDC:
1. Формируем пакет из 16 слов на передачу
2. Конфигурируем PDC для передачи, включаем передатчик
3. По прерыванию ENDTX выключаем передатчик
Тут главное не пролететь с реакцией на прерывание в п.3, иначе будет сформирован новый FS. На все про все 128 тактов процессора, если задействовать FIQ, то можно уложится.
Daria
Здравствуйте. Есть аудио-кодек PCM3794. Управляется по I2C или SPI. Обмен данными - по I2S.
У меня в процессоре(AT91SAM7x)нет I2S и никогда им не пользовалась rolleyes.gif Посмотрела в даташите описание протокола, решила, что можно передавать по SPI. В режиме slave, фреймы кодека(LRCK) заведены на NPCS0 SPI. Пишу данные только в один канал, когда LRCK в низком уровне.
В качестве теста передаю отсчеты синуса угла(через 10 градусов), старший байт, потом младший. на выходе кодека - непонятный шум laughing.gif
Подскажите, можно ли использовать вместо I2S SPI? Может, кто-нибудь кинет ссылку, где про этот протокол почитать? unsure.gif
Может, нужен какой-то особый формат данных?
Очень жду ответа
aaarrr
Цитата(Daria @ Feb 18 2010, 23:21) *
Подскажите, можно ли использовать вместо I2S SPI? Может, кто-нибудь кинет ссылку, где про этот протокол почитать? unsure.gif

Для работы с I2S нужно было задействовать SSC. Почитайте вот этот документ, все должно стать понятно.
Daria
Цитата(aaarrr @ Feb 18 2010, 23:42) *
Для работы с I2S нужно было задействовать SSC. Почитайте вот этот документ, все должно стать понятно.

А писать-читать только в один канал нельзя? если на выход потом подается дифферинциальный моносигнал.
К сожалению, SSC уже занят у меня...sad.gif
aaarrr
Цитата(Daria @ Feb 20 2010, 17:29) *
А писать-читать только в один канал нельзя? если на выход потом подается дифферинциальный моносигнал.

Можно попробовать извратиться с использованием одного левого канала, только вот LRCK в I2S уходит вниз на один клок раньше начала передачи. А какой кодек используется?
rsv
Цитата
на можно ли использовать вместо I2S SPI
я когда-то так и делал на lpc2294. а в прерывании шевелил нужной ногой. только наименование кодека не помню, с ними аккуратнее надо, а то там есть два стандарта: нормальный и японский ( smile.gif ну так он в доке на один проц звался - "japanese"). Вроде японский и есть
Цитата
только вот LRCK в I2S уходит вниз на один клок раньше начала передачи
, как в предыдущем посте написано. В общем, совет: внимательно посмотрите на времянки из даташита
Daria
Кодек PCM3794
Там вроде есть четыре режима: I2S, Лево-выровненный, право-выровненный(вроде так) и DSP. DSP однозначно не подходит, там LRCK длительностью в один бит только. А вот эти лево-... вроде бы по даташиту соотвествуют SPI, там данные начинают передаваться одновременно с появлением высокого уровня на LRCK. Инвертирую этот вывод с помощью внешней логики и вроде должен был получиться SPI, как и у меня в проце. Только если игнорировать второй канал. Но на выходе синусоида какая-то рваная. и частота подаваемого сигнала явно не соотвествует частоте выходного.
Пытаюсь сделать "петлю" - кодек принемает от внешнего источника синусоиду, передает процу с DOUT, а проц отсылает ему обратно на DIN, в итоге на выходах наушников HPOL/HPOR должна получиться такая же синусоида. но проблема, как сделать такую петлю по SPI в режиме slave
А вообще кодек дельта-сигма - это что такое?smile.gif Может это японский как раз и есть?smile.gif
Вообще какие бывают стандарты?
aaarrr
Цитата(Daria @ Feb 21 2010, 17:37) *
...Но на выходе синусоида какая-то рваная. и частота подаваемого сигнала явно не соотвествует частоте выходного.
Пытаюсь сделать "петлю"...

Не надо делать петлю. Попробуйте для начала выдавать просто биты на нужных позициях (0x8000, 0x0001 и т.п.), и проконтролируйте правильность выдаваемых данных осциллографом.
Daria
А что такое дельта-сигма модуляция? rolleyes.gif
В кодеке ЦАП и АЦП - дельта-сигма фильтры
Designer56
Такой способ размена разрешения (разрядности) на время (скорость). Иллюстрация к принципу неопределенности.
Daria
Цитата(aaarrr @ Feb 18 2010, 23:42) *
Для работы с I2S нужно было задействовать SSC. Почитайте вот этот документ, все должно стать понятно.

аааrrr, большое спасибо! После долгих мучений с SPI все-таки переделала на SSC, как здесь сказано, и все получилось! 08.gif
Только вопрос - почему, если надо читать два канала, используют второй млдуль SSC(у меня второго нетsmile.gif)?
RF и RK берут с TF и TK - почему нельзя так же завести их в одном модуле? и читать не по положительному фронту фрейма, а по перепаду?
Пробовала, получилась фигня. Но не понятно почемуsad.gif
но все равно, главное работает 08.gif
aaarrr
Цитата(Daria @ Feb 26 2010, 22:43) *
Только вопрос - почему, если надо читать два канала, используют второй млдуль SSC(у меня второго нетsmile.gif)?
RF и RK берут с TF и TK - почему нельзя так же завести их в одном модуле? и читать не по положительному фронту фрейма, а по перепаду?
Пробовала, получилась фигня. Но не понятно почемуsad.gif

Вообще, ноги у этого ограничения растут из ерраты на RM9200 (а пример написан именно для него):
Цитата
The SSC receiver does not support reception of the last data sequence of a frame that overlaps
a new start of frame, regardless of the mode of detection of the start condition. For
example, this prevents reception of the last data of a TDM bus.

На SAM'ах этой ошибки нет, так что должен работать прием для двух каналов.
Daria
Здравствуйте.
Такая проблема - работают два модуля, SSC с кодеком и SPI0 с внешним устройством.
Обмен данными должен идти асинхронно, на разной частоте. но непрерывно.
обмениваюсь через pdc. Прерывания PDC по каналам SPI имеют более высокий приоритет, и мешают обмену с кодеком по SSC unsure.gif
Можно ли как-то перенастроить приоретет прерываний, или запрещать прерывания по каналам SPI во время прерывания от SSC? кто что посоветует?smile.gif
Еще вопрос - приходит прерывание по ENDTX, когда счетчик TCR достигает ноля. хочу прямо в прерывании, не останавливая pdc, переписать TPR и TCR. TPR переписывается, а TCR почему-то нет unsure.gif Приходится сначала записать TXDIS в PTCR, потом переписать, а потом TXEND. но мне нежелательно останавливать обмен. и непонятно, почему нельзя записать новое значение TCR, не останавливая.
вот такие дилетантские вопросы - может, кто поможет? rolleyes.gif
очень жду! laughing.gif
aaarrr
Цитата(Daria @ Mar 14 2010, 14:49) *
Можно ли как-то перенастроить приоретет прерываний, или запрещать прерывания по каналам SPI во время прерывания от SSC? кто что посоветует?smile.gif

Можно, конечно. Но лучше увеличить размер буферов и использовать двойную буферизацию - без нее PDC для непрерывных потоков мало приспособлен. В этом случае приоритет прерываний может быть вообще не важен.
Daria
Цитата(aaarrr @ Mar 14 2010, 20:51) *
Можно, конечно. Но лучше увеличить размер буферов и использовать двойную буферизацию - без нее PDC для непрерывных потоков мало приспособлен. В этом случае приоритет прерываний может быть вообще не важен.

То есть писать адрес нового буфера данных и размер все время в TNPR и TNCR?
aaarrr
Да, именно так.
Daria
Может, не по теме, но продолжение задачиsmile.gif
Кто-нибудь может скинуть алгоритм работы фильтра с конечной импульсной характеристикой?
Короче просто свертку(быстрое преобразование Фурье)smile.gif Надо быстро сделать, а зачем изобретать велосипед? rolleyes.gif
Буду очень благодарна!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.