Возникла следующая проблема: I2S в режиме slave не работает.
Вроде пишу все по правилам:
CODE
I2S_InitTypeDef I2S_InitStructure;
#define I2S_CODEC SPI2
// 1. Clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
// 2. Pins
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15; // wclk | bclk | sd
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 4. I2S setup
SPI_I2S_DeInit(I2S_CODEC);
I2S_InitStructure.I2S_Mode = I2S_Mode_SlaveRx; //I2S_Mode_SlaveTx;
I2S_InitStructure.I2S_Standard = I2S_Standard_Phillips;
I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b; // I2S_DataFormat_16bextended
I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable;
I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq_Default;
I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low;
I2S_Init(I2S_CODEC, &I2S_InitStructure);
I2S_Cmd(I2S_CODEC, ENABLE);
setTerminalMessage(info, "Starting test DAC");
SPI_I2S_ReceiveData(I2S_CODEC);
for(;;) {
setTerminalMessage(info, "Tp0");
while (SPI_I2S_GetFlagStatus(I2S_CODEC, SPI_I2S_FLAG_RXNE) == RESET);
setTerminalMessage(info, "Tp1");
setTerminalMessage(info, "Data received - %04x", SPI_I2S_ReceiveData(I2S_CODEC));
}
Программа взвисает на приеме: SPI_I2S_FLAG_RXNE не выставляется.
При этом кодек испавно подает WCLK и BCLK и выглядят они как phillips прописал: ровно 16 BCLK на каждый перепад WCLK.
Никто с подобным не сталкивался?