Входные данные:
-STM32F4 Discovery Kit
- ICS43432 I2S цифровые микрофоны( https://www.tindie.com/products/onehorse/ic...tal-microphone/ https://store.invensense.com/datasheets/inv...CS-43432_DS.pdf )
Задача
-настроить совместную работу двух ус-в
Контроллер работает в качестве мастера те выдает SCK и WS на соответствующие входы микрофона
микрофон в свою очередь отдает данные. I2S можно передавать даные левого и правого каналов

В моем случае микрофонов два
даные выходяшие с микро имееют разрядность 24 бита
пользую простенький код для тестов
Код
void SPI2_IRQHandler(void) {
// Receiving data
if(SPI_GetITStatus(SPI2, SPI_I2S_IT_RXNE) == SET) {
uint16_t data = SPI2->DR;
}
}
int main(void)
{
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLI2SRDY));
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_PLLI2SCmd(ENABLE);
//RCC_APB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
// GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_PinAFConfig(GPIOB,GPIO_PinSource12, GPIO_AF_SPI2); // WCLK
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13, GPIO_AF_SPI2); // BCLK
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15, GPIO_AF_SPI2); // SDATA
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15; // WCLK-BCLK-SDATA
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init (&NVIC_InitStructure);
I2S_InitTypeDef I2S_InitStructure;
I2S_StructInit(&I2S_InitStructure);
SPI_I2S_DeInit(SPI2);
I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq_48k;
I2S_InitStructure.I2S_Standard = I2S_Standard_Phillips;
I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable;
I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low;
I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b;
I2S_InitStructure.I2S_Mode = I2S_Mode_MasterRx;
I2S_Init(SPI2, &I2S_InitStructure);
/* Enable the Rx buffer not empty interrupt */
SPI_I2S_ITConfig (SPI2, SPI_I2S_IT_RXNE, ENABLE);
/* Enable the I2S2 */
I2S_Cmd(SPI2, ENABLE);
while(1);
}
// Receiving data
if(SPI_GetITStatus(SPI2, SPI_I2S_IT_RXNE) == SET) {
uint16_t data = SPI2->DR;
}
}
int main(void)
{
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLI2SRDY));
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_PLLI2SCmd(ENABLE);
//RCC_APB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
// GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_PinAFConfig(GPIOB,GPIO_PinSource12, GPIO_AF_SPI2); // WCLK
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13, GPIO_AF_SPI2); // BCLK
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15, GPIO_AF_SPI2); // SDATA
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15; // WCLK-BCLK-SDATA
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init (&NVIC_InitStructure);
I2S_InitTypeDef I2S_InitStructure;
I2S_StructInit(&I2S_InitStructure);
SPI_I2S_DeInit(SPI2);
I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq_48k;
I2S_InitStructure.I2S_Standard = I2S_Standard_Phillips;
I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable;
I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low;
I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b;
I2S_InitStructure.I2S_Mode = I2S_Mode_MasterRx;
I2S_Init(SPI2, &I2S_InitStructure);
/* Enable the Rx buffer not empty interrupt */
SPI_I2S_ITConfig (SPI2, SPI_I2S_IT_RXNE, ENABLE);
/* Enable the I2S2 */
I2S_Cmd(SPI2, ENABLE);
while(1);
}
конфиг

Проблемы:
подключился анализатором чтоб за верефицировать правильность работы
SCK - частота плавает 3МГц - 3,429МГц
WS - 48,48кГц, 48,39кГц
SD - тут ваще каша(
время,канал,значение прешедшее с микро
0.468853083333333,2,0xFFF9A7
0.468863375000000,1,0x7FFF88
0.468873708333333,2,0xFFF33E
0.468884000000000,1,0x0000BB
0.468894333333333,2,0xFFF676
0.468904666666667,1,0x00023F
0.468914958333333,2,0x7FFF87
0.468925291666667,1,0x000612
0.468935625000000,2,0xFFFE47
0.468945916666667,1,0x000187
0.468956250000000,2,0xFFFE41
0.468966541666667,1,0x0004BE
0.468976875000000,2,0xFFFF9D
0.468987166666667,1,0x000778
0.468997500000000,2,0xFFFC3D
0.469007791666667,1,0x000046
0.469018125000000,2,0xFFFF2F
0.469028416666667,1,0x0003C3
0.469038750000000,2,0xFFFF20
0.469049041666667,1,0x000374
4.237883500000000,1,0x7FF8B8
4.237893833333334,2,0xFFFE1C
4.237904125000000,1,0x7FFA5C
4.237914458333333,2,0xFFFE67
4.237924791666667,1,0xFFF13C
4.237935083333333,2,0x7FFBFC
4.237945416666666,1,0xFFF711
4.237955750000000,2,0xFFFDC2
4.237966041666667,1,0x7FF48F
4.237976375000000,2,0xFFFC02
4.237986666666667,1,0x7FF348
4.237997000000000,2,0xFFFCD1
4.238007333333333,1,0xFFFE43
4.238017625000000,2,0x7FF87F
4.238027958333333,1,0xFFF678
4.238038291666666,2,0xFFF223
4.238048625000000,1,0xFFFC5B
4.238058916666667,2,0x7FFB40
4.238069250000000,1,0xFFF618
9.606433708333334,2,0x0003B9
9.606444000000000,1,0x7FFCC9
9.606454333333334,2,0x0002E1
9.606464624999999,1,0x7FFC37
9.606474958333333,2,0x0007E0
9.606485291666667,1,0xFFFEFD
9.606495583333333,2,0x000088
9.606505916666666,1,0xFFFE6F
9.606516250000000,2,0x000C5F
9.606526541666666,1,0x7FFCC6
9.606536875000000,2,0x000E3C
9.606547166666667,1,0x000087
9.606557499999999,2,0x000D3E
9.606567791666667,1,0x7FFF0B
9.606578125000000,2,0x000E63
9.606588458333333,1,0x0001B8
9.606598750000000,2,0x000718
9.606609083333334,1,0xFFFE7E
9.606619374999999,2,0x00070B
9.606629708333333,1,0x0000FF
9.606640000000001,2,0x00060C
те смущает наличие таких случаев тогда на смену уровня WS микрофон никак не реагирует

Спасибо)