Пытаюсь сделать чтение из АЦП по I2S на LPC1788. Всякие настройки уже покрутил - в итоге есть "правильная" картинка на логическом анализаторе: все три сигнала есть SCK, WS, SD. Вродебы и код написан правильно - попадаю в прерывание. Но читаются почемуто одни только нули! Хотя на осцилограмме сигнал не нулевой и для "правого" и для "левого" канала. Даже чтение через ДМА вроде как прикрутил - в прерывание от окончания чтения попадаю, но опять же одни нули. Настраивал один только приемник, может с передатчиком чегото надо покрутить еще?
Вот код инициализации:
CODE
I2S_Init(LPC_I2S);
I2S_CFG_Type I2S_ConfigStruct;
I2S_ConfigStruct.wordwidth = I2S_WORDWIDTH_8;
I2S_ConfigStruct.mono = I2S_MONO;
I2S_ConfigStruct.stop = I2S_STOP_DISABLE;
I2S_ConfigStruct.reset = I2S_STOP_DISABLE;
I2S_ConfigStruct.ws_sel = I2S_MASTER_MODE;//I2S_MASTER_MODE;
I2S_ConfigStruct.mute = I2S_MUTE_DISABLE;
I2S_ConfigStruct.ws_halfperiod = 0;//32;//24 * 4;
I2S_Config(LPC_I2S, I2S_RX_MODE, &I2S_ConfigStruct);
I2S_MODEConf_Type I2S_ClkConfig;
I2S_ClkConfig.clksel = I2S_CLKSEL_FRDCLK;
I2S_ClkConfig.fpin = I2S_4PIN_DISABLE;
I2S_ClkConfig.mcena = I2S_MCLK_DISABLE;
I2S_ModeConfig(LPC_I2S, &I2S_ClkConfig, I2S_RX_MODE);
I2S_FreqConfig(LPC_I2S, SCLK_FREQUENCY_2560, I2S_RX_MODE);
I2S_Stop(LPC_I2S, I2S_RX_MODE);
IRQ_ConfigureIT(I2S_IRQn, 2);
IRQ_EnableIT(I2S_IRQn);
I2S_IRQConfig(LPC_I2S, I2S_RX_MODE, 1);
I2S_IRQCmd(LPC_I2S, I2S_RX_MODE, ENABLE);
I2S_Start(LPC_I2S);
Вот код прерывания (не ДМА, его пока отключил):
CODE
uint32_t RXLevel = 0;
//Check RX interrupt
if(LPC_I2S->STATE & 0x01)
{
RXLevel = I2S_GetLevel(LPC_I2S, I2S_RX_MODE);
if ((RXLevel != 0) && !I2SRXDone )
{
while ( RXLevel > 0 )
{
if (I2SReadLength == BUFFER_SIZE)
{
//Stop RX
//I2S_Stop(LPC_I2S, I2S_RX_MODE);
// Disable RX
//I2S_IRQCmd(LPC_I2S, I2S_RX_MODE, DISABLE);
I2SRXDone = 0;
I2SReadLength = 0;
break;
}
else
{
dummy = LPC_I2S->RXFIFO;
if (dummy != 0)
{
asm("nop");
}
I2SRXBuffer[I2SReadLength++] = dummy;
}
RXLevel--;
}
}
}