Цитата(jcxz @ Sep 11 2016, 15:29)

Завести сигнал клока параллельно на любой таймерный вход в счётном режиме и подсчитывать число переходов 0->1 и 1->0 за время кадра по этому таймеру. Если получено недопустимое число - реинит I2S.
2ТС: Вы ищете сочуствие или всё-таки совет?? Если 2ое, то чтобы получить осмысленные и полезные советы, следует приводить подробное и внятное описание проблемы. Сюда следует отнести: схемы включения, диаграммы сигналов и т.п. Ибо здесь не форум телепатов.
1й вариант отпадает т.к. непонятно как помеха поведет себя по отношению к этим двум ногам. понятно что процессор выдает клоки нормальные. наверно здесь лучше таймер завести по перепаду WS и сравнивать допустим через 1024 отсчета границы сигнала WS.
схема включения стандартная
Цитата(aaarrr @ Sep 11 2016, 16:00)

На прием используется отдельный I2S?
нет, все одним I2S2 принимается и передается.
CODE
/// Peripheral DMA init
hdma_i2s2_ext_rx.Instance = DMA1_Stream3;
hdma_i2s2_ext_rx.Init.Channel = DMA_CHANNEL_3;
hdma_i2s2_ext_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_i2s2_ext_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_i2s2_ext_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_i2s2_ext_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_i2s2_ext_rx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_i2s2_ext_rx.Init.Mode = DMA_CIRCULAR;
hdma_i2s2_ext_rx.Init.Priority = DMA_PRIORITY_HIGH;
hdma_i2s2_ext_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;//ENABLE;
hdma_i2s2_ext_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
hdma_i2s2_ext_rx.Init.MemBurst = DMA_MBURST_SINGLE;
hdma_i2s2_ext_rx.Init.PeriphBurst = DMA_PBURST_SINGLE;
HAL_DMA_Init(&hdma_i2s2_ext_rx);
__HAL_LINKDMA(hi2s,hdmarx,hdma_i2s2_ext_rx);
hdma_i2s2_ext_tx.Instance = DMA1_Stream4;
hdma_i2s2_ext_tx.Init.Channel = DMA_CHANNEL_0;
hdma_i2s2_ext_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_i2s2_ext_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_i2s2_ext_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_i2s2_ext_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_i2s2_ext_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_i2s2_ext_tx.Init.Mode = DMA_CIRCULAR;
hdma_i2s2_ext_tx.Init.Priority = DMA_PRIORITY_HIGH;
hdma_i2s2_ext_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;//ENABLE;
hdma_i2s2_ext_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
hdma_i2s2_ext_tx.Init.MemBurst = DMA_MBURST_SINGLE;
hdma_i2s2_ext_tx.Init.PeriphBurst = DMA_PBURST_SINGLE;
HAL_DMA_Init(&hdma_i2s2_ext_tx);
__HAL_LINKDMA(hi2s,hdmatx,hdma_i2s2_ext_tx);
.............
hi2s2.Instance = SPI2;
hi2s2.Init.Mode = I2S_MODE_MASTER_TX;
hi2s2.Init.Standard = I2S_STANDARD_PHILIPS;
hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B;//I2S_DATAFORMAT_16B;
hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
hi2s2.Init.AudioFreq = g_nI2SFreq[nSR];
hi2s2.Init.CPOL = I2S_CPOL_LOW;
hi2s2.Init.ClockSource = I2S_CLOCK_PLL;
hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_ENABLE;
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S;
PeriphClkInitStruct.PLLI2S.PLLI2SN = g_nI2SPLLN[nSR];
PeriphClkInitStruct.PLLI2S.PLLI2SR = g_nI2SPLLR[nSR];
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
HAL_I2S_Init(&hi2s2);
HAL_I2SEx_TransmitReceive_DMA(&hi2s2,(unsigned short*)i2s2_DelayBuf,(unsigned short*)i2s2_DelayBuf,(nDelay* ( 1<<nFFT ))*I2S2_DELAY_BUFFCHANNELS);
MX_TIM7_Init(g_nI2S_SR[nSR],1<<nFFT);
g_nI2S2_nFFT = nFFT;
g_nI2S2_DelayBufCmpl = 0;
g_nI2S2_nSR = nSR;
я наверно совсем заблудился. Если мастер процессор и он выдает сигналы WS. то получается кодек неверные данные выдает я же его тактирую.
Сообщение отредактировал IgorKossak - Sep 12 2016, 17:51
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Эскизы прикрепленных изображений