Forum: Mikrocontroller und Digitale Elektronik STM32F4 - beide CAN gleichzeitig


von OP (Gast)


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

von OP (Gast)


Lesenswert?

Niemand?

von OP (Gast)


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?

von OP (Gast)


Lesenswert?

Hat sich erledigt

von Joe (Gast)


Lesenswert?

Es wäre schön wenn du auch für andere die Lösung bereitstellen würdest!

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
Noch kein Account? Hier anmelden.