Exemplo n.º 1
0
/** 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;
}
Exemplo n.º 2
0
/*!
    \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);
}