|
SAM7S и I2S кодек, Поделитесь примером |
|
|
|
May 30 2010, 21:42
|

Участник

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

|
Здравствуйте уважаемые форумчане! Третий день бьюсь с подключением к SAM7S I2S кодека, все делаю по апноту от атмела, а он отказываеться петь. Сто раз проверял сигналы на SSC порту логическим анализатором, все данные идут, частоты совпадают. WAV файл читаеться с флешки, файл тоже подготовлен тот, что нужно. Может кто поделится примером, для кодеков с внешним тактированием. Ибо уже сил никаких нету, кодек у меня используется Wolfson WM8714ED.
Сообщение отредактировал HeOHuKC - May 30 2010, 21:43
|
|
|
|
|
May 30 2010, 21:57
|
Гуру
     
Группа: Свой
Сообщений: 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 }
|
|
|
|
|
Jun 3 2010, 19:57
|

Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 3 2010, 20:51
|
Гуру
     
Группа: Свой
Сообщений: 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, это же будет частота кварца ? Да, кварца.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|