Hi,
I've added canfd to the mmwave demo and have managed to make it work correctly for sending can classic frames. However, when a can frame is received from the bus the object data stops being received over either UART in the mmwave demo visualizer, or over can. I can hear the radar continue to chirp for another 7 seconds or so then it stops. Is there a demo somewhere of how to use the can rx? Below is the code for how I set up canfd, which is called in MmwDemo_initTask . I've tried creating a separate task that will call CLI_write to print the data from rxData when gRxPkts is incremented but with no success.
Thanks,
Lachie
/**************************************************************************
*************************** Global Definitions ***************************
**************************************************************************/
volatile uint32_t gTxDoneFlag = 0, gRxDoneFlag = 0, gParityErrFlag = 0;
volatile uint32_t gTxPkts = 0, gRxPkts = 0, gErrStatusInt = 0;
volatile uint32_t iterationCount = 0U;
uint32_t dataLength = 0U;
uint32_t msgLstErrCnt = 0U;
uint32_t gDisplayStats = 0;
uint8_t rxData[64U];
uint32_t txDataLength, rxDataLength;
// CANFD_MCANFrameType frameType = CANFD_MCANFrameType_FD;
CANFD_MCANFrameType frameType = CANFD_MCANFrameType_CLASSIC;
static void MCANAppInitParams(CANFD_MCANInitParams *mcanCfgParams);
CANFD_Handle canHandle;
CANFD_MsgObjHandle txMsgObjHandle;
CANFD_MCANMsgObjCfgParams txMsgObjectParams;
uint8_t canInstanceId = 0;
/**************************************************************************
*************************** Can functions ***************************
**************************************************************************/
static int32_t PlatformInit(void)
{
/* Setup the PINMUX to bring out the XWR68xx CANFD pins */
Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINE14_PADAE, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);
Pinmux_Set_FuncSel(SOC_XWR68XX_PINE14_PADAE, SOC_XWR68XX_PINE14_PADAE_CANFD_TX);
Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PIND13_PADAD, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);
Pinmux_Set_FuncSel(SOC_XWR68XX_PIND13_PADAD, SOC_XWR68XX_PIND13_PADAD_CANFD_RX);
/* Setup the PINMUX to bring out the XWR68xx CANFD-2 pins */
Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINE15_PADAG, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);
Pinmux_Set_FuncSel(SOC_XWR68XX_PINE15_PADAG, SOC_XWR68XX_PINE15_PADAG_CANFD2_TX);
Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINE13_PADAF, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);
Pinmux_Set_FuncSel(SOC_XWR68XX_PINE13_PADAF, SOC_XWR68XX_PINE13_PADAF_CANFD2_RX);
// Set gpio_1 up to select canfd mux for can on mistral module
Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINJ13_PADAC, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);
Pinmux_Set_FuncSel(SOC_XWR68XX_PINJ13_PADAC, SOC_XWR68XX_PINJ13_PADAC_GPIO_1);
GPIO_setConfig (SOC_XWR68XX_GPIO_1, GPIO_CFG_OUTPUT);
// //write low to gpio_1
GPIO_write (SOC_XWR68XX_GPIO_1, 0U);
return 0;
}
void Can_Initalize(void)
{
int32_t errCode = 0;
int32_t retVal = 0;
CANFD_MCANInitParams mcanCfgParams;
CANFD_MCANBitTimingParams mcanBitTimingParams;
CANFD_MCANMsgObjCfgParams rxMsgObjectParams;
CANFD_MsgObjHandle rxMsgObjHandle;
gTxDoneFlag = 0;
gRxDoneFlag = 0;
/* Setup the PINMUX to bring out the XWR16xx CAN pins */
PlatformInit();
/* Configure the divide value for MCAN source clock */
SOC_setPeripheralClock(gMmwMssMCB.socHandle, SOC_MODULE_MCAN, SOC_CLKSOURCE_VCLK, 4U, &errCode);
/* Initialize peripheral memory */
SOC_initPeripheralRam(gMmwMssMCB.socHandle, SOC_MODULE_MCAN, &errCode);
MCANAppInitParams(&mcanCfgParams);
/* Initialize the CANFD driver */
canHandle = CANFD_init(canInstanceId, &mcanCfgParams, &errCode);
if (canHandle == NULL)
{
System_printf("Error: CANFD Module Initialization failed [Error code %d]\n", errCode);
return;
}
/* 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
*/
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;
/* 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;
}
/* Setup the transmit message object */
txMsgObjectParams.direction = CANFD_Direction_TX;
txMsgObjectParams.msgIdType = CANFD_MCANXidType_29_BIT;
txMsgObjectParams.msgIdentifier = 0xD1;
txMsgObjHandle = CANFD_createMsgObject(canHandle, &txMsgObjectParams, &errCode);
if (txMsgObjHandle == NULL)
{
System_printf("Error: CANFD create Tx message object failed [Error code %d]\n",
errCode);
return;
}
/* Setup the receive message object */
rxMsgObjectParams.direction = CANFD_Direction_RX;
rxMsgObjectParams.msgIdType = CANFD_MCANXidType_29_BIT;
rxMsgObjectParams.msgIdentifier = 0xD1;
rxMsgObjHandle = CANFD_createMsgObject(canHandle, &rxMsgObjectParams, &errCode);
if (rxMsgObjHandle == NULL)
{
System_printf("Error: CANFD create Rx message object failed [Error code %d]\n",
errCode);
return;
}
}
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(&rxData, 0, sizeof(rxData));
dataLength = 0;
retVal = CANFD_getData(handle, &id, &rxFrameType, &rxIdType, &rxDataLength,
&rxData[0], &errCode);
if (retVal < 0)
{
System_printf ("Error: CAN receive data for iteration %d failed [Error code %d]\n", iterationCount, errCode);
return;
}
if (rxFrameType != frameType)
{
System_printf ("Error: CAN received incorrect frame type Sent %d Received %d for iteration %d failed\n", frameType, rxFrameType, iterationCount);
return;
}
/* Validate the data */
gRxPkts++;
gRxDoneFlag = 1;
return;
}
}
if (reason == CANFD_Reason_TX_CANCELED)
{
{
gTxPkts++;
gTxDoneFlag = 1;
gRxDoneFlag = 1;
return;
}
}
}
static void MCANAppErrStatusCallback(CANFD_Handle handle, CANFD_Reason reason,
CANFD_ErrStatusResp *errStatusResp)
{
/*Record the error count */
gErrStatusInt++;
return;
}
static void MCANAppInitParams(CANFD_MCANInitParams *mcanCfgParams)
{
/*Intialize MCAN Config Params*/
memset(mcanCfgParams, sizeof(CANFD_MCANInitParams), 0);
mcanCfgParams->fdMode = 0x1U;
mcanCfgParams->brsEnable = 0x1U;
mcanCfgParams->txpEnable = 0x0U;
mcanCfgParams->efbi = 0x0U;
mcanCfgParams->pxhddisable = 0x0U;
mcanCfgParams->darEnable = 0x1U;
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 = 0x1U;
mcanCfgParams->filterConfig.anfs = 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 = 0U;
mcanCfgParams->msgRAMConfig.rxFIFO0OpMode = 0U;
mcanCfgParams->msgRAMConfig.rxFIFO0waterMark = 0U;
mcanCfgParams->msgRAMConfig.rxFIFO1size = 64U;
mcanCfgParams->msgRAMConfig.rxFIFO1waterMark = 64U;
mcanCfgParams->msgRAMConfig.rxFIFO1OpMode = 64U;
mcanCfgParams->eccConfig.enable = 1;
mcanCfgParams->eccConfig.enableChk = 1;
mcanCfgParams->eccConfig.enableRdModWr = 1;
mcanCfgParams->errInterruptEnable = 1U;
mcanCfgParams->dataInterruptEnable = 1U;
mcanCfgParams->appErrCallBack = MCANAppErrStatusCallback;
mcanCfgParams->appDataCallBack = MCANAppCallback;
}