MCU : STM32F405VGT6
I2S : SPI2 STM32_DMA1_STREAM3 CHANNEL0
I'm writing an I2S driver, using the previous buzzer method, setting DMA, and enabling CIRC and TCIE interrupts, but the test result program can only enter the interrupt once
Code: Select all
#define SPI_I2S_PCM_MODE (3 << SPI_I2SCFGR_I2SSTD_Pos)
static const stm32_dma_stream_t* i2s_dma;
void I2S_DMA_init(void *buffer, uint16_t count) {
// I2S RX DMA setup.
i2s_dma = dmaStreamAlloc(STM32_I2S_SPI2_RX_DMA_STREAM, STM32_I2S_SPI2_IRQ_PRIORITY, (stm32_dmaisr_t)i2s_dma_complete_handler, NULL);
dmaStreamSetPeripheral(i2s_dma, &SPI2->DR);
dmaStreamSetMemory0(i2s_dma, buffer);
dmaStreamSetTransactionSize(i2s_dma, count);
// select channel I2S_DMA_CHANNEL
dmaStreamSetMode( i2s_dma,
STM32_DMA_CR_CHSEL(I2S_DMA_CHANNEL)
| STM32_DMA_CR_PL(3) // 3 - Very High
| STM32_DMA_CR_PSIZE_HWORD // 16 bit
| STM32_DMA_CR_MSIZE_HWORD // 16 bit
| STM32_DMA_CR_DIR_P2M // Read from peripheral
| STM32_DMA_CR_MINC // Memory increment mode
| STM32_DMA_CR_CIRC // Circular mode
| STM32_DMA_CR_HTIE // Half transfer complete interrupt enable
| STM32_DMA_CR_TCIE // Full transfer complete interrupt enable
| STM32_DMA_CR_EN );
// init FIFO to 0 aka only one element
//dmaStreamSetFIFO(i2s_dma, STM32_DMA_FCR_FTH_1Q);
dmaStreamEnable(i2s_dma);
// Starting I2S
rccEnableSPI2(FALSE); // Enabling I2S unit clock.
SPI2->CR1 = 0; // CRs settings
SPI2->CR2 = SPI_CR2_RXDMAEN; // Enable RX DMA
SPI2->I2SPR = 0; // I2S (re)configuration.
SPI2->I2SCFGR = 0
| SPI_I2SCFGR_I2SCFG_0 // 01: Slave - receive
| SPI_I2SCFGR_I2SMOD // I2S mode is selected
| SPI_I2S_PCM_MODE // I2S PCM standard (DSP mode, short sync)
| SPI_I2SCFGR_PCMSYNC // Short sync
| SPI_I2SCFGR_I2SE // I2S enable
;
}