STM32F0: SPI als Slave mit DMA und Interrupt

Gast #4469704
Lesenswert?
• ▲
▼
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
Gast #4469774
Lesenswert?
• ▲
▼
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.