This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

IWR6843: CAN Rx don't work

Part Number: IWR6843


Hello all.

Help me please....

I am using classic CAN under CAN-FD. And  referenced "C:\ti\mmwave_sdk_03_04_00_03\packages\ti\drivers\canfd".

CAN Tx is done. It' is working well. But CAN Rx is not working.

Nerver called MCANAppCallback() function.

< Development environment >

B/D : IWR6843 EVM

CAN : PEAK System

SDK : mmwave_sdk_03_04_00_03

Compiler : CCS 9.3.0

static void MCANAppCallback(CANFD_MsgObjHandle handle, CANFD_Reason reason)
{
    int32_t                 errCode, retVal;
    uint32_t                id;
    CANFD_MCANFrameType     rxFrameType;
    CANFD_MCANXidType       rxIdType;

    if (reason == CANFD_Reason_TX_COMPLETION)
    {
        {
            gTxPkts++;
            gTxDoneFlag = 1;
            return;
        }
    }
    if (reason == CANFD_Reason_RX)
    {
        {
            /* Reset the receive buffer */
            memset(&CANrxData, 0, sizeof (CANrxData));
            testDataLength = 0;

            if ((testSelection != MCAN_APP_TEST_EXTERNAL_DATA) && (gRxPkts < MCAN_APP_TEST_MESSAGE_COUNT))
            {
                /* Reset the counter: */
                Test_benchmarkStart(0);
            }
            retVal = CANFD_getData (handle, &id, &rxFrameType, &rxIdType, &rxDataLength, &CANrxData[0], &errCode);
            if (retVal < 0)
            {
                gErrGetData++;
                return;
            }

            if (rxFrameType != testFrameType)
            {
                gErrFrameType++;
                return;
            }

            if ((testSelection != MCAN_APP_TEST_EXTERNAL_DATA) && (gRxPkts < MCAN_APP_TEST_MESSAGE_COUNT))
            {
                /* Stop the counter: */
                rxTicks[gRxPkts] = Test_benchmarkStop(0);

                /* Update the receive statistics: */
                minRxTicks   = (minRxTicks < rxTicks[gRxPkts]) ? minRxTicks : rxTicks[gRxPkts];
                maxRxTicks   = (maxRxTicks > rxTicks[gRxPkts]) ? maxRxTicks : rxTicks[gRxPkts];
                totalRxTicks = totalRxTicks + rxTicks[gRxPkts];
            }

            /* Validate the data */
            if ((testSelection == MCAN_APP_TEST_INTERNAL_LOOPBACK) || (testSelection == MCAN_APP_TEST_EXTERNAL_LOOPBACK) ||
                            (testSelection == MCAN_APP_TEST_EVM_EVM))
            {
                /* Check if sent data has been received */
                if (rxDataLength == txDataLength)
                {
                    while (testDataLength < rxDataLength)
                    {
                        if (CANrxData[testDataLength] != CANtxData[testDataLength])
                        {
                            gErrDataMissMatchCnt++;
                        }
                        testDataLength++;
                    }
                }

            }
            gRxPkts++;
            gRxDoneFlag = 1U;
            return;
        }
    }
    if (reason == CANFD_Reason_TX_CANCELED)
    {
        {
            gTxCancelPkts++;
            gTxDoneFlag = 1U;
            return;
        }
    }
}

