La interrupción de finalización de DMA no funciona para el esclavo STM32 SPI

1

Estoy usando stm32f103 para transmitir algunos datos a través de SPI mientras que stm32 actúa como esclavo. Necesito usar DMA para enviar datos al SPI, pero nunca se llama al controlador de interrupción correspondiente.

El código de inicialización viene de la siguiente manera:

DMA_InitTypeDef DMA_InitStructure;
/* DMA configuration */
DMA_DeInit(SPI_SLAVE_DMA);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) SPI_SLAVE_DR_Adress;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) SPI_Buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = SPI_BufferSize;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(SPI_SLAVE_DMA, &DMA_InitStructure);
/* Enable DMA Transfer Complete interrupt */
DMA_ITConfig(SPI_SLAVE_DMA, DMA_IT_TC, ENABLE);
/* Enable DMA */
DMA_Cmd(SPI_SLAVE_DMA, ENABLE);

/* SPI_SLAVE configuration */
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI_SLAVE, &SPI_InitStructure);

/* Enable SPI_SLAVE Tx request */
SPI_I2S_DMACmd(SPI_SLAVE, SPI_I2S_DMAReq_Tx, ENABLE);
/* Enable SPI_SLAVE */
SPI_Cmd(SPI_SLAVE, ENABLE);

Cuando uso el controlador de interrupciones SPI, mi sistema funciona. Pero utilizando el código escrito anteriormente, nunca se llama al controlador de interrupción del canal SPI_SLAVE_DMA.

    
pregunta Abouzar Nouri

1 respuesta

4

He encontrado la solución. En el manual de referencia de STM32f103xx hay una tabla (No. 78) aclarando qué canal DMA se puede usar para qué periférico. Según esa tabla, tuve que usar DMA1 channel3, mientras que en su lugar estaba usando channel6.

    
respondido por el Abouzar Nouri

Lea otras preguntas en las etiquetas