STM32F4 - beide CAN gleichzeitig

Gast #4937672
Lesenswert?
• ▲
▼
Ich möchte beide CAN-Busse im STM32F446 gleichzeitig nutzen. 
Grundsätzlich funktioniert das auch, ich kann auch auf beiden Senden.
Je nach Interrupt- und Filtereinstellung generiert aber nur einer der 
Busse Interrupts beim Empfangen.
Wo liegt mein Fehler?

Hier der relevante Code:

nvic.c
1
  NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
2
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
3
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
4
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
5
  NVIC_Init(&NVIC_InitStructure);
6
  
7
  NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
8
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
9
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
10
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
11
  NVIC_Init(&NVIC_InitStructure);

stm32f4xx_it.c
1
void CAN1_RX0_IRQHandler(void)
2
{
3
  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage1);
4
  //do stuff
5
}
6

7
void CAN2_RX0_IRQHandler(void)
8
{
9
  CAN_Receive(CAN2, CAN_FIFO0, &RxMessage2);
10
  //do stuff
11
}

can.c
1
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
2
CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
3

4
    /* CAN filter init */
5
  CAN_FilterInitStructure.CAN_FilterNumber = 14;
6
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
7
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
8
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
9
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
10
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
11
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
12
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
13
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
14
  CAN_FilterInit(&CAN_FilterInitStructure);
Gast #4938614
Lesenswert?
• ▲
▼
1
  CAN_FilterInitStructure.CAN_FilterNumber = 0;
2
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
3
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
4
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
5
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
6
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
7
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
8
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
9
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
10
  CAN_FilterInit(&CAN_FilterInitStructure);

Muss ich die Filterinitialisierung mehrfach durchführen, für jede 
verwendete Filternummer? Also zb weiter so:
1
  CAN_FilterInitStructure.CAN_FilterNumber = 14;
2
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
3
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
4
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
5
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
6
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
7
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
8
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO1;
9
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
10
  CAN_FilterInit(&CAN_FilterInitStructure);

Damit hätte ich quasi Filter 0 und 14 konfiguriert für jeweils 1 FIFO, 
und kann dann in den Interrupts aus den jeweiligen FIFOs lesen?

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.