static void MCANAppInitParams(CANFD_MCANInitParams* mcanCfgParams)
{
    /*Intialize MCAN Config Params*/
    memset (mcanCfgParams, sizeof (CANFD_MCANInitParams), 0);

    mcanCfgParams->fdMode          = 0x0U;	//0x01U
    mcanCfgParams->brsEnable       = 0x0U;	//0x01U
    mcanCfgParams->txpEnable       = 0x0U;
    mcanCfgParams->efbi            = 0x0U;
    mcanCfgParams->pxhddisable     = 0x0U;
    mcanCfgParams->darEnable       = 0x0U;	//0x01U
    mcanCfgParams->wkupReqEnable   = 0x1U;
    mcanCfgParams->autoWkupEnable  = 0x1U;
    mcanCfgParams->emulationEnable = 0x0U;
    mcanCfgParams->emulationFAck   = 0x0U;
    mcanCfgParams->clkStopFAck     = 0x0U;
    mcanCfgParams->wdcPreload      = 0x0U;
    mcanCfgParams->tdcEnable       = 0x1U;
    mcanCfgParams->tdcConfig.tdcf  = 0U;
    mcanCfgParams->tdcConfig.tdco  = 8U;
    mcanCfgParams->monEnable       = 0x0U;
    mcanCfgParams->asmEnable       = 0x0U;
    mcanCfgParams->tsPrescalar     = 0x0U;
    mcanCfgParams->tsSelect        = 0x0U;
    mcanCfgParams->timeoutSelect   = CANFD_MCANTimeOutSelect_CONT;
    mcanCfgParams->timeoutPreload  = 0x0U;
    mcanCfgParams->timeoutCntEnable= 0x0U;
    mcanCfgParams->filterConfig.rrfe        = 0x1U;
    mcanCfgParams->filterConfig.rrfs        = 0x1U;
    mcanCfgParams->filterConfig.anfe        = 0x3U;		//0x1U
    mcanCfgParams->filterConfig.anfs        = 0x3U;		//0x1U
    mcanCfgParams->msgRAMConfig.lss         = 127U;
    mcanCfgParams->msgRAMConfig.lse         = 64U;
    mcanCfgParams->msgRAMConfig.txBufNum    = 32U;
    mcanCfgParams->msgRAMConfig.txFIFOSize  = 0U;
    mcanCfgParams->msgRAMConfig.txBufMode   = 0U;
    mcanCfgParams->msgRAMConfig.txEventFIFOSize         = 0U;
    mcanCfgParams->msgRAMConfig.txEventFIFOWaterMark    = 0U;
    mcanCfgParams->msgRAMConfig.rxFIFO0size             = 64U;
    mcanCfgParams->msgRAMConfig.rxFIFO0OpMode           = 0U;
    mcanCfgParams->msgRAMConfig.rxFIFO0waterMark        = 0U;
    mcanCfgParams->msgRAMConfig.rxFIFO1size             = 64U;
    mcanCfgParams->msgRAMConfig.rxFIFO1waterMark        = 0U;
    mcanCfgParams->msgRAMConfig.rxFIFO1OpMode           = 0U;

    mcanCfgParams->eccConfig.enable         = 1U;
    mcanCfgParams->eccConfig.enableChk      = 1U;
    mcanCfgParams->eccConfig.enableRdModWr  = 1U;

    mcanCfgParams->errInterruptEnable   = 1U;
    mcanCfgParams->dataInterruptEnable  = 1U;
    mcanCfgParams->appErrCallBack       = MCANAppErrStatusCallback;
    mcanCfgParams->appDataCallBack      = MCANAppCallback;
}

static int32_t mcanTransmitTest()
{
    CANFD_Handle                canHandle;
    CANFD_MsgObjHandle          txMsgObjHandle;
    CANFD_MsgObjHandle          rxMsgObjHandle;
    int32_t                     retVal = 0;
    int32_t                     errCode = 0;
    CANFD_MCANInitParams        mcanCfgParams;
    CANFD_MCANBitTimingParams   mcanBitTimingParams;
    CANFD_MCANMsgObjCfgParams   txMsgObjectParams;
    CANFD_MCANMsgObjCfgParams   rxMsgObjectParams;
#if 0	/* Tx variables */
    CANFD_OptionTLV             optionTLV;	
    CANFD_MCANMsgObjectStats    msgObjStats;
    CANFD_MCANErrCntStatus      errCounter;
    CANFD_MCANProtocolStatus    protoStatus;
	uint32_t                    length = MCAN_APP_TEST_DATA_SIZE;
	uint32_t                    index = 0U;
	uint32_t                    msgId ;
    uint32_t                    idIndex = 0;
#endif

    gTxDoneFlag = 0;
    gRxDoneFlag = 0;

    MCANAppInitParams (&mcanCfgParams);

    /* Initialize the CANFD driver */
    canHandle = CANFD_init(gInstanceId, &mcanCfgParams, &errCode);
    if (canHandle == NULL)
    {
        System_printf ("Error: CANFD Module Initialization failed [Error code %d]\n", errCode);
        return -1;
    }

    /* Configuring 1Mbps and 5Mbps as nominal and data bit-rate respectively
        Prop seg: 8
        Ph seg 1: 6
        Ph Seg2 : 5
        Sync jump: 1
        BRP(Baud rate Prescaler): 2

        Nominal Bit rate = (40)/(((8+6+5)+1)*BRP) = 1Mhz

        Timing Params for Data Bit rate:
        Prop seg: 2
        Ph seg 1: 2
        Ph Seg2 : 3
        Sync jump: 1
        BRP(Baud rate Prescaler): 1

        Nominal Bit rate = (40)/(((2+2+3)+1)*BRP) = 5Mhz
    */
#if 0
    mcanBitTimingParams.nomBrp      = 0x2U;
    mcanBitTimingParams.nomPropSeg  = 0x8U;
    mcanBitTimingParams.nomPseg1    = 0x6U;
    mcanBitTimingParams.nomPseg2    = 0x5U;
    mcanBitTimingParams.nomSjw      = 0x1U;

	/*5MHz*/
    mcanBitTimingParams.dataBrp     = 0x1U;
    mcanBitTimingParams.dataPropSeg = 0x2U;
    mcanBitTimingParams.dataPseg1   = 0x2U;
    mcanBitTimingParams.dataPseg2   = 0x3U;
    mcanBitTimingParams.dataSjw     = 0x1U;
#else
	/* 500kHz */
    mcanBitTimingParams.nomBrp      = 0x4U;
    mcanBitTimingParams.nomPropSeg  = 0x8U;
    mcanBitTimingParams.nomPseg1    = 0x6U;
    mcanBitTimingParams.nomPseg2    = 0x5U;
    mcanBitTimingParams.nomSjw      = 0x1U;

	/* 500kHz */
    mcanBitTimingParams.dataBrp     = 0x4U;
    mcanBitTimingParams.dataPropSeg = 0x8U;
    mcanBitTimingParams.dataPseg1   = 0x6U;
    mcanBitTimingParams.dataPseg2   = 0x5U;
    mcanBitTimingParams.dataSjw     = 0x1U;
#endif

    /* Configure the CAN driver */
    retVal = CANFD_configBitTime (canHandle, &mcanBitTimingParams, &errCode);
    if (retVal < 0)
    {
        System_printf ("Error: CANFD Module configure bit time failed [Error code %d]\n", errCode);
        return -1;
    }

    /* Setup the transmit message object */
    txMsgObjectParams.direction = CANFD_Direction_TX;
    txMsgObjectParams.msgIdType = CANFD_MCANXidType_11_BIT;
    txMsgObjectParams.msgIdentifier = 0xC1;

    txMsgObjHandle = CANFD_createMsgObject (canHandle, &txMsgObjectParams, &errCode);
    if (txMsgObjHandle == NULL)
    {
        System_printf ("Error: CANFD create Tx message object failed [Error code %d]\n", errCode);
        return -1;
    }

    /* Setup the receive message object */
    rxMsgObjectParams.direction = CANFD_Direction_RX;
    rxMsgObjectParams.msgIdType = CANFD_MCANXidType_11_BIT;
    rxMsgObjectParams.msgIdentifier = 0xC1;

    rxMsgObjHandle = CANFD_createMsgObject (canHandle, &rxMsgObjectParams, &errCode);
    if (rxMsgObjHandle == NULL)
    {
        System_printf ("Error: CANFD create Rx message object failed [Error code %d]\n", errCode);
        return -1;
    }

#if 1	/* Waiting for CAN Rx data */
	while(1)
	{
		System_printf("Wating Rx data\n");
		Task_sleep(10U);
	}

#else	/* Loop for CAN Tx data */
    while (1)
    {
        /* Send data over Tx message object */
        if (testFrameType == CANFD_MCANFrameType_FD)
		{

			length = 128U;
            if(idIndex > 10)
            {
                idIndex = 0;
            }
			msgId = txMsgObjectParams.msgIdentifier + idIndex;
			Task_sleep(1U);
            while(length > MCAN_APP_TEST_DATA_SIZE)
            {

				retVal = CANFD_transmitData (txMsgObjHandle, msgId, CANFD_MCANFrameType_FD, MCAN_APP_TEST_DATA_SIZE, &CANtxData[0], &errCode);
				length = length - MCAN_APP_TEST_DATA_SIZE;
				Task_sleep(1);
			}
            idIndex++;
		}
        else
        {

			length = 128U;
			index = 0;
			msgId = txMsgObjectParams.msgIdentifier;
			Task_sleep(1);
            while(length > 8U)
            {

				retVal = CANFD_transmitData (txMsgObjHandle, msgId, CANFD_MCANFrameType_CLASSIC, 8U, &CANtxData[index], &errCode);
				length = length - 8U;
				index = index + 8U;
				msgId = msgId + 1U;
				Task_sleep(1U);
			}
			retVal = CANFD_transmitData (txMsgObjHandle, msgId, CANFD_MCANFrameType_CLASSIC, length, &CANtxData[index], &errCode);

		}
        Task_sleep(2U);
        if (retVal < 0)
        {
            gErrMsgLstCnt++;
            continue;
        }

        iterationCount++;

        if (gDisplayStats == 1U)
        {
            gDisplayStats = 0;

            System_printf("Debug: Number of iterations              : %d\n", iterationCount);
            System_printf("Debug: Number of messages transmitted    : %d\n", gTxPkts);
            System_printf("Debug: Number of messages received       : %d\n", gRxPkts);
            System_printf("Debug: Number of messages lost           : %d\n", gErrMsgLstCnt);
            System_printf("Debug: Error Status Interrupt            : %d\n", gErrStatusInt);
            System_printf("Debug: Error Reason                      : %d\n", gErrorReason);
            System_printf("\n\n");

            msgObjStats.handle = txMsgObjHandle;
            optionTLV.type = CANFD_Option_MCAN_MSG_OBJECT_STATS;
            optionTLV.length = sizeof(CANFD_MCANMsgObjectStats);
            optionTLV.value = (void*) &msgObjStats;

            retVal =  CANFD_getOptions(canHandle, &optionTLV, &errCode);
            if (retVal < 0)
            {
                System_printf ("Error: CANFD get stats failed [Error code %d]\n", errCode);
            }

            System_printf("Debug: Message Identifier                : 0x%x\n", msgObjStats.startMsgIdentifier);
            System_printf("Debug: Direction                         : %s\n", (msgObjStats.direction == 0) ? "Receive" : "Transmit");
            System_printf("Debug: Number of interrupts received     : %d\n", msgObjStats.interruptsRxed);
            System_printf("Debug: Number of messages processed      : %d\n", msgObjStats.messageProcessed);
            System_printf("\n\n");

            msgObjStats.handle = rxMsgObjHandle;
            retVal =  CANFD_getOptions(canHandle, &optionTLV, &errCode);
            if (retVal < 0)
            {
                System_printf ("Error: CANFD get stats failed [Error code %d]\n", errCode);
            }

            System_printf("Debug: Message Identifier                : 0x%x\n", msgObjStats.startMsgIdentifier);
            System_printf("Debug: Direction                         : %s\n", (msgObjStats.direction == 0) ? "Receive" : "Transmit");
            System_printf("Debug: Number of interrupts received     : %d\n", msgObjStats.interruptsRxed);
            System_printf("Debug: Number of messages processed      : %d\n", msgObjStats.messageProcessed);
            System_printf("\n\n");

            optionTLV.type = CANFD_Option_MCAN_ERROR_COUNTER;
            optionTLV.length = sizeof(CANFD_MCANErrCntStatus);
            optionTLV.value = (void*) &errCounter;

            retVal =  CANFD_getOptions(canHandle, &optionTLV, &errCode);
            if (retVal < 0)
            {
                System_printf ("Error: CANFD get error counter failed [Error code %d]\n", errCode);
            }

            System_printf("Debug: Receive passive status            : %d\n", errCounter.rpStatus);
            System_printf("Debug: Transmit Error Counter            : %d\n", errCounter.transErrLogCnt);
            System_printf("Debug: Receive Error Counter             : %d\n", errCounter.recErrCnt);
            System_printf("Debug: Error Logging Counter             : %d\n", errCounter.canErrLogCnt);
            System_printf("\n\n");

            optionTLV.type = CANFD_Option_MCAN_PROTOCOL_STATUS;
            optionTLV.length = sizeof(CANFD_MCANProtocolStatus);
            optionTLV.value = (void*) &protoStatus;

            retVal =  CANFD_getOptions(canHandle, &optionTLV, &errCode);
            if (retVal < 0)
            {
                System_printf ("Error: CANFD get protocol status failed [Error code %d]\n", errCode);
            }

            System_printf("Debug: LEC                               : %d\n", protoStatus.lastErrCode);
            System_printf("Debug: Activity                          : %d\n", protoStatus.act);
            System_printf("Debug: Error Passive                     : %d\n", protoStatus.errPassive);
            System_printf("Debug: Warning Status                    : %d\n", protoStatus.warningStatus);
            System_printf("Debug: Bus Off Status                    : %d\n", protoStatus.busOffStatus);
            System_printf("Debug: Data Phase LEC                    : %d\n", protoStatus.dlec);
            System_printf("Debug: Rx ESI flag                       : %d\n", protoStatus.resi);
            System_printf("Debug: Rx BRS flag                       : %d\n", protoStatus.rbrs);
            System_printf("Debug: Rx CAN FD                         : %d\n", protoStatus.rfdf);
            System_printf("Debug: Protocol Exception Event          : %d\n", protoStatus.pxe);
            System_printf("Debug: TDC value                         : %d\n", protoStatus.tdcv);
            System_printf("\n\n");
        }
    }
#endif
}

Can Tx and Rx work together?