void setI2SFreq(int freq) {
#if defined(T4)
// PLL between 27*24 = 648MHz und 54*24=1296MHz
int n1 = 4; //SAI prescaler 4 => (n1*n2) = multiple of 4
int n2 = 1 + (24000000 * 27) / (freq * 256 * n1);
double C = ((double)freq * 256 * n1 * n2) / 24000000;
int c0 = C;
int c2 = 10000;
int c1 = C * c2 - (c0 * c2);
set_audioClock(c0, c1, c2, true);
CCM_CS1CDR = (CCM_CS1CDR & ~(CCM_CS1CDR_SAI1_CLK_PRED_MASK | CCM_CS1CDR_SAI1_CLK_PODF_MASK))
| CCM_CS1CDR_SAI1_CLK_PRED(n1-1) // &0x07
| CCM_CS1CDR_SAI1_CLK_PODF(n2-1); // &0x3f
#else
unsigned tcr5 = I2S0_TCR5;
unsigned word0width = ((tcr5 >> 24) & 0x1f) + 1;
unsigned wordnwidth = ((tcr5 >> 16) & 0x1f) + 1;
unsigned framesize = ((I2S0_TCR4 >> 16) & 0x0f) + 1;
unsigned nbits = word0width + wordnwidth * (framesize - 1 );
unsigned tcr2div = I2S0_TCR2 & 0xff; //bitclockdiv
uint32_t MDR = I2S_dividers(freq, nbits, tcr2div);
if (MDR > 0) {
while (I2S0_MCR & I2S_MCR_DUF) {
;
}
I2S0_MDR = MDR;
}
////////////////////////////////////////////////////////////////////////////////
/* typedef struct {
uint8_t mult;
uint16_t div;
} tmclk;
const int numfreqs = 20;
// const int samplefreqs[numfreqs] = { 8000, 11025, 16000, 22050, 32000, 44100, (int)44117.64706 , 48000, 88200, (int)44117.64706 * 2, 96000, 100000, 176400, (int)44117.64706 * 4, 192000};
const int samplefreqs[numfreqs] = { 8000, 11025, 16000, 22050, 32000, 44100, (int)44117.64706 , 48000, 50223, 88200, (int)44117.64706 * 2,
96000, 100000, 100466, 176400, (int)44117.64706 * 4, 192000, 234375, 281000, 352800
};
#if (F_PLL==180000000)
//{ 8000, 11025, 16000, 22050, 32000, 44100, (int)44117.64706 , 48000,
const tmclk clkArr[numfreqs] = {{46, 4043}, {49, 3125}, {73, 3208}, {98, 3125}, {183, 4021}, {196, 3125}, {16, 255}, {128, 1875},
// 50223, 88200, (int)44117.64706 * 2, 96000, 100466, 176400, (int)44117.64706 * 4, 192000, 234375, 281000, 352800};
{1, 14}, {107, 853}, {32, 255}, {219, 1604}, {224, 1575}, {1, 7}, {214, 853}, {64, 255}, {219, 802}, {1, 3}, {2, 5} , {1, 2}
};
/*#elif (F_PLL==192000000)
const tmclk clkArr[numfreqs] = {{4, 375}, {37, 2517}, {8, 375}, {73, 2483}, {16, 375}, {147, 2500}, {1, 17}, {8, 125},
// { 8000, 11025, 16000, 22050, 32000, 44100, 44117.64706 , 48000,
{147, 1250}, {2, 17}, {16, 125}, {147, 625}, {4, 17}, {32, 125} };
// 88200, 44117.64706 * 2, 96000, 176400, 44117.64706 * 4, 192000};
#elif (F_PLL==216000000)
const tmclk clkArr[numfreqs] = {{32, 3375}, {49, 3750}, {64, 3375}, {49, 1875}, {128, 3375}, {98, 1875}, {8, 153}, {64, 1125},
{196, 1875}, {16, 153}, {128, 1125}, {226, 1081}, {32, 153}, {147, 646} };
#elif (F_PLL==240000000)
const tmclk clkArr[numfreqs] = {{16, 1875}, {29, 2466}, {32, 1875}, {89, 3784}, {64, 1875}, {147, 3125}, {4, 85}, {32, 625},
{205, 2179}, {8, 85}, {64, 625}, {89, 473}, {16, 85}, {128, 625} };
*/
/*#endif
for (int f = 0; f < numfreqs; f++) {
if ( freq == samplefreqs[f] ) {
while (I2S0_MCR & I2S_MCR_DUF) ;
I2S0_MDR = I2S_MDR_FRACT((clkArr[f].mult - 1)) | I2S_MDR_DIVIDE((clkArr[f].div - 1));
return;
}
}
////////////////////////////////////////////////////////////////////////////////////
*/
#endif