Well, I use the same SAI for doing both (sending MCLK out and using L/R and BCLK as slave)
here is a snippet of the code for a T3.6
Code:
void i2s_rx_slave_setup(void)
{
SIM_SCGC6 |= SIM_SCGC6_I2S;
CORE_PIN35_CONFIG = PORT_PCR_MUX(4) | PORT_PCR_SRE | PORT_PCR_DSE; //pin35, PTC8, I2S0_MCLK (SLEW rate (SRE)?)
CORE_PIN36_CONFIG = PORT_PCR_MUX(4); //pin36, PTC9, I2S0_RX_BCLK
CORE_PIN37_CONFIG = PORT_PCR_MUX(4); //pin37, PTC10, I2S0_RX_FS
CORE_PIN27_CONFIG = PORT_PCR_MUX(6); //pin27, PTA15, I2S0_RXD0
I2S0_RCSR=0;
// enable MCLK output
I2S0_MDR = I2S_MDR_FRACT((MCLK_MULT-1)) | I2S_MDR_DIVIDE((MCLK_DIV-1));
while(I2S0_MCR & I2S_MCR_DUF);
I2S0_MCR = I2S_MCR_MICS(MCLK_SRC) | I2S_MCR_MOE;
I2S0_RMR=0; // enable receiver mask
I2S0_RCR1 = I2S_RCR1_RFW(3);
I2S0_RCR2 = I2S_RCR2_SYNC(0)
| I2S_RCR2_BCP ;
I2S0_RCR3 = I2S_RCR3_RCE; // single rx channel
I2S0_RCR4 = I2S_RCR4_FRSZ(7) // 8 words (TDM - mode)
| I2S_RCR4_FSE // frame sync early
| I2S_RCR4_MF;
I2S0_RCR5 = I2S_RCR5_WNW(31) | I2S_RCR5_W0W(31) | I2S_RCR5_FBT(31);
}
it uses 8-word TDM, but that can easily be changed
also T4 will need different clock enabling and routing and port settings