Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите с I2S на LPC2478
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Oleg_IT
Взял пример http://electronix.ru/forum/index.php?act=a...st&id=34513, единственный который удалось найти в инете. Убрал вход I2S, подключил DMA (#define I2S_DMA_ENABLED 0), в выходной буфер DMA сгенерил синус. На выходе получаю только один период соответствующий размеру буфера.
1. В примере прерывание от I2S разрешается только когда нет DMA. В обработчике реализован только приём данных. Это правильно?
2. Как возобновить проигрывание буфера?
3. I2SDMAx. Что означает rx_depth_dma, trx_depth_dma?
4. I2SIRQ. Что означает rx_depth_Irq, tx_depth_Irq?
5. I2SSTATE. Что означает dmareq1, dmareq2, rx_level, tx_level?
6. Есть ЦАП с входными пинами SCK, BCK, DATA, LBCK. Им соответствуют пины LPC, I2STX_CLK – BCK, I2STX_WS – LBCK, I2STX_SDA – DATA. А куда подключать SCK?
7. Самое главное. Есть документ, где обо всем этом подробно и толково изложено. И вообще обо всех интерфейсах.
DpInRock
7. Самое главное - сей документ называется UM10237. User Manual LPC2478.
Oleg_IT
Этот замечательный документ у меня есть. А есть что-то по подробнее про программирование интерфейсов для LPC?
DpInRock
В этом документе большими буквами написаны ответы на ВСЕ ваши вопросы. Причем, абсолютно на все.

Программирование интерфесов для LPC в частности, ничем не отличается от программирования интерфейсов вообще.
Они все одинаковые, за исключением мелких деталей реализации. Ибо эти интерфейсы подключаются к другим микросхемам, которые подключаются не только к LPC.

Но, к сожалению, даташиты от NXP устроены так, что их нужно читать от начала до конца, как детектив. Иначе не поймешь кто убийца.
Oleg_IT
Цитата(DpInRock @ Jan 8 2011, 12:42) *
Но, к сожалению, даташиты от NXP устроены так, что их нужно читать от начала до конца, как детектив. Иначе не поймешь кто убийца.

Да, я это начинаю понимать, информация распределена тонким слоем по всему документу. Как было просто с AVR. Но может есть специализированные документы, где конкретно программирование каждого интерфейса расписано, не хочется много время на стандартные вещи тратить. Есть же примеры в RL-ARM, но почему то не для всех интерфейсов.
IgorKossak
Sample Code Bundle for LPC23xx/LPC24xx Peripherals using Keil's μVision V1.60 (Mar 10, 2009)
Здесь смотрели?
Хотя да, именно оттуда и взят приведённый Вами пример. Но если Вас интересуют именно ВСЕ интерфейсы, то это оно (всего понемногу) rolleyes.gif
карабас
Цитата(Oleg_IT @ Jan 7 2011, 19:21) *
А куда подключать SCK?


Ну, это очинно сильно!!!

А если по хорошему, то:
i2s у LPC весьма не плох и очень прост в использовании, это ж Филлипс.
в DMA режиме сложно сделать поддержку некоторых режимов, например 20 или 24 бита на канал, но фифо сильно выручает.
Топик- стартеру: читайте аппноты.

Oleg_IT
Цитата(IgorKossak @ Jan 8 2011, 23:36) *
Здесь смотрели?

Спасибо за ссылку, интересно.

Цитата(карабас @ Jan 10 2011, 23:22) *
А если по хорошему, то:
i2s у LPC весьма не плох и очень прост в использовании, это ж Филлипс.
в DMA режиме сложно сделать поддержку некоторых режимов, например 20 или 24 бита на канал, но фифо сильно выручает.

Я не говорил, что i2s плох и сложен. Просто есть вопросы.
По спецификации I2S имеет три линии, синхронизация, выбор канала, данные. Только в некоторых источниках есть ещё упоминание о сигнале синхронизации кадра. (например http://www.n-audio.com/articles/i2s.htm). Где-то была информация, что на это пин нужно подавать слок в сколько-то раз меньше чем синхронизация. В LPC я этого клока не вижу. Как правильно это делать?

Цитата(карабас @ Jan 10 2011, 23:22) *
Ну, это очинно сильно!!!

Топик- стартеру: читайте аппноты.

Это тоже не слабоsm.gif Этим я и занимаюсь. Я прошу, для экономии времени, направить меня в правильном направлении, где те самые аппноты находятся.
sonycman
Тоже сейчас запускаю I2S (LPC1768 с TLV370DAC23).
Как понял, ЦАПЫ могут хотеть до четырёх сигналов (в режиме слэйва):
1. MCLK (Master Clock) - тактирование самого ЦАПА, частота, к примеру, 256*Fs.
2. BCLK (Bit Clock) - тактовая битового потока данных, к примеру, MCLK/4.
3. WS (Word Select) - выбор слова (сэмпла), к примеру, правый/левый каналы.
4. DATA - непосредственно битовый поток.
Dron_Gus
Вот тут я выкладывал код для lpc1768 и tlv320. Думаю, модуль i2s не сильно отличается. Правда позже народ нашел в нем баг. Но для начала сойдет.
карабас
форум забивать не хочу, если что-то не понятно по квадратной шине , прошу в почту jem<XXXXXXXX>udm.ru
могу помочь разжевыванием даташита на i2s и примерами на lpc и atmel arm7.
Саша.
sonycman
Как считаете, уважаемые, каким размером установить Burst Size для загрузки FIFO I2S модуля LPC1768 с помощью DMA?
При размере FIFO в 8 слов (каждое по 32 бита, 32 байта всего), думаю, или 4 слова, или 8 будет ОК?
sysel
Вот не вразумлю одну вещь:

У меня есть ЦАП AD1955 и процессор LPC1768.. На I2S шине ЦАП полнейший слейв.
Хочу его затактировать от внешней PLL (вход MCLK).

При этом вопрос: как правильно формировать битовый клок (BCLK) чтоб не было рассинхронизации по отсчетам.
Так и не понял, на какой вывод LPC1768 можно принять MCLK, так чтобы обеспечить BCLK = MCLK/4 и LR_CLOCK соответствующий.
sonycman
Цитата(sysel @ Jan 15 2011, 00:39) *
Вот не вразумлю одну вещь:

У меня есть ЦАП AD1955 и процессор LPC1768.. На I2S шине ЦАП полнейший слейв.
Хочу его затактировать от внешней PLL (вход MCLK).

При этом вопрос: как правильно формировать битовый клок (BCLK) чтоб не было рассинхронизации по отсчетам.
Так и не понял, на какой вывод LPC1768 можно принять MCLK, так чтобы обеспечить BCLK = MCLK/4 и LR_CLOCK соответствующий.

А зачем принимать MCLK на LPC откуда-то снаружи, когда можно генерировать его прямо внутри контроллера с помощью дробного делителя?

Дальше настраиваете I2S под ваш ЦАП, ставите делитель для BCLK на 4 (tx_bitrate) и указываете правильный ws_halfperiod в зависимости от разрядности сэмплов.

К примеру, для воспроизведения файла .wav в формате PCM стерео 44100 Гц 16 бит и если ЦАП требует для себя MCLK, равное частоте 256*Fs (11289600 Гц) и BCK равное MCLK/4 (I2STXBITRATE = 3), то ws_halfperiod получается равным 64/2-1 = 31.

Вот хорошая иллюстрация I2S TX мастера у LPC1768:
Нажмите для просмотра прикрепленного файла
sysel
Цитата(sonycman @ Jan 15 2011, 01:07) *
А зачем принимать MCLK на LPC откуда-то снаружи, когда можно генерировать его прямо внутри контроллера с помощью дробного делителя?


Снаружи хочу. У меня будут использоваться не стандартные частоты. К тому же для обеспечения малого THD клок должен быть с очень малым джиттером.
sonycman
Цитата(sysel @ Jan 15 2011, 01:19) *
Снаружи хочу. У меня будут использоваться не стандартные частоты. К тому же для обеспечения малого THD клок должен быть с очень малым джиттером.

Хм, хитро.
Тогда что, если попробовать совместить два вот этих режима:
Нажмите для просмотра прикрепленного файла
Заводите клок на I2SRX_CLK, и юзаете его как RX_REF для передатчика.
sysel
Спасибо за идею! Попробовать стоит.
Oleg_IT
Спасибо всем откликнувшимся.
Работу с картой ускорил, но можно ещё быстрее. Для этого мне нужно разобраться в значениях некоторых константах и полях структур MMCFG, DCACHE (файл File_Config.h)
/* MMC device configuration */
typedef struct mmcfg {
U32 sernum;
U32 blocknr;
U16 read_blen;
U16 write_blen;
} MMCFG;
и
/* Data Sector Caching structure */
typedef struct dcache {
U32 sect;
U32 csect;
U8 *buf;
U8 *cbuf;
U8 nwr;
U8 nrd;
} DCACHE;
Значение некоторых полей понятны, но не все.

Константы такие:
#define MSC_BlockSize 512
#define MSC_BlockGroup 8
Их значение определено внутренностями карт и не могут меняться?
В файле MCI_LPC24xx.c в инициализации DMA есть две строки
GPDMA_CH0_CTRL = (512 >> 2) | (0x02 << 12) | (0x02 << 15) |
(0x02 << 18) | (0x02 << 21) | (1 << 27) | (1u << 31);
Число 512 это та же самая величина, что и MSC_BlockSize?

Есть функции read_cache(…) и write_cache(…). Как их можно использовать для ускорения обмена с картой?


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.