| @@ -26,18 +26,6 @@ | |||
| #include "output_i2s.h" | |||
| // MCLK needs to be 48e6 / 1088 * 256 = 11.29411765 MHz -> 44.117647 kHz sample rate | |||
| // Possible to create using fractional divider for all USB-compatible Kinetis: | |||
| // MCLK = 16e6 * 12 / 17 | |||
| // MCLK = 24e6 * 8 / 17 | |||
| // MCLK = 48e6 * 4 / 17 | |||
| // MCLK = 72e6 * 8 / 51 | |||
| // MCLK = 96e6 * 2 / 17 | |||
| // MCLK = 120e6 * 8 / 85 | |||
| // TODO: instigate using I2S0_MCR to select the crystal directly instead of the system | |||
| // clock, which has audio band jitter from the PLL | |||
| audio_block_t * AudioOutputI2S::block_left_1st = NULL; | |||
| audio_block_t * AudioOutputI2S::block_right_1st = NULL; | |||
| @@ -205,6 +193,36 @@ void AudioOutputI2S::update(void) | |||
| } | |||
| // MCLK needs to be 48e6 / 1088 * 256 = 11.29411765 MHz -> 44.117647 kHz sample rate | |||
| // | |||
| #if F_CPU == 96000000 || F_CPU == 48000000 || F_CPU == 24000000 | |||
| // PLL is at 96 MHz in these modes | |||
| #define MCLK_MULT 2 | |||
| #define MCLK_DIV 17 | |||
| #elif F_CPU == 72000000 | |||
| #define MCLK_MULT 8 | |||
| #define MCLK_DIV 51 | |||
| #elif F_CPU == 120000000 | |||
| #define MCLK_MULT 8 | |||
| #define MCLK_DIV 85 | |||
| #elif F_CPU == 144000000 | |||
| #define MCLK_MULT 4 | |||
| #define MCLK_DIV 51 | |||
| #elif F_CPU == 168000000 | |||
| #define MCLK_MULT 8 | |||
| #define MCLK_DIV 119 | |||
| #elif F_CPU == 16000000 | |||
| #define MCLK_MULT 12 | |||
| #define MCLK_DIV 17 | |||
| #else | |||
| #error "This CPU Clock Speed is not supported by the Audio library"; | |||
| #endif | |||
| #if F_CPU >= 20000000 | |||
| #define MCLK_SRC 3 // the PLL | |||
| #else | |||
| #define MCLK_SRC 0 // system clock | |||
| #endif | |||
| void AudioOutputI2S::config_i2s(void) | |||
| { | |||
| @@ -217,8 +235,8 @@ void AudioOutputI2S::config_i2s(void) | |||
| if (I2S0_RCSR & I2S_RCSR_RE) return; | |||
| // enable MCLK output | |||
| I2S0_MCR = I2S_MCR_MICS(3) | I2S_MCR_MOE; | |||
| I2S0_MDR = I2S_MDR_FRACT(1) | I2S_MDR_DIVIDE(16); | |||
| I2S0_MCR = I2S_MCR_MICS(MCLK_SRC) | I2S_MCR_MOE; | |||
| I2S0_MDR = I2S_MDR_FRACT(MCLK_MULT-1) | I2S_MDR_DIVIDE(MCLK_DIV-1); | |||
| // configure transmitter | |||
| I2S0_TMR = 0; | |||