Перейти к содержанию
    

I2S LPC1758 разделение левого и правого каналов

Здравствуйте!

Я использую модуль I2S МК для получения данных с АЦП PCM4202. МК выступает мастером, он вырабатывает как сигналы выбора правого/левого канала, так и тактовый сигнал для обмена по линии I2S. Эти все сигналы генерируются в блоке передатчика модуля I2S (у меня настроены режимы, описанные на рис. 101 и 109 мануала. Получаю данные по прерывании от I2S модуля, настроив его на генерацию прерываний при заполнении RX FIFO на всю его глубину (8 семплов).

При этом почти всегда в FIFO данные сохранены в следующем порядке:

лев-прав-лев-прав-лев-прав-лев-прав

но иногда бывает так:

прав-лев-прав-лев-прав-лев-прав-лев

Подскажите, как мне настроить систему для однозначного определения, где правый, а где левый каналы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, как мне настроить систему для однозначного определения, где правый, а где левый каналы?

 

Наиболее вероятная причина - несинхронная работа с фифо. Т.е. нечетное кол-во лишних и/или недостающих чтений фифо. Что такое "настроить систему для однозначного определения" я не понял. Если есть бага с чтением фифо, её нужно фиксить и все. Как это делать вам никто не подскажет. Никто не видел ваших исходников и никто не знает задушевные тонкости организации I2S модуля.

Простейший совет - перейти на 16 бит режим. Вряд ли в мире много людей, способных различить разницу 16 - 19 бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получаю данные по прерывании от I2S модуля, настроив его на генерацию прерываний при заполнении RX FIFO на всю его глубину (8 семплов).

А Вы уверены, что Ваш ISR успевает считать FIFO до прихода след. слова?

Если Вы настроили срабатывание при полном заполнении FIFO, то у Вас времени всего - одно слово.

Совет - сделайте срабатывание прерывания на половине FIFO.

Ну и конечно - по уму в программе должен быть контроль переполнения. Это как-бы по дефолту должно предусматриваться в корректно написанном ПО.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё, с правым/левым каналом разобрался, после того как всё честно реализовал (в прерывании FIFO данных I2S перекидываются в софтовый буфер) проблема исчезла. Теперь вылезла следующая интересная проблема появилось - при перезапуске программы (перезапитка или ресет в отладчике), результаты АЦП, считываемые из регистров I2S плавают - то влево на 1 разряд сдвиг, то вправо. Из-за этого результат оцифровки то в 2 раза больше реального значения, то меньше. Долго бился, по осциллографу на линиях I2S всё ОК. Пока проблема до конца не решена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ха! Проблема заключалась, как и в соседней теме с подключённым отладчиком J-Link. При многократном перезапуске передёргиванием питания самой платы (без подключения к ней отладчика), показания PCM4202, передаваыемые в ПК по UART всегда одинаковы, сдвиг ровно такой, как должен быть в теории: АЦП отсылает данные в формате Phillips I2S (24 бит), входной буфер I2S модуля LPC1758 - 32 бит, итого 32-24-1(из-за спецификации формата I2S) = 7 младших бит всегда нули. Просто сдвигаю на 7 бит вправо и получаю реальные значения, измеренные АЦП.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё, с правым/левым каналом разобрался, после того как всё честно реализовал (в прерывании FIFO данных I2S перекидываются в софтовый буфер)

Имхо - неэффективно так. Если просто копировать без преобразования. Да ещё - в ISR.

А разве I2S не умеет работать через DMA? Ни разу не использовал I2S на LPC...

Если может - оптимальнее настраивать DMA так, чтобы он сразу в этот самый буфер и принимал, без всяких копирований.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1259440[/url]']

Ха! Проблема заключалась, как и в соседней теме с подключённым отладчиком J-Link. При многократном перезапуске передёргиванием питания самой платы (без подключения к ней отладчика), показания PCM4202, передаваыемые в ПК по UART всегда одинаковы, сдвиг ровно такой, как должен быть в теории: АЦП отсылает данные в формате Phillips I2S (24 бит), входной буфер I2S модуля LPC1758 - 32 бит, итого 32-24-1(из-за спецификации формата I2S) = 7 младших бит всегда нули. Просто сдвигаю на 7 бит вправо и получаю реальные значения, измеренные АЦП.

Странно, вообще, у меня с подключенным клоном JLink'а все нормально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А разве I2S не умеет работать через DMA? Ни разу не использовал I2S на LPC...

Если может - оптимальнее настраивать DMA так, чтобы он сразу в этот самый буфер и принимал, без всяких копирований.

В I2S модуле есть DMA, но я с ним ещё не работал. Поэтом мне показалось проще через прерывания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...