Я внаглую от PLLI2S затактировал. Сейчас проверять буду.
Код:
void SetI2SMCLK(uint32_t freq) { uint32_t I2SFREQ[] = { 44100, 48000, 88200, 96000 , 176400, 192000 };
uint32_t PLLI2SN[] = { 271, 295, 271, 295, 361, 393 };
uint32_t PLLI2SR[] = { 6, 4, 3, 2, 2,2 };
/*
uint32_t I2SDIV[]={6,13,3,3,3,9,3};
uint32_t I2SODD[]={0,1,1,1,1,0};
*/
uint32_t I2SDIV[] = {2,3,2,3,2,2 };
uint32_t I2SODD[] = {0,0,0,0,0,0 };
uint8_t index = 0;
while ((freq != I2SFREQ[index]) && index < 7)
index++;
if (index==6) return;
/******************************************************************************/
/* I2S clock configuration */
/******************************************************************************/
//External clock is used as i2s master clk
RCC->CR &= ~((uint32_t)RCC_CR_PLLI2SON);
/* Configure PLLI2S */
RCC->PLLI2SCFGR = (PLLI2SN[index] << 6) | (PLLI2SR[index] << 28);
// /* Enable PLLI2S */
RCC->CR |= ((uint32_t)RCC_CR_PLLI2SON);
/* Wait till PLLI2S is ready */
while((RCC->CR & RCC_CR_PLLI2SRDY) == 0)
{
}
/* PLLI2S clock used as I2S clock source */
RCC_I2SCLKConfig(RCC_I2S2CLKSource_PLLI2S);//внутренний AUDIO CLOCK
//RCC->CFGR |= RCC_CFGR_I2SSRC;
/* Write to SPIx I2SPR register the computed value */
SPI3->I2SPR = (uint16_t)((uint16_t) I2SDIV[index] | (uint16_t)((I2SODD[index] << 8)) | (uint16_t)(I2S_MCLKOutput_Enable));
}
Кстати, а как пингвина заставить играть по дефолту в 24-х битах? Я дамп обмена посмотрел, по умолчанию выбирается alt_setting 1 с 16-ю битами.
Без железа, связанного с измерением напряжения, виснет наглухо. Пока эту строчку закомментировал.
Не могу понять, почему семерка упорно игнорирует режим 88,2/24
Социальные закладки