/** init the CAN frequency. * * @param rd receive pin. * @param td transmit pin. * @param hz The bus frequency in hertz. */ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz) { CANName can_rd = (CANName)pinmap_peripheral(rd, PinMap_CAN_RD); CANName can_td = (CANName)pinmap_peripheral(td, PinMap_CAN_TD); obj->can = (CANName)pinmap_merge(can_rd, can_td); MBED_ASSERT((int)obj->can != NC); if (obj->can == CAN_0) { rcu_periph_clock_enable(RCU_CAN0); can_deinit(obj->can); obj->index = 0; } else if (obj->can == CAN_1) { rcu_periph_clock_enable(RCU_CAN0); rcu_periph_clock_enable(RCU_CAN1); can_deinit(obj->can); obj->index = 1; } else { return; } /* Configure the CAN pins */ pinmap_pinout(rd, PinMap_CAN_RD); pinmap_pinout(td, PinMap_CAN_TD); if (rd != NC) { pin_mode(rd, PullUp); } if (td != NC) { pin_mode(td, PullUp); } dev_can_mode_config(obj->can, CAN_NORMAL_MODE); can_frequency(obj, hz); if (obj->can == CAN_0) { can_filter(obj, 0, 0, CANStandard, 0); } else { can_filter(obj, 0, 0, CANStandard, 14); } }
/** disable CAN. * */ void can_free(can_t *obj) { can_deinit(obj->can); if (obj->can == CAN0) { rcu_periph_clock_disable(RCU_CAN0); } if (obj->can == CAN1) { rcu_periph_clock_disable(RCU_CAN1); } }
/*! \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); }
/** Reset CAN interface. * * To use after error overflow. */ void can_reset(can_t *obj) { can_deinit(obj->can); }