Hallo,
ich versuche gerade zwei uCs mit einer SPI zu verbinden. Der Slave ist
auf einem STm32 realisiert und soll nach Möglichkeit mit DMA arbeiten.
Irgendwie kommt es aber nie zum DMA Interrupt. Wenn ich den DMA aber
deaktiviere und den normalen SPI Interupt nutze kann ich die Daten im
Buffer jeweils im Eingangsbyte sehen. Da es sich aber um relativ viele
Daten handelt (16Byte), würde ich es schon vorziehen, den DMA zu nutzen.
Der DMA ist wie folgt konfiguriert
void SPI1_DMA_Config(unsigned char* rx_buff,unsigned char* tx_buff)
{
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // enable DMA
clock
#ifdef READ_SPI_VIA_DMA
/*Configure DMA channel 2 to SPI1 -> memory -> Rx*/
DMA_DeInit(DMA1_Channel2);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)rx_buff;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 16; // SPI1_BUFFER_SIZE_RX;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize =
DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel2, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE); // enable DMA
interrupt
DMA_Cmd(DMA1_Channel2, DISABLE); // enable DMA
/*Configure NVIC for DMA interrupt*/
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_SetCurrDataCounter(DMA1_Channel2, 16);
DMA_Cmd(DMA1_Channel2, ENABLE);
#endif
#ifdef WRITE_SPI_VIA_DMA
/*Configure DMA channel 3 to memory -> SPI1 -> Tx*/
DMA_DeInit(DMA1_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) tx_buff;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = SPI1_BUFFER_SIZE_TX;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize =
DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);
DMA_Cmd(DMA1_Channel3, DISABLE);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_SetCurrDataCounter(DMA1_Channel3, 16);
DMA_Cmd(DMA1_Channel3, ENABLE);
#endif
}
Selbst wenn ich den DMA Interrupt nicht benutze kann ich einen Teil der
Daten im DMA sehen.
Hat jemand eine Idee was hier schief laufe könnte?
Grüße
Jens Wörmann
Hat sich erleidgt - war meine eigene Dummheit. ;) Es lag ein Fehler in der Interrupt Routine vor. So wurde die nur ein mal ausgeführt und dann nie wieder. Kann gelöscht werden. Danke Jens
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.