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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren