QSPI becomes endless busy after programming 1 page of external memory
Hi everyone!
My goal is to program big-sized data into external memory (MICRON). But I have very annoying problem. I can program only 1 page of ext. memory (256 bytes), I use DMA (mem to periph) to read data from buffer and send it to QSPI data register. After sending 256 bytes QSPI busy flag never resets, transfer comlete flag = 1, FIFO threshold flag = 1 and DMA sets FEIF (FIFO error flag).
Here is an example of programming script:
#define __ADDR_MASK ((__QSPI_FLASH_SIZE<<1)-1) // 26 bits adr size
void QSPI_programPage(uint32_t adr, uint32_t nb, uint16_t ptr){
DMA2_Stream7->M0AR = data_buffer + ptr;
QSPI_WriteEnable();
QUADSPI->CR |= QUADSPI_CR_DMAEN; // en DMA
QUADSPI->DLR = nb; // num of bytes to be transfered (256 bytes)
MODIFY_REG(QUADSPI->CCR,
QUADSPI_CCR_INSTRUCTION | QUADSPI_CCR_DMODE | QUADSPI_CCR_ADMODE | QUADSPI_CCR_FMODE,
MT25Q_4BYTE_PROGRAM_PAGE<<QUADSPI_CCR_INSTRUCTION_Pos | QUADSPI_CCR_IMODE_0 | QUADSPI_CCR_DMODE_0 | QUADSPI_CCR_ADMODE_0 | QUADSPI_CCR_ADSIZE);
QUADSPI->AR = adr & __ADDR_MASK;
/* Write to QSPI data register */
DMA2_Stream7->CR &=~ (DMA_SxCR_EN);
DMA2_Stream7->NDTR = nb;
DMA2_Stream7->CR |= (DMA_SxCR_EN);
/* data sends */
while (QUADSPI->SR & QUADSPI_SR_BUSY);
/* Wait for the 'write in progress' bit to clear */
qspi_reg_wait(0x01, 0x00);
// DMA2_Stream7->CR &=~ (DMA_SxCR_EN);
}Then address increments by 256 bytes and it is repeats.
I woud be very grateful, if you have some thoughts about it.
STM32F746