Приемник шины CAN не получает - PullRequest
0 голосов
/ 15 февраля 2019

Я работаю с PIC32MX795F512L.С кодом ниже я могу передавать, но не могу получить.Как это возможно, я могу передавать, но не могу получить?Будем благодарны за любые предложения.

Вот код инициализации:

void CAN1Init(void) {

    CAN_BIT_CONFIG canBitConfig;
    UINT baudPrescalar;

    PORTSetPinsDigitalIn(IOPORT_F, BIT_0);
    PORTSetPinsDigitalOut(IOPORT_F, BIT_1);
    // ODCFSET    = BIT_1;

    // change the CAN1 RX register from anlog to digital
    // PORTSetPinsDigitalIn(IOPORT_F, BIT_0);
    // PORTSetPinsDigitalOut(IOPORT_F, BIT_1);

    CANEnableModule(CAN1, TRUE);

    // Set the CAN_en pin to low, which is at RC3
    mPORTCClearBits(BIT_3);
    PORTSetPinsDigitalOut(IOPORT_C, BIT_3);

    CANSetOperatingMode(CAN1, CAN_CONFIGURATION);
    while (CANGetOperatingMode(CAN1) != CAN_CONFIGURATION);

    canBitConfig.phaseSeg2Tq = CAN_BIT_3TQ;
    canBitConfig.phaseSeg1Tq = CAN_BIT_3TQ;
    canBitConfig.propagationSegTq = CAN_BIT_3TQ;
    canBitConfig.phaseSeg2TimeSelect = TRUE;
    canBitConfig.sample3Time = TRUE;
    canBitConfig.syncJumpWidth = CAN_BIT_2TQ;

    // baudPrescalar = CANCalcBitClockPrescalar(&canBitConfig,80000000,250000);

    CANSetSpeed(CAN1, & canBitConfig, SYS_FREQ, CAN_BUS_SPEED);

    /* Step 3: Assign the buffer area to the
     * CAN module.
     */

    CANAssignMemoryBuffer(CAN1, CAN1MessageFifoArea, (2 * 8 * 16));

    CANConfigureChannelForTx(CAN1, CAN_CHANNEL0, 8, CAN_TX_RTR_DISABLED, CAN_LOW_MEDIUM_PRIORITY);
    CANConfigureChannelForRx(CAN1, CAN_CHANNEL1, 8, CAN_RX_FULL_RECEIVE);

    //CANConfigureFilter      (CAN1, CAN_FILTER0, 0x000, CAN_SID);
    //CANConfigureFilterMask  (CAN1, CAN_FILTER_MASK0, 0x7FF, CAN_SID, CAN_FILTER_MASK_IDE_TYPE);
    // CANLinkFilterToChannel (CAN1, CAN_FILTER0, CAN_FILTER_MASK0, CAN_CHANNEL1);
    // CANEnableFilter        (CAN1, CAN_FILTER0, TRUE);

    CANEnableChannelEvent(CAN1, CAN_CHANNEL1, CAN_RX_CHANNEL_NOT_EMPTY, TRUE);
    CANEnableModuleEvent(CAN1, CAN_RX_EVENT, TRUE);

    INTSetVectorPriority(INT_CAN_1_VECTOR, INT_PRIORITY_LEVEL_4);
    INTSetVectorSubPriority(INT_CAN_1_VECTOR, INT_SUB_PRIORITY_LEVEL_0);
    INTEnable(INT_CAN1, INT_ENABLED);

    /* Step 7: Switch the CAN mode
     * to normal mode. */

    CANSetOperatingMode(CAN1, CAN_NORMAL_OPERATION);

    mPORTEToggleBits(BIT_6 | BIT_7);
    while (CANGetOperatingMode(CAN1) != CAN_NORMAL_OPERATION);

    CANSetTimeStampValue(CAN1, 0x00);
    printf("CAN BUS is working\n");

}

Редактировать: основная часть кода:

 void RxMsgProcess(void)
{        
    if(isCAN1MsgReceived == FALSE) // This flag to make sure there is an interrupt from receiving a new message, if it's true then there are new packet
    {        
        return;
    }
    isCAN1MsgReceived = FALSE;
    CANRxMessageBuffer * message2;
    message2 = CANGetRxMessage(CAN1,CAN_CHANNEL1);
    printf(" received\n");
        CANUpdateChannel(CAN1, CAN_CHANNEL1);
        CANEnableChannelEvent(CAN1, CAN_CHANNEL1, CAN_RX_CHANNEL_NOT_EMPTY, TRUE);

}



 void __attribute__((vector(46), interrupt(ipl4), nomips16)) CAN1InterruptHandler(void)
{
    /* Check if the source of the interrupt is
     * RX_EVENT. This is redundant since only this
     * event is enabled in this example but
     * this shows one scheme for handling events. */

    if((CANGetModuleEvent(CAN1) & CAN_RX_EVENT) != 0)
    {
        /* Within this, you can check which channel caused the
         * event by using the CANGetModuleEvent() function
         * which returns a code representing the highest priority
         * pending event. */

        if(CANGetPendingEventCode(CAN1) == CAN_CHANNEL1_EVENT)
        {
            CANEnableChannelEvent(CAN1, CAN_CHANNEL1, CAN_RX_CHANNEL_NOT_EMPTY, FALSE);
            isCAN1MsgReceived = TRUE;         
    }
    }
    INTClearFlag(INT_CAN1);

}
...