CANopenNode / CanOpenSTM32

CANopenNode on STM32 microcontrollers.
Other
275 stars 110 forks source link

Fixed check for dual CAN device #48

Open cvanbeek13 opened 9 months ago

cvanbeek13 commented 9 months ago

I was having trouble getting this working on an STM32L496. I had set up CANopenNode on CAN2 and it was transmitting fine but not receiving. After lots of debugging, I discovered this issue.

In CO_driver_STM32, the FilterBank needs to be changed depending on the CAN peripheral. It should be 0 if using CAN1 and 14 if using CAN2. The following preprocessor switch statement looks like it's supposed to take care of this:

#if defined(CAN)
    FilterConfig.FilterBank = 0;
#else
    if (((CAN_HandleTypeDef*)((CANopenNodeSTM32*)CANmodule->CANptr)->CANHandle)->Instance == CAN1) {
        FilterConfig.FilterBank = 0;
    } else {
        FilterConfig.FilterBank = 14;
    }
#endif

However, even in a dual-bank CAN device, CAN is defined. Here is the instance in stm32l496xx.h:

#define CAN                 ((CAN_TypeDef *) CAN1_BASE)
#define CAN1                ((CAN_TypeDef *) CAN1_BASE)
#define CAN2                ((CAN_TypeDef *) CAN2_BASE)

This MR changes it to check instead if CAN2 is defined, which should work on both single-CAN and dual-CAN devices.