har-in-air / STM32F411_USB_AUDIO_DAC

USB Audio DAC using inexpensive STM32F411 / 401 "Black Pill" and PCM5102A modules
GNU General Public License v3.0
157 stars 30 forks source link

How Can it use external clock in I2S #4

Closed Timo-AL closed 3 years ago

Timo-AL commented 3 years ago

I want to use crystal oscillator as I2S clock source, but it woulden work.

I connect two oscillator to PA2 than connect led pins to enbale pin on oscillato. Also, changing some codes in bsp_audio.c. Than commenting out all the code in usart.c to left PA2 free. But the chip still use 25Mhz crystal as I2S clock source.

Here are codes that what I change.All of then are in bsp_audio.c.

const I2S_CLK_CONFIG I2S_Clk_Config24[3]  = { 
{429, 4, 8, 0, 0x0B000000}, // 44.0995 
{384, 5, 8, 0, 0x0C000000}, // 48.0000 
{424, 3, 4, 0, 0x18000000}  // 96.0144 
}; 
#endif
    if (freqindex != -1)  {
    N = I2S_Clk_Config24[freqindex].N;
    R = I2S_Clk_Config24[freqindex].R;
    I2SDIV = I2S_Clk_Config24[freqindex].I2SDIV;
    ODD = I2S_Clk_Config24[freqindex].ODD;

    RCC_ExCLKInitStruct.PeriphClockSelection** = RCC_I2SCLKSOURCE_EXT;
#ifdef STM32F411xE
    RCC_ExCLKInitStruct.PLLI2S.PLLI2SM = 25;
#endif
    RCC_ExCLKInitStruct.PLLI2S.PLLI2SN = N;  
    RCC_ExCLKInitStruct.PLLI2S.PLLI2SR = R;  
    HAL_RCCEx_PeriphCLKConfig(&RCC_ExCLKInitStruct);     
    I2S_PR = (MCKOE<<9) | (ODD<<8) | I2SDIV;
    I2S_Config_I2SPR(I2S_PR);
    } 
  else { // Default PLL I2S configuration for 96000 Hz 24bit
    N = I2S_Clk_Config24[2].N;
    R = I2S_Clk_Config24[2].R;
    I2SDIV = I2S_Clk_Config24[2].I2SDIV;
    ODD = I2S_Clk_Config24[2].ODD;

    RCC_ExCLKInitStruct.PeriphClockSelection = RCC_I2SCLKSOURCE_EXT;
#ifdef STM32F411xE
    RCC_ExCLKInitStruct.PLLI2S.PLLI2SM = 25;
#endif
    RCC_ExCLKInitStruct.PLLI2S.PLLI2SN = N;
    RCC_ExCLKInitStruct.PLLI2S.PLLI2SR = R;
    HAL_RCCEx_PeriphCLKConfig(&RCC_ExCLKInitStruct); 
    I2S_PR = (MCKOE<<9) | (ODD<<8) | I2SDIV;
    I2S_Config_I2SPR(I2S_PR); 
static void I2Sx_Init(uint32_t AudioFreq) {
  haudio_i2s.Instance = SPI2;

  __HAL_I2S_DISABLE(&haudio_i2s);  

  haudio_i2s.Init.Mode = I2S_MODE_MASTER_TX;
  haudio_i2s.Init.Standard = I2S_STANDARD_PHILIPS;
  haudio_i2s.Init.DataFormat = I2S_DATAFORMAT_24B;
  haudio_i2s.Init.AudioFreq = AudioFreq;
  haudio_i2s.Init.CPOL = I2S_CPOL_LOW;
  haudio_i2s.Init.ClockSource = I2S_CLOCK_EXTERNAL;
#ifdef USE_MCLK_OUT
  haudio_i2s.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
#endif
  haudio_i2s.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE;  

  HAL_I2S_Init(&haudio_i2s); 
}
har-in-air commented 3 years ago

sorry, no idea how that would work.