int CAN_device_init(uint8_t channel, uint32_t baud) { pr_info("Initializing CAN"); pr_info_int(channel); pr_info_int_msg(" with baud rate ", baud); if (!initQueues()) { pr_info("CAN init queues failed\r\n"); return 0; } switch (channel) { case 0: CAN_device_init_1(baud); break; case 1: CAN_device_init_2(baud); break; default: pr_info("CAN init device failed\r\n"); return 0; } /* Clear out all filter values except 0. It accepts all. */ CAN_device_set_filter(channel, 0, 1, 0, 0, true); for (size_t i = 1; i < CAN_FILTER_COUNT; ++i) CAN_device_set_filter(channel, i, 0, 0, 0, false); pr_info("CAN init success!\r\n"); return 1; }
static void CAN_device_init_1(int baud) { CAN_DeInit(CAN1); /* CAN GPIOs configuration ************************************************* */ /* Enable GPIO clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); /* Connect CAN pins to Alternate Function */ GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_9); GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_9); initGPIO(GPIOB, GPIO_Pin_8 | GPIO_Pin_9); /* CAN configuration ******************************************************* */ /* Enable CAN clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); initCAN(CAN1, baud); //set default filter CAN_device_set_filter(0, 0, 0, 0, 0); /* Enable FIFO 0 message pending Interrupt */ CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); initCANInterrupts(CAN1, USB_LP_CAN1_RX0_IRQn); }
int CAN_set_filter(uint8_t channel, uint8_t id, uint8_t extended, uint32_t filter, uint32_t mask, const bool enabled) { return CAN_device_set_filter(channel, id, extended, filter, mask, enabled); }