STM32CubeF4
STM32CubeF4 copied to clipboard
Unwanted I2S DMA output
on F401 I setup I2S in slave,fullduplex mode with circular DMA, issue
__HAL_DMA_DISABLE(&hdma_spi2_rx);
__HAL_DMA_DISABLE(&hdma_i2s2_ext_tx);
__HAL_I2S_DISABLE(&hi2s2);
inject more I2S clock in, and DMA still outputs I2S stream to i2s2_ext pin.
With unknown const values
internal state
S4CR.EN is 0!
It should be silent if disabled.
code
/* i2s uses SPI */
hi2s2.Instance = SPI2;
hi2s2.Init.Mode = I2S_MODE_SLAVE_RX;
hi2s2.Init.Standard = I2S_STANDARD_PHILIPS;
hi2s2.Init.DataFormat = I2S_DATAFORMAT_32B;
hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;
hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_44K;
hi2s2.Init.CPOL = I2S_CPOL_LOW; /* idle low clock */
hi2s2.Init.ClockSource = I2S_CLOCK_EXTERNAL; /* not PLL */
hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_ENABLE;
ASSERT(HAL_I2S_Init(&hi2s2) == HAL_OK);
__HAL_RCC_I2S_CONFIG(RCC_I2SCLKSOURCE_EXT);
/* I2S2_EXT_TX Init */
hdma_i2s2_ext_tx.Instance = DMA1_Stream4; /* also in task */
hdma_i2s2_ext_tx.Init.Channel = DMA_CHANNEL_2;
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; /* 16 even for 32bit */
hdma_i2s2_ext_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_i2s2_ext_tx.Init.Mode = DMA_CIRCULAR;
hdma_i2s2_ext_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
hdma_i2s2_ext_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
ASSERT(HAL_DMA_Init(&hdma_i2s2_ext_tx) == HAL_OK);
__HAL_LINKDMA(&hi2s2, hdmatx, hdma_i2s2_ext_tx);
/* DMA1_Stream4_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Stream4_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream4_IRQn);
ST Internal Reference: 188897