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?
