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

 
 
> SAM7S и I2S кодек, Поделитесь примером
HeOHuKC
сообщение May 30 2010, 21:42
Сообщение #1


Участник
*

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



Здравствуйте уважаемые форумчане!
Третий день бьюсь с подключением к SAM7S I2S кодека, все делаю по апноту от атмела, а он отказываеться петь. Сто раз проверял сигналы на SSC порту логическим анализатором, все данные идут, частоты совпадают. WAV файл читаеться с флешки, файл тоже подготовлен тот, что нужно. Может кто поделится примером, для кодеков с внешним тактированием. Ибо уже сил никаких нету, кодек у меня используется Wolfson WM8714ED.

Сообщение отредактировал HeOHuKC - May 30 2010, 21:43
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 24)
aaarrr
сообщение May 30 2010, 21:57
Сообщение #2


Гуру
******

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



Цитата(HeOHuKC @ May 31 2010, 01:42) *
Сто раз проверял сигналы на SSC порту логическим анализатором, все данные идут, частоты совпадают.

Ну если так, то, может, и не в SSC дело?

Цитата(HeOHuKC @ May 31 2010, 01:42) *
Может кто поделится примером, для кодеков с внешним тактированием.

Если под кодеком с внешним тактированием понимается кодек в режиме slave, то пожалуйста. Замечательно поет через CS4344:

CODE

void ssc_start_i2s(void)
{
audio_pll_sw(1); // Switch to I2S clock

AT91C_BASE_PMC->PMC_PCER = 1UL << AT91C_ID_SSC;

AT91C_BASE_SSC->SSC_CR = AT91C_SSC_SWRST;

AT91C_BASE_SSC->SSC_CMR = 16; // MCK / 32

// PERIOD: 32, STTDLY: 1, START: falling edge on TF, CKO: continuous, CKS: TK
AT91C_BASE_SSC->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_BASE_SSC->SSC_TFMR = AT91C_SSC_FSOS_NEGATIVE | (15 << 16) | (1 << 8) | AT91C_SSC_MSBF | 15;

AT91C_BASE_SSC->SSC_TPR = (u_int)&audio_tx_buffer[0][0];
AT91C_BASE_SSC->SSC_TCR = AUDIO_BUFFER_SAMPLES_PER_CH * 2;
AT91C_BASE_SSC->SSC_TNPR = (u_int)&audio_tx_buffer[1][0];
AT91C_BASE_SSC->SSC_TNCR = AUDIO_BUFFER_SAMPLES_PER_CH * 2;
AT91C_BASE_SSC->SSC_PTCR = AT91C_PDC_TXTEN;

AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SSC] = PRIOR_SSC;
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SSC] = (u_int)ssc_irq_handler;
AT91C_BASE_AIC->AIC_IECR = 1UL << AT91C_ID_SSC;

AT91C_BASE_SSC->SSC_IER = AT91C_SSC_ENDTX;

AT91C_BASE_SSC->SSC_CR = AT91C_SSC_TXEN;

*AT91C_PMC_SCER = AT91C_PMC_PCK1; // Enable MCLK
}
Go to the top of the page
 
+Quote Post
HeOHuKC
сообщение May 30 2010, 22:33
Сообщение #3


Участник
*

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



aaarrr Спасибо, завтра опробую ваш код в действии wink.gif , камень у вас работает от кварца 18.432 мГц ? Просто там точных частот с таким кварцем не получить, и воспроизведение будет бежать чуть быстрее чем надо. Меня еще смутила фраза в даташите на мой кодек WM8714, что при не совпадении частоты тактирования и частоты семплирования кодек отключает ЦАПы.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 30 2010, 22:42
Сообщение #4


Гуру
******

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



Цитата(HeOHuKC @ May 31 2010, 02:33) *
камень у вас работает от кварца 18.432 мГц ? Просто там точных частот с таким кварцем не получить, и воспроизведение будет бежать чуть быстрее чем надо

Никаких несовпадений: PLL настроена на 45.1584МГц, Fs = MCK/1024 = 44100Гц.
Go to the top of the page
 
+Quote Post
HeOHuKC
сообщение May 30 2010, 22:45
Сообщение #5


Участник
*

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



Понятно, попробую поиграться с частотами smile.gif Еще раз спасибо.
Go to the top of the page
 
+Quote Post
HeOHuKC
сообщение Jun 3 2010, 19:57
Сообщение #6


Участник
*

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



Что то никак не хочет петь мой кодек, вообщем решил я выбрать частоту дискретизации 48кГц. Кварц стоит на 18.432 мГц, через вывод PA31(PCK2) идет тактирование на кодек, при такой частоте кварца это 48 кГц (384fs). Я уже совсем ничего не пойму, анализатором всё проверил, данные идут, клок есть. Не понимаю что ему еще надо, может есть какие то нюансы которые я не учел ?
Код
Код
#define SLOT_BY_FRAME 2
#define BITS_BY_SLOT 16
#define FILE_SAMPLING_FREQ 48000

#define IRQ_LEVEL_I2S    5





void dac_init(void)
{    
///Clock 12 Mhz
    AT91PS_PMC pPMC = AT91C_BASE_PMC;

    pPMC->PMC_PCKR[2] = (AT91C_PMC_PRES_CLK | AT91C_PMC_CSS_MAIN_CLK);
    *AT91C_PMC_SCER = AT91C_PMC_PCK2;
    while( !(*AT91C_PMC_SR & AT91C_PMC_PCK2RDY) );
    *AT91C_PIOA_BSR = AT91C_PA31_PCK2;
    *AT91C_PIOA_PDR = AT91C_PA31_PCK2;
///SSC init
*AT91C_PIOA_PDR = AT91C_PA16_TK | AT91C_PA15_TF | AT91C_PA17_TD;
AT91F_SSC_CfgPMC();
*AT91C_SSC_CR = AT91C_SSC_SWRST;

AT91F_PDC_Close((AT91PS_PDC) & (AT91C_BASE_SSC->SSC_RPR));

AT91F_SSC_SetBaudrate(AT91C_BASE_SSC,MCK,FILE_SAMPLING_FREQ*(BITS_BY_SLOT*SLOT_BY_FRAME));

*AT91C_SSC_TFMR = (AT91C_SSC_FSOS_NEGATIVE | (((BITS_BY_SLOT-1)<<16) & AT91C_SSC_FSLEN)
         | (((SLOT_BY_FRAME-1)<<8) & AT91C_SSC_DATNB) | AT91C_SSC_MSBF | (BITS_BY_SLOT-1) );

*AT91C_SSC_TCMR = (((((BITS_BY_SLOT*SLOT_BY_FRAME)/2) -1) <<24) | ((1<<16) & AT91C_SSC_STTDLY) |
            AT91C_SSC_START_FALL_RF | AT91C_SSC_CKO_CONTINOUS| AT91C_SSC_CKS_DIV);

AT91F_PDC_SetTx ((AT91PS_PDC) &(AT91C_BASE_SSC->SSC_RPR),        // PDC SSC base address
                     (char *)wav_file,    // pointer to data
                     wav_size/2);// Number of 16 bits words

AT91F_PDC_SetNextTx ((AT91PS_PDC) &(AT91C_BASE_SSC->SSC_RPR),    // PDC SSC base address
                         (char *)wav_file,     // pointer to next data
                         wav_size/2);

*AT91C_SSC_PTCR = AT91C_PDC_TXTEN;
*AT91C_SSC_PTSR == AT91C_PDC_TXTEN;

AT91F_SSC_EnableTx (AT91C_BASE_SSC);

}


Сообщение отредактировал HeOHuKC - Jun 3 2010, 19:59
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 3 2010, 20:09
Сообщение #7


Гуру
******

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



Цитата(HeOHuKC @ Jun 3 2010, 23:57) *
Не понимаю что ему еще надо, может есть какие то нюансы которые я не учел ?

Если данные идут правильно, а кодек совсем молчит, то остается предположить какой-нибудь косяк в подключении. На MUTE, например, высокий уровень, или что-то столь же глобальное.
Go to the top of the page
 
+Quote Post
HeOHuKC
сообщение Jun 3 2010, 20:21
Сообщение #8


Участник
*

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



Mute точно правильно подключен и интерфейс на кодеке выбран I2S. Звуков никаких он не издает вообще sad.gif
В исходнике инициализация SSC правильно сделана ? И еще вопрос по поводу AT91C_PMC_CSS_MAIN_CLK, это же будет частота кварца ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 3 2010, 20:51
Сообщение #9


Гуру
******

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



Цитата(HeOHuKC @ Jun 4 2010, 00:21) *
В исходнике инициализация SSC правильно сделана ?

При MCLK = 18.432MHz и MCK = 48MHz, тут и близко не будет требуемых кодеком +/-8 тактов MCLK:
Код
AT91F_SSC_SetBaudrate(AT91C_BASE_SSC,MCK,FILE_SAMPLING_FREQ*(BITS_BY_SLOT*SLOT_BY_FRAME));

Кстати, советую ознакомиться с исходником данной функции, чтобы в полной мере насладиться прелестями индусского кода.
Настоятельно рекомендую избегать использования убогой атмеловской "либы".

Цитата(HeOHuKC @ Jun 4 2010, 00:21) *
И еще вопрос по поводу AT91C_PMC_CSS_MAIN_CLK, это же будет частота кварца ?

Да, кварца.
Go to the top of the page
 
+Quote Post
HeOHuKC
сообщение Jun 3 2010, 22:16
Сообщение #10


Участник
*

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



Спасибо, за информацию smile.gif Исходник видел biggrin.gif , у меня до этого было сделано не так, это из атмеловского примера взял. Я нашел кодек от Cirrus Logic, там есть автоматическая генерация SCLK пока мучаю его. Пока не могу придумать какой кварц применить, чтоб и ядро работало на нормальной частоте и кодек не возмущался. До этого просто дела с I2S вообще не имел, первый опыт и пока не очень удачный sad.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 3 2010, 22:25
Сообщение #11


Гуру
******

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



Цитата(HeOHuKC @ Jun 4 2010, 02:16) *
Пока не могу придумать какой кварц применить, чтоб и ядро работало на нормальной частоте и кодек не возмущался.

Нормальная частота для ядра - это 48.0MHz? Я имею в виду, ограничения на тактовую (USB и т.п.) в системе есть?

А то для первого кодека вполне можно было бы выбрать MCK=49.152MHz при кварце 18.432MHz.
Go to the top of the page
 
+Quote Post
HeOHuKC
сообщение Jun 3 2010, 23:15
Сообщение #12


Участник
*

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



На USB уже плюнул, теперь выставил PLL на такую же частоту как в вашем проекте, кодек стал шуметь smile.gif буду разбираться дальше. Спасибо Вам smile.gif
Go to the top of the page
 
+Quote Post
HeOHuKC
сообщение Jun 4 2010, 00:26
Сообщение #13


Участник
*

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



Всё запустил играет smile.gif но есть огромнейшая проблема. Шум, очень громкий, а сам сигнал на его фоне тихий. Похоже на проблемы с частотой дискретизации.
Go to the top of the page
 
+Quote Post
HeOHuKC
сообщение Jun 5 2010, 19:51
Сообщение #14


Участник
*

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



Уже мозг сломал, выставляю FSLEN равный 16, играет один канал без шума и чисто, ставлю FSLEN 15 (как во всех примерах) кодек начинает ужасно шипеть но играют два канала. Что это может быть, частота дискретизации точно совпадает с нужной кодеку.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 5 2010, 21:41
Сообщение #15


Гуру
******

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



Цитата(HeOHuKC @ Jun 5 2010, 23:51) *
Что это может быть, частота дискретизации точно совпадает с нужной кодеку.

Данные смещены на один бит, судя по всему. Возьмите настройки из моего примера - там точно играют два канала.
Go to the top of the page
 
+Quote Post
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 Текстовая версия Сейчас: 22nd July 2025 - 10:39
Рейтинг@Mail.ru


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