kt368 0 17 мая, 2014 Опубликовано 17 мая, 2014 · Жалоба Здравствуйте! Я использую модуль I2S МК для получения данных с АЦП PCM4202. МК выступает мастером, он вырабатывает как сигналы выбора правого/левого канала, так и тактовый сигнал для обмена по линии I2S. Эти все сигналы генерируются в блоке передатчика модуля I2S (у меня настроены режимы, описанные на рис. 101 и 109 мануала. Получаю данные по прерывании от I2S модуля, настроив его на генерацию прерываний при заполнении RX FIFO на всю его глубину (8 семплов). При этом почти всегда в FIFO данные сохранены в следующем порядке: лев-прав-лев-прав-лев-прав-лев-прав но иногда бывает так: прав-лев-прав-лев-прав-лев-прав-лев Подскажите, как мне настроить систему для однозначного определения, где правый, а где левый каналы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ig_z 0 18 мая, 2014 Опубликовано 18 мая, 2014 · Жалоба Подскажите, как мне настроить систему для однозначного определения, где правый, а где левый каналы? Наиболее вероятная причина - несинхронная работа с фифо. Т.е. нечетное кол-во лишних и/или недостающих чтений фифо. Что такое "настроить систему для однозначного определения" я не понял. Если есть бага с чтением фифо, её нужно фиксить и все. Как это делать вам никто не подскажет. Никто не видел ваших исходников и никто не знает задушевные тонкости организации I2S модуля. Простейший совет - перейти на 16 бит режим. Вряд ли в мире много людей, способных различить разницу 16 - 19 бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 25 мая, 2014 Опубликовано 25 мая, 2014 · Жалоба Получаю данные по прерывании от I2S модуля, настроив его на генерацию прерываний при заполнении RX FIFO на всю его глубину (8 семплов). А Вы уверены, что Ваш ISR успевает считать FIFO до прихода след. слова? Если Вы настроили срабатывание при полном заполнении FIFO, то у Вас времени всего - одно слово. Совет - сделайте срабатывание прерывания на половине FIFO. Ну и конечно - по уму в программе должен быть контроль переполнения. Это как-бы по дефолту должно предусматриваться в корректно написанном ПО. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kt368 0 26 мая, 2014 Опубликовано 26 мая, 2014 · Жалоба Всё, с правым/левым каналом разобрался, после того как всё честно реализовал (в прерывании FIFO данных I2S перекидываются в софтовый буфер) проблема исчезла. Теперь вылезла следующая интересная проблема появилось - при перезапуске программы (перезапитка или ресет в отладчике), результаты АЦП, считываемые из регистров I2S плавают - то влево на 1 разряд сдвиг, то вправо. Из-за этого результат оцифровки то в 2 раза больше реального значения, то меньше. Долго бился, по осциллографу на линиях I2S всё ОК. Пока проблема до конца не решена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kt368 0 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба Ха! Проблема заключалась, как и в соседней теме с подключённым отладчиком J-Link. При многократном перезапуске передёргиванием питания самой платы (без подключения к ней отладчика), показания PCM4202, передаваыемые в ПК по UART всегда одинаковы, сдвиг ровно такой, как должен быть в теории: АЦП отсылает данные в формате Phillips I2S (24 бит), входной буфер I2S модуля LPC1758 - 32 бит, итого 32-24-1(из-за спецификации формата I2S) = 7 младших бит всегда нули. Просто сдвигаю на 7 бит вправо и получаю реальные значения, измеренные АЦП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 31 мая, 2014 Опубликовано 31 мая, 2014 · Жалоба Всё, с правым/левым каналом разобрался, после того как всё честно реализовал (в прерывании FIFO данных I2S перекидываются в софтовый буфер) Имхо - неэффективно так. Если просто копировать без преобразования. Да ещё - в ISR. А разве I2S не умеет работать через DMA? Ни разу не использовал I2S на LPC... Если может - оптимальнее настраивать DMA так, чтобы он сразу в этот самый буфер и принимал, без всяких копирований. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 31 мая, 2014 Опубликовано 31 мая, 2014 · Жалоба 1259440[/url]'] Ха! Проблема заключалась, как и в соседней теме с подключённым отладчиком J-Link. При многократном перезапуске передёргиванием питания самой платы (без подключения к ней отладчика), показания PCM4202, передаваыемые в ПК по UART всегда одинаковы, сдвиг ровно такой, как должен быть в теории: АЦП отсылает данные в формате Phillips I2S (24 бит), входной буфер I2S модуля LPC1758 - 32 бит, итого 32-24-1(из-за спецификации формата I2S) = 7 младших бит всегда нули. Просто сдвигаю на 7 бит вправо и получаю реальные значения, измеренные АЦП. Странно, вообще, у меня с подключенным клоном JLink'а все нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kt368 0 1 июня, 2014 Опубликовано 1 июня, 2014 · Жалоба А разве I2S не умеет работать через DMA? Ни разу не использовал I2S на LPC... Если может - оптимальнее настраивать DMA так, чтобы он сразу в этот самый буфер и принимал, без всяких копирований. В I2S модуле есть DMA, но я с ним ещё не работал. Поэтом мне показалось проще через прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться