Beispiel #1
0
/** CAN interrupt handle .
 *
 *  @param can_periph CAN0 or CAN1.
 *  @param id the CANx index .
 */
static void dev_can_irq_handle(uint32_t periph, int id)
{
    uint32_t flag0 = 0, flag1 = 0, flag2 = 0;

    flag0 = can_interrupt_flag_get(periph, CAN_INT_FLAG_MTF0);
    flag1 = can_interrupt_flag_get(periph, CAN_INT_FLAG_MTF1);
    flag2 = can_interrupt_flag_get(periph, CAN_INT_FLAG_MTF2);

    if (flag0) {
        can_flag_clear(periph, CAN_FLAG_MTF0);
    }
    if (flag1) {
        can_flag_clear(periph, CAN_FLAG_MTF1);
    }
    if (flag2) {
        can_flag_clear(periph, CAN_FLAG_MTF2);
    }

    /* CAN transmit complete interrupt handle */
    if (flag0 || flag1 || flag2) {
        irq_callback(can_irq_ids[id], IRQ_TX);
    }

    /* CAN receive complete interrupt handle */
    if (CAN_INTEN_RFNEIE0 == (CAN_INTEN(periph) & CAN_INTEN_RFNEIE0)) {
        if (0 != can_receive_message_length_get(periph, CAN_FIFO0)) {
            irq_callback(can_irq_ids[id], IRQ_RX);
        }
    }

    /* CAN error interrupt handle */
    if (SET == can_interrupt_flag_get(periph, CAN_INT_FLAG_ERRIF)) {
        /* passive error interrupt handle */
        if (CAN_INTEN_PERRIE == (CAN_INTEN(periph) & CAN_INTEN_PERRIE)) {
            if (SET == can_flag_get(periph, CAN_FLAG_PERR)) {
                irq_callback(can_irq_ids[id], IRQ_PASSIVE);
            }
        }

        /* bus-off interrupt handle */
        if (CAN_INTEN_BOIE == (CAN_INTEN(periph) & CAN_INTEN_BOIE)) {
            if (SET == can_flag_get(periph, CAN_FLAG_BOERR)) {
                irq_callback(can_irq_ids[id], IRQ_BUS);
            }
        }

        irq_callback(can_irq_ids[id], IRQ_ERROR);
    }
}
Beispiel #2
0
/*!
    \brief      get CAN interrupt flag state
    \param[in]  can_periph
      \arg        CANx(x=0,1),the CAN1 only for GD32F30X_CL 
    \param[in]  flag: CAN interrupt flags, refer to can_interrupt_flag_enum
                only one parameter can be selected which is shown as below:
      \arg        CAN_INT_FLAG_SLPIF: status change interrupt flag of sleep working mode entering
      \arg        CAN_INT_FLAG_WUIF: status change interrupt flag of wakeup from sleep working mode
      \arg        CAN_INT_FLAG_ERRIF: error interrupt flag
      \arg        CAN_INT_FLAG_MTF2: mailbox 2 transmit finished interrupt flag
      \arg        CAN_INT_FLAG_MTF1: mailbox 1 transmit finished interrupt flag
      \arg        CAN_INT_FLAG_MTF0: mailbox 0 transmit finished interrupt flag
      \arg        CAN_INT_FLAG_RFO0: receive FIFO0 overfull interrupt flag
      \arg        CAN_INT_FLAG_RFF0: receive FIFO0 full interrupt flag
      \arg        CAN_INT_FLAG_RFO1: receive FIFO1 overfull interrupt flag
      \arg        CAN_INT_FLAG_RFF1: receive FIFO1 full interrupt flag
    \param[out] none
    \retval     FlagStatus: SET or RESET
*/
FlagStatus can_interrupt_flag_get(uint32_t can_periph, can_interrupt_flag_enum flag)
{  
    FlagStatus ret1 = RESET;
    FlagStatus ret2 = RESET;
    
    /* get the staus of interrupt flag */
    ret1 = (FlagStatus)(CAN_REG_VALS(can_periph, flag) & BIT(CAN_BIT_POS0(flag)));
    /* get the staus of interrupt enale bit */
    ret2 = (FlagStatus)(CAN_INTEN(can_periph) & BIT(CAN_BIT_POS1(flag)));
    if(ret1 && ret2){
        return SET;
    }else{
        return RESET;
    }
}
Beispiel #3
0
/*!
    \brief      disable CAN interrupt 
    \param[in]  can_periph
      \arg        CANx(x=0,1),the CAN1 only for GD32F30X_CL 
    \param[in]  interrupt
      \arg        CAN_INT_TME: transmit mailbox empty interrupt enable
      \arg        CAN_INT_RFNE0: receive FIFO0 not empty interrupt enable
      \arg        CAN_INT_RFF0: receive FIFO0 full interrupt enable
      \arg        CAN_INT_RFO0: receive FIFO0 overfull interrupt enable
      \arg        CAN_INT_RFNE1: receive FIFO1 not empty interrupt enable
      \arg        CAN_INT_RFF1: receive FIFO1 full interrupt enable
      \arg        CAN_INT_RFO1: receive FIFO1 overfull interrupt enable
      \arg        CAN_INT_WERR: warning error interrupt enable
      \arg        CAN_INT_PERR: passive error interrupt enable
      \arg        CAN_INT_BO: bus-off interrupt enable
      \arg        CAN_INT_ERRN: error number interrupt enable
      \arg        CAN_INT_ERR: error interrupt enable
      \arg        CAN_INT_WU: wakeup interrupt enable
      \arg        CAN_INT_SLPW: sleep working interrupt enable
    \param[out] none
    \retval     none
*/
void can_interrupt_disable(uint32_t can_periph, uint32_t interrupt)
{
    CAN_INTEN(can_periph) &= ~interrupt;
}
Beispiel #4
0
/*!
    \brief      enable CAN interrupt 
    \param[in]  can_periph
      \arg        CANx(x=0,1),the CAN1 only for GD32F30X_CL 
    \param[in]  interrupt 
      \arg        CAN_INT_TME: transmit mailbox empty interrupt enable
      \arg        CAN_INT_RFNE0: receive FIFO0 not empty interrupt enable
      \arg        CAN_INT_RFF0: receive FIFO0 full interrupt enable
      \arg        CAN_INT_RFO0: receive FIFO0 overfull interrupt enable
      \arg        CAN_INT_RFNE1: receive FIFO1 not empty interrupt enable
      \arg        CAN_INT_RFF1: receive FIFO1 full interrupt enable
      \arg        CAN_INT_RFO1: receive FIFO1 overfull interrupt enable
      \arg        CAN_INT_WERR: warning error interrupt enable
      \arg        CAN_INT_PERR: passive error interrupt enable
      \arg        CAN_INT_BO: bus-off interrupt enable
      \arg        CAN_INT_ERRN: error number interrupt enable
      \arg        CAN_INT_ERR: error interrupt enable
      \arg        CAN_INT_WU: wakeup interrupt enable
      \arg        CAN_INT_SLPW: sleep working interrupt enable
    \param[out] none
    \retval     none
*/
void can_interrupt_enable(uint32_t can_periph, uint32_t interrupt)
{
    CAN_INTEN(can_periph) |= interrupt;
}