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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> SAM7S и I2S кодек, Поделитесь примером
HeOHuKC
сообщение Jun 7 2010, 15:37
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 25-04-09
Из: г. Россошь
Пользователь №: 48 259



С вашим примером то же самое sad.gif пока не могу найти причину, пока FSLEN равен 15 на выходе шум, зато играют два канала.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 7 2010, 15:41
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(HeOHuKC @ Jun 7 2010, 19:37) *
С вашим примером то же самое

Он был вырван из рабочего проекта, поэтому сомневаться в правильности не приходится. А какой сейчас кодек мучаете?
Go to the top of the page
 
+Quote Post
HeOHuKC
сообщение Jun 7 2010, 16:42
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 25-04-09
Из: г. Россошь
Пользователь №: 48 259



Текущий кодек Wolfson WM8714, пробовал ставить Cirrus Logic CS4338, на обоих кодеках такая проблема. Идей пока нету.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 7 2010, 17:46
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



А что с тактированием (MCLK, SCLK)? Выложите свои настройки.
Go to the top of the page
 
+Quote Post
HeOHuKC
сообщение Jun 7 2010, 19:07
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 25-04-09
Из: г. Россошь
Пользователь №: 48 259



Вот
Код
#define EXT_OC          18432000   // Exetrnal ocilator MAINCK
#define MCK             45158400   // MCK (PLLRC )

//cs_startup.c
pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x14) |
                      (AT91C_CKGR_PLLCOUNT & (28<<8)) |
                      (AT91C_CKGR_MUL & (48<<16)));

//dac.c

//Clock 11.2896 Mhz
AT91PS_PMC pPMC = AT91C_BASE_PMC;
pPMC->PMC_PCKR[2] = (AT91C_PMC_PRES_CLK_4 | AT91C_PMC_CSS_PLL_CLK);
*AT91C_PMC_SCER = AT91C_PMC_PCK2;
while( !(*AT91C_PMC_SR & AT91C_PMC_PCK2RDY) );
*AT91C_PIOA_BSR = AT91C_PA18_PCK2;
*AT91C_PIOA_PDR = AT91C_PA18_PCK2;
    ///SSC init
*AT91C_PMC_PCER = (1 << AT91C_ID_SSC); // Enable Clock for SSC controller
*AT91C_SSC_CR = AT91C_SSC_SWRST; // reset
*AT91C_SSC_CMR = 16;
*AT91C_PIOA_PDR = AT91C_PA16_TK | AT91C_PA15_TF | AT91C_PA17_TD;

*AT91C_SSC_TCMR = (15 << 24) | (1 << 16) | AT91C_SSC_START_FALL_RF | AT91C_SSC_CKO_CONTINOUS | AT91C_SSC_CKS_DIV;
// FSOS: negative pulse on TF, DATNB: 1, MSB first, 16 bits
*AT91C_SSC_TFMR = AT91C_SSC_FSOS_NEGATIVE | (16 << 16) | (1 << 8) | AT91C_SSC_MSBF | 15;
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 7 2010, 19:28
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Выходная частота PLL не укладывается в паспортный минимум (80MHz), надо установить вдвое большую и выставить делитель 2 для MCK. Больше криминала не вижу sad.gif
С данными точно все в порядке? Попробуйте синус/пилу подать - по осциллограмме можно будет сориентироваться, что и куда заползает.

Цитата(HeOHuKC @ Jun 7 2010, 20:42) *
Текущий кодек Wolfson WM8714, пробовал ставить Cirrus Logic CS4338, на обоих кодеках такая проблема. Идей пока нету.

Стоп. CS4338 - это же Right Justified, уж не установлен ли и на WM8714 такой же режим? Тогда данные как раз сползут на бит, если подавать честный I2S.
Go to the top of the page
 
+Quote Post
HeOHuKC
сообщение Jun 7 2010, 19:59
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 25-04-09
Из: г. Россошь
Пользователь №: 48 259



У WM8714 стоит I2S режим, это высокий уровень на выводе FORMAT. Если на этом выводе ноль то он разумеется не играет, а просто шипит даже если FSLEN равен 16. Данные гружу с флешки, сначала грузил вместе с заголовком файла, просто в начале был щелчок, сейчас переделал чтоб грузить с заголовка data, но всё также.. Смотрел данные логическим анализатором, при FSLEN 15 переключение фреймов происходит без паузы, если FSLEN 16 то появляется пауза.

Сообщение отредактировал HeOHuKC - Jun 7 2010, 20:34
Go to the top of the page
 
+Quote Post
HeOHuKC
сообщение Jun 10 2010, 13:30
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 25-04-09
Из: г. Россошь
Пользователь №: 48 259



Победил эту фигню, теперь играют два канала smile.gif проблема оказалась в регистре SSC_TCMR, если параметр STTDLY не равен нулю вставляется задержка перед передачей данных. Убрал задержку запел и второй канал, на анализаторе не было заметно никаких пауз.
Выглядит теперь это так
Код
*AT91C_SSC_TCMR = (15 << 24) | (0 << 16) | AT91C_SSC_START_FALL_RF | AT91C_SSC_CKO_CONTINOUS | AT91C_SSC_CKS_DIV;
*AT91C_SSC_TFMR = AT91C_SSC_FSOS_NEGATIVE | (15 << 16) | (1 << 8) | AT91C_SSC_MSBF | 15;
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 10 2010, 16:00
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(HeOHuKC @ Jun 10 2010, 17:30) *
...если параметр STTDLY не равен нулю вставляется задержка перед передачей данных.

У I2S данные относительно LRC задержаны на один такт. То что у вас есть сейчас - это не I2S.
Go to the top of the page
 
+Quote Post
HeOHuKC
сообщение Jun 10 2010, 16:16
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 25-04-09
Из: г. Россошь
Пользователь №: 48 259



Я проблем больше никаких не вижу, возможно это особенность кодека. Т.к всё остальное я перепроверил десяток раз smile.gif у меня еще где то лежит кодек от BurnBrown PCM1742E, спаяю платку и проверю с ним smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 5th August 2025 - 08:47
Рейтинг@Mail.ru


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