2019-05-01 03:42 PM
First time using a STM32F4 for I2S.
I don't use your libraries as I want to understand the cpu at the register level.
I set up the I2S PLL and enable the I2S clock.
When I start to write to the SPI4 registers, they are not accepting the data. I have found this behavior before when the clocks were not enabled but I believe I have properly done that.
I have a simple test I am using to validate my understanding - please see the code below.
Please comment as to why writes to the SPI4 registers are not being taken.
void Do_Audio(void)
{
int Num_Audio_Samples = sizeof(AA) / 2;
int I = 0;
RCC->APB2ENR |= RCC_APB2ENR_SPI4EN; // turn SPI4 clock on
Config_STM_Pin(GPIOE, 2, 5, H_GPIO_Alt_Function, H_GPIO_Output_PushPull, SlewRate_Medium, No_Pull_Up_or_Down); // I2S_Bclk
Config_STM_Pin(GPIOE, 4, 5, H_GPIO_Alt_Function, H_GPIO_Output_PushPull, SlewRate_Medium, No_Pull_Up_or_Down); // I2S_LRClk
Config_STM_Pin(GPIOE, 6, 5, H_GPIO_Alt_Function, H_GPIO_Output_PushPull, SlewRate_Medium, No_Pull_Up_or_Down); // I2S_Data
AudioMutePIN(1); // mute off
// set up I2SPLL
RCC->PLLI2SCFGR = (271 << RCC_PLLI2SCFGR_PLLI2SN_Pos) | (2 << RCC_PLLI2SCFGR_PLLI2SR_Pos); // this gives correct I2S_clock
// enable I2S clock
RCC->CR |= RCC_CR_PLLI2SON;
// wait until stable
while((RCC->CR & RCC_CR_PLLI2SRDY) == 0)
{}
// set up SPI4
SPI4->I2SCFGR = SPI_I2SCFGR_I2SMOD | (2 << SPI_I2SCFGR_I2SCFG_Pos);
SPI4->I2SPR = 6; // odd = 0, idiv = 6
SPI4->I2SCFGR |= SPI_I2SCFGR_I2SE;
while(1)
{
if(SPI4->SR & SPI_SR_TXE)
{
SPI4->DR = AA[I];
I++;
if(I >= Num_Audio_Samples)
I = 0;
}
}
}
These 3 lines of code are not being updating the specified registers
SPI4->I2SCFGR = SPI_I2SCFGR_I2SMOD | (2 << SPI_I2SCFGR_I2SCFG_Pos);
SPI4->I2SPR = 6; // odd = 0, idiv = 6
SPI4->I2SCFGR |= SPI_I2SCFGR_I2SE;
Thanks in advance for any comments.
Joe
Solved! Go to Solution.
2019-05-01 04:01 PM
2019-05-01 04:01 PM
SPI4 in STM32F427 does not have I2S. Only SPI2 and SPI3 do.
JW
2019-05-01 06:12 PM
Thanks.
Now that you say that - I see the fine print difference.
I wish ST would make that a little clearer.
Thanks again