Сейчас пробую прием слейвом 24-2 бита, не могу понять где глюки.
I2S3 - мастер-передатчик, с него подаю прямо на I2S2 - слейв-приемник.
Передаю одно и то-же число в каждом канале, 32 бита, 48кгц., передатик тактируется внешним клоком.
Контролирую осциллографом шину - там все идеально, числа соответствуют.
Приемник считывает в 2 переменые - и там числа не совпадают с переданными.
Причем клик на ресет - и там уже другие числа.
Инициализация приемника такая:
CODE
void InitI2S2(void){ // slave receiver
I2S_InitTypeDef I2S2_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
u32 d;
RCC_I2SCLKConfig(RCC_I2S2CLKSource_Ext);
/* Enable the I2S peripheral clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
// GPIO
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_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//------------------------------------------------------------------------
I2S_StructInit(&I2S2_InitStructure);
I2S2_InitStructure.I2S_AudioFreq =I2S_AudioFreq_Default;
I2S2_InitStructure.I2S_Standard = I2S_Standard_MSB;
I2S2_InitStructure.I2S_DataFormat = I2S_DataFormat_32b;
I2S2_InitStructure.I2S_CPOL = I2S_CPOL_Low;
I2S2_InitStructure.I2S_Mode = I2S_Mode_SlaveRx;
I2S2_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable;
I2S_Init(SPI2, &I2S2_InitStructure);
// -------------- interrupt:
NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = I2SInputPriority;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = I2SInputSubPriority;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
while( (GPIOB->IDR & GPIO_Pin_12) 0= 0 ); // wait for WCLK=1
while( (GPIOB->IDR & GPIO_Pin_12) != 0 );// wait for WCLK=0
d=(uint32_t)SPI3->DR; // to clear RXNE bit if was
d=(uint32_t)SPI3->SR; // to clear flags, if were
SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE); // enable interrupt
I2S_Cmd(SPI2, ENABLE); // enable I2S2
}
прием по прерыванию делаю так:
Код
volatile u16 LDataRcvL, LDataRcvH, RDataRcvL, RDataRcvH; // сюда считываю
void SPI2_IRQHandler(void){
static u32 chan, sequence;
chan = (SPI2->SR & I2S_FLAG_CHSIDE); // read CHSIDE = 0 for LEFT, 1 for RIGHT
InpData=SPI2->DR;//SPI_I2S_ReceiveData(SPI2); // read reveived data
sequence <<= 1; // bit1 = old
sequence &= 0x2; // leave only bit1 = old chan value
if (chan) sequence |=1; // bit0 = new chan value
//---------------------------------------------------------
switch (sequence){
case 0: LDataRcvL = InpData; break; // Left Low
case 2: LDataRcvH = InpData; break; // Left High
case 1: RDataRcvH = InpData; break; // Right High
case 3: RDataRcvL = InpData; break; // Right Low, End Of 2 channel receiving
}
}
void SPI2_IRQHandler(void){
static u32 chan, sequence;
chan = (SPI2->SR & I2S_FLAG_CHSIDE); // read CHSIDE = 0 for LEFT, 1 for RIGHT
InpData=SPI2->DR;//SPI_I2S_ReceiveData(SPI2); // read reveived data
sequence <<= 1; // bit1 = old
sequence &= 0x2; // leave only bit1 = old chan value
if (chan) sequence |=1; // bit0 = new chan value
//---------------------------------------------------------
switch (sequence){
case 0: LDataRcvL = InpData; break; // Left Low
case 2: LDataRcvH = InpData; break; // Left High
case 1: RDataRcvH = InpData; break; // Right High
case 3: RDataRcvL = InpData; break; // Right Low, End Of 2 channel receiving
}
}
Помогите пожалуйста, понять в чем дело. Второй день бьюсь, что я делаю не так?
Чувствую что где-то какая-то детская ошибка, понять бы где...