/** Filter out incomming messages. * * @param id the id to filter on. * @param mask the mask applied to the id. * @param format format to filter on (Default CANAny). * @param handle message filter handle (Optional). * * @returns * 0 if filter change failed or unsupported, * new filter handle if successful */ int can_filter(can_t *obj, uint32_t id, uint32_t mask, CANFormat format, int32_t handle) { can_filter_parameter_struct can_filter; can_filter.filter_number = handle; can_filter.filter_mode = CAN_FILTERMODE_MASK; can_filter.filter_bits = CAN_FILTERBITS_32BIT; can_filter.filter_fifo_number = CAN_FIFO0; can_filter.filter_enable = ENABLE; switch (format) { case CANStandard: /* configure SFID[10:0] */ can_filter.filter_list_high = id << 5; can_filter.filter_list_low = 0x0; /* configure SFID[10:0] mask */ can_filter.filter_mask_high = mask << 5; /* both data and remote frames can be received */ can_filter.filter_mask_low = 0x0; break; case CANExtended: /* configure EFID[28:13] */ can_filter.filter_list_high = id >> 13; /* configure EFID[12:0] and frame format bit set */ can_filter.filter_list_low = (0x00FF & (id << 3)) | (1 << 2); /* configure EFID[28:13] mask */ can_filter.filter_mask_high = mask >> 13; /* configure EFID[12:0] and frame format bit mask */ /* both data and remote frames can be received */ can_filter.filter_mask_low = (0x00FF & (mask << 3)) | (1 << 2); break; case CANAny: error("CANAny mode is not supported \r\n"); return 0; default: error("parameter is not supported \r\n"); return 0; } can_filter_init(&can_filter); can1_filter_start_bank(handle); return handle; }
/*! \brief initialize CAN and filter \param[in] can_parameter \arg can_parameter_struct \param[in] can_filter \arg can_filter_parameter_struct \param[out] none \retval none */ void can_networking_init(can_parameter_struct can_parameter, can_filter_parameter_struct can_filter) { /* initialize CAN register */ can_deinit(CANX); /* initialize CAN */ can_parameter.can_ttc=DISABLE; can_parameter.can_abor=DISABLE; can_parameter.can_awu=DISABLE; can_parameter.can_ard=DISABLE; can_parameter.can_rfod=DISABLE; can_parameter.can_tfo=DISABLE; can_parameter.can_mode=CAN_NORMAL_MODE; can_parameter.can_sjw=CAN_BT_SJW_1TQ; can_parameter.can_bs1=CAN_BT_BS1_3TQ; can_parameter.can_bs2=CAN_BT_BS2_2TQ; /* baudrate 1Mbps */ can_parameter.can_psc=12; can_init(CANX, &can_parameter); /* initialize filter */ #ifdef CAN0_USED /* CAN0 filter number */ can_filter.can_filter_number=0; #else /* CAN1 filter number */ can_filter.can_filter_number=15; #endif /* initialize filter */ can_filter.can_filter_mode = CAN_FILTERMODE_MASK; can_filter.can_filter_bits = CAN_FILTERBITS_32BIT; can_filter.can_filter_list_high = 0x0000; can_filter.can_filter_list_low = 0x0000; can_filter.can_filter_mask_high = 0x0000; can_filter.can_filter_mask_low = 0x0000; can_filter.can_filter_fifo_number = CAN_FIFO0; can_filter.can_filter_enable=ENABLE; can_filter_init(&can_filter); }