реклама на сайте
подробности

 
 
> I2S LPC1758 разделение левого и правого каналов
kt368
сообщение May 17 2014, 17:19
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Здравствуйте!
Я использую модуль I2S МК для получения данных с АЦП PCM4202. МК выступает мастером, он вырабатывает как сигналы выбора правого/левого канала, так и тактовый сигнал для обмена по линии I2S. Эти все сигналы генерируются в блоке передатчика модуля I2S (у меня настроены режимы, описанные на рис. 101 и 109 мануала. Получаю данные по прерывании от I2S модуля, настроив его на генерацию прерываний при заполнении RX FIFO на всю его глубину (8 семплов).
При этом почти всегда в FIFO данные сохранены в следующем порядке:
Код
лев-прав-лев-прав-лев-прав-лев-прав
но иногда бывает так:
Код
прав-лев-прав-лев-прав-лев-прав-лев
Подскажите, как мне настроить систему для однозначного определения, где правый, а где левый каналы?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
ig_z
сообщение May 18 2014, 08:06
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



QUOTE (kt368 @ May 17 2014, 20:19) *
Подскажите, как мне настроить систему для однозначного определения, где правый, а где левый каналы?


Наиболее вероятная причина - несинхронная работа с фифо. Т.е. нечетное кол-во лишних и/или недостающих чтений фифо. Что такое "настроить систему для однозначного определения" я не понял. Если есть бага с чтением фифо, её нужно фиксить и все. Как это делать вам никто не подскажет. Никто не видел ваших исходников и никто не знает задушевные тонкости организации I2S модуля.
Простейший совет - перейти на 16 бит режим. Вряд ли в мире много людей, способных различить разницу 16 - 19 бит.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 25 2014, 22:42
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(kt368 @ May 18 2014, 03:29) *
Получаю данные по прерывании от I2S модуля, настроив его на генерацию прерываний при заполнении RX FIFO на всю его глубину (8 семплов).

А Вы уверены, что Ваш ISR успевает считать FIFO до прихода след. слова?
Если Вы настроили срабатывание при полном заполнении FIFO, то у Вас времени всего - одно слово.
Совет - сделайте срабатывание прерывания на половине FIFO.
Ну и конечно - по уму в программе должен быть контроль переполнения. Это как-бы по дефолту должно предусматриваться в корректно написанном ПО.
Go to the top of the page
 
+Quote Post
kt368
сообщение May 26 2014, 18:37
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Всё, с правым/левым каналом разобрался, после того как всё честно реализовал (в прерывании FIFO данных I2S перекидываются в софтовый буфер) проблема исчезла. Теперь вылезла следующая интересная проблема появилось - при перезапуске программы (перезапитка или ресет в отладчике), результаты АЦП, считываемые из регистров I2S плавают - то влево на 1 разряд сдвиг, то вправо. Из-за этого результат оцифровки то в 2 раза больше реального значения, то меньше. Долго бился, по осциллографу на линиях I2S всё ОК. Пока проблема до конца не решена.
Go to the top of the page
 
+Quote Post
kt368
сообщение May 30 2014, 15:41
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Ха! Проблема заключалась, как и в соседней теме с подключённым отладчиком J-Link. При многократном перезапуске передёргиванием питания самой платы (без подключения к ней отладчика), показания PCM4202, передаваыемые в ПК по UART всегда одинаковы, сдвиг ровно такой, как должен быть в теории: АЦП отсылает данные в формате Phillips I2S (24 бит), входной буфер I2S модуля LPC1758 - 32 бит, итого 32-24-1(из-за спецификации формата I2S) = 7 младших бит всегда нули. Просто сдвигаю на 7 бит вправо и получаю реальные значения, измеренные АЦП.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 31 2014, 06:18
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(kt368 @ May 27 2014, 04:47) *
Всё, с правым/левым каналом разобрался, после того как всё честно реализовал (в прерывании FIFO данных I2S перекидываются в софтовый буфер)

Имхо - неэффективно так. Если просто копировать без преобразования. Да ещё - в ISR.
А разве I2S не умеет работать через DMA? Ни разу не использовал I2S на LPC...
Если может - оптимальнее настраивать DMA так, чтобы он сразу в этот самый буфер и принимал, без всяких копирований.
Go to the top of the page
 
+Quote Post
Allregia
сообщение May 31 2014, 11:36
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(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'а все нормально.
Go to the top of the page
 
+Quote Post
kt368
сообщение Jun 1 2014, 06:25
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



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

В I2S модуле есть DMA, но я с ним ещё не работал. Поэтом мне показалось проще через прерывания.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 09:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01604 секунд с 7
ELECTRONIX ©2004-2016