DMA-Abschluss-Interrupt funktioniert nicht für Slave-STM32-SPI

Ich verwende stm32f103, um einige Daten über SPI zu übertragen, während stm32 als Slave fungiert. Ich muss DMA verwenden, um Daten an das SPI zu senden, aber der entsprechende Interrupt-Handler wird nie aufgerufen.

Der Initialisierungscode lautet wie folgt:

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);

Wenn ich den SPI-Interrupt-Handler verwende, funktioniert mein System. Aber mit dem oben geschriebenen Code wird der Interrupt-Handler des SPI_SLAVE_DMA-Kanals nie aufgerufen.

Antworten (1)

Ich habe die Lösung gefunden. Im Referenzhandbuch des STM32f103xx gibt es eine Tabelle (Nr. 78), die verdeutlicht, welcher DMA-Kanal für welches Peripheriegerät verwendet werden kann. Gemäß dieser Tabelle musste ich DMA1-Kanal 3 verwenden, während ich stattdessen Kanal 6 verwendete.