Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: I2S LPC1758 разделение левого и правого каналов
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
kt368
Здравствуйте!
Я использую модуль I2S МК для получения данных с АЦП PCM4202. МК выступает мастером, он вырабатывает как сигналы выбора правого/левого канала, так и тактовый сигнал для обмена по линии I2S. Эти все сигналы генерируются в блоке передатчика модуля I2S (у меня настроены режимы, описанные на рис. 101 и 109 мануала. Получаю данные по прерывании от I2S модуля, настроив его на генерацию прерываний при заполнении RX FIFO на всю его глубину (8 семплов).
При этом почти всегда в FIFO данные сохранены в следующем порядке:
Код
лев-прав-лев-прав-лев-прав-лев-прав
но иногда бывает так:
Код
прав-лев-прав-лев-прав-лев-прав-лев
Подскажите, как мне настроить систему для однозначного определения, где правый, а где левый каналы?
ig_z
QUOTE (kt368 @ May 17 2014, 20:19) *
Подскажите, как мне настроить систему для однозначного определения, где правый, а где левый каналы?


Наиболее вероятная причина - несинхронная работа с фифо. Т.е. нечетное кол-во лишних и/или недостающих чтений фифо. Что такое "настроить систему для однозначного определения" я не понял. Если есть бага с чтением фифо, её нужно фиксить и все. Как это делать вам никто не подскажет. Никто не видел ваших исходников и никто не знает задушевные тонкости организации I2S модуля.
Простейший совет - перейти на 16 бит режим. Вряд ли в мире много людей, способных различить разницу 16 - 19 бит.
jcxz
Цитата(kt368 @ May 18 2014, 03:29) *
Получаю данные по прерывании от I2S модуля, настроив его на генерацию прерываний при заполнении RX FIFO на всю его глубину (8 семплов).

А Вы уверены, что Ваш ISR успевает считать FIFO до прихода след. слова?
Если Вы настроили срабатывание при полном заполнении FIFO, то у Вас времени всего - одно слово.
Совет - сделайте срабатывание прерывания на половине FIFO.
Ну и конечно - по уму в программе должен быть контроль переполнения. Это как-бы по дефолту должно предусматриваться в корректно написанном ПО.
kt368
Всё, с правым/левым каналом разобрался, после того как всё честно реализовал (в прерывании FIFO данных I2S перекидываются в софтовый буфер) проблема исчезла. Теперь вылезла следующая интересная проблема появилось - при перезапуске программы (перезапитка или ресет в отладчике), результаты АЦП, считываемые из регистров I2S плавают - то влево на 1 разряд сдвиг, то вправо. Из-за этого результат оцифровки то в 2 раза больше реального значения, то меньше. Долго бился, по осциллографу на линиях I2S всё ОК. Пока проблема до конца не решена.
kt368
Ха! Проблема заключалась, как и в соседней теме с подключённым отладчиком J-Link. При многократном перезапуске передёргиванием питания самой платы (без подключения к ней отладчика), показания PCM4202, передаваыемые в ПК по UART всегда одинаковы, сдвиг ровно такой, как должен быть в теории: АЦП отсылает данные в формате Phillips I2S (24 бит), входной буфер I2S модуля LPC1758 - 32 бит, итого 32-24-1(из-за спецификации формата I2S) = 7 младших бит всегда нули. Просто сдвигаю на 7 бит вправо и получаю реальные значения, измеренные АЦП.
jcxz
Цитата(kt368 @ May 27 2014, 04:47) *
Всё, с правым/левым каналом разобрался, после того как всё честно реализовал (в прерывании FIFO данных I2S перекидываются в софтовый буфер)

Имхо - неэффективно так. Если просто копировать без преобразования. Да ещё - в ISR.
А разве I2S не умеет работать через DMA? Ни разу не использовал I2S на LPC...
Если может - оптимальнее настраивать DMA так, чтобы он сразу в этот самый буфер и принимал, без всяких копирований.
Allregia
Цитата(kt368 @ May 30 2014, 21:51)
1259440[/url]']
Ха! Проблема заключалась, как и в соседней теме с подключённым отладчиком J-Link. При многократном перезапуске передёргиванием питания самой платы (без подключения к ней отладчика), показания PCM4202, передаваыемые в ПК по UART всегда одинаковы, сдвиг ровно такой, как должен быть в теории: АЦП отсылает данные в формате Phillips I2S (24 бит), входной буфер I2S модуля LPC1758 - 32 бит, итого 32-24-1(из-за спецификации формата I2S) = 7 младших бит всегда нули. Просто сдвигаю на 7 бит вправо и получаю реальные значения, измеренные АЦП.

Странно, вообще, у меня с подключенным клоном JLink'а все нормально.
kt368
Цитата(jcxz @ May 31 2014, 13:28) *
А разве I2S не умеет работать через DMA? Ни разу не использовал I2S на LPC...
Если может - оптимальнее настраивать DMA так, чтобы он сразу в этот самый буфер и принимал, без всяких копирований.

В I2S модуле есть DMA, но я с ним ещё не работал. Поэтом мне показалось проще через прерывания.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.