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.
Hi,
I tried implementing CANFD based Secondary Bootloader(SBL) with the TI base code.As mentioned in the SBL design document I started implementing with CANFD.
I have done minimum initialization of CANFD in the SBL code.CAN transmission and receiving is working fine in the Code composer studio(CCS). When I burm the binary using uniflash it is not working and showing that BUSPASSIVE error.
Please help me in these.
TIA,
Ramana
HI Cesar,
I haven't changed anything in terms of memory. I am using default memory configurations of SBL.
Is there anything I need to change in terms of memory?
Can you brief it down?
TIA,
Ramana
Hi Cesar,
I have gone through the code.In sbl.c file line number 627 they mentioned about the MPU settings as following:
/* Configure the MPU for MSS regions, DSS regions and peripherals after calling SOC init.
* BSS regions will be configured when BSS image is downloaded.
*/
SBL_mpuConfigDefault();
Can you provide me the CANFD peripheral MPU settings.
I have tried adding with following settings to the SBL_mpuConfigDefault() function...but it didn't work.
#if ((SOC_XWR18XX_MSS_MCAN_MEM_BASE_ADDRESS & (128U - 1)) != 0)
#error SOC_XWR18XX_MSS_MCAN_BASE_ADDRESS not aligned to 128 bytes
#endif
SOC_MPUSetRegion(SOC_MPU_REGION12);
SOC_MPUSetRegionBaseAddress(SOC_XWR18XX_MSS_MCAN_MEM_BASE_ADDRESS);
SOC_MPUSetRegionTypeAndPermission(SOC_MPU_STRONGLYORDERED_SHAREABLE, SOC_MPU_PRIV_RW_USER_RO_NOEXEC);
SOC_MPUSetRegionSizeRegister(SOC_MPU_REGION_ENABLE | SOC_MPU_128_BYTES);
Please provide me the valid MPU settings for the CANFD peripheral.
TIA,
Ramana
Hi Raghu,
I am also facing the the similar problem as the above thread.
Following is the code snippet:
static void MCANAppInitParams(CANFD_MCANInitParams *mcanCfgParams)
{
/*Intialize MCAN Config Params*/
memset(mcanCfgParams, 0, sizeof(CANFD_MCANInitParams));
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 = 64U;
mcanCfgParams->msgRAMConfig.rxFIFO0OpMode = 0U;
mcanCfgParams->msgRAMConfig.rxFIFO0waterMark = 0U;
mcanCfgParams->msgRAMConfig.rxFIFO1size = 64U;
mcanCfgParams->msgRAMConfig.rxFIFO1waterMark = 0U;
mcanCfgParams->msgRAMConfig.rxFIFO1OpMode = 0U;
mcanCfgParams->eccConfig.enable = 1;
mcanCfgParams->eccConfig.enableChk = 1;
mcanCfgParams->eccConfig.enableRdModWr = 1;
mcanCfgParams->errInterruptEnable = 1U;
mcanCfgParams->dataInterruptEnable = 1U;
//Triggering callback function for fault interrupts
mcanCfgParams->appErrCallBack = sblErrStatusCallback;
mcanCfgParams->appDataCallBack = sblDataCallback;
}
void PP_CANFD_Init(void)
{
CANFD_MCANInitParams mcanCfgParams;
CANFD_MCANBitTimingParams mcanBitTimingParams;
int32_t errCode, retVal;
CANFD_MCANMsgObjCfgParams rxMsgObjectParams, txMsgObjectParams;
MCANAppInitParams(&mcanCfgParams);
/* Initialize the CANFD driver */
gSblMCB.canfdHandle = CANFD_init(&mcanCfgParams, &errCode);
if (gSblMCB.canfdHandle == NULL)
{
SBL_printf("Error: CANFD Module Initialization failed [Error code %d]\n", errCode);
return;
}
/* Configure the bit timing parameters. */
mcanBitTimingParams.nomBrp = CANFD_NOMILAL_BRP;
mcanBitTimingParams.nomPropSeg = 0x8U;
mcanBitTimingParams.nomPseg1 = 0x6U;
mcanBitTimingParams.nomPseg2 = 0x5U;
mcanBitTimingParams.nomSjw = 0x1U;
mcanBitTimingParams.dataBrp = 0x1U;
mcanBitTimingParams.dataPropSeg = 0x2U;
mcanBitTimingParams.dataPseg1 = 0x2U;
mcanBitTimingParams.dataPseg2 = 0x3U;
mcanBitTimingParams.dataSjw = 0x1U;
retVal = CANFD_configBitTime(gSblMCB.canfdHandle, &mcanBitTimingParams, &errCode);
if (retVal < 0)
{
SBL_printf("Error: CANFD Module configure bit time failed [Error code %d]\n", errCode);
return;
}
txMsgObjectParams.direction = CANFD_Direction_TX;
txMsgObjectParams.msgIdType = CANFD_MCANXidType_11_BIT;
txMsgObjectParams.msgIdentifier = SBL_CANFD_TRANSMIT_ID;
txMsgObjHandle = CANFD_createMsgObject(gSblMCB.canfdHandle, &txMsgObjectParams, &errCode);
if (txMsgObjHandle == NULL)
{
SBL_printf("Error: CANFD create Rx message object failed [Error code %d]\n", errCode);
return;
}
rxMsgObjectParams.direction = CANFD_Direction_RX;
rxMsgObjectParams.msgIdType = CANFD_MCANXidType_11_BIT;
rxMsgObjectParams.msgIdentifier = SBL_CANFD_HANDSHAKE_MESSAGE_ID;
rxMsgObjHandle1 = CANFD_createMsgObject(gSblMCB.canfdHandle, &rxMsgObjectParams, &errCode);
if (rxMsgObjHandle1 == NULL)
{
SBL_printf("Error: CANFD create Rx message object failed [Error code %d]\n", errCode);
return;
}
/* Setup the receive message object for receiving data packets. */
rxMsgObjectParams.direction = CANFD_Direction_RX;
rxMsgObjectParams.msgIdType = CANFD_MCANXidType_11_BIT;
rxMsgObjectParams.msgIdentifier = SBL_CANFD_TRANSFER_DATA_MSG_ID;
rxMsgObjHandle2 = CANFD_createMsgObject(gSblMCB.canfdHandle, &rxMsgObjectParams, &errCode);
if (rxMsgObjHandle2 == NULL)
{
SBL_printf("Error: CANFD create Rx message object failed [Error code %d]\n", errCode);
return;
}
/* Setup the receive message object for receiving terminate packets. */
rxMsgObjectParams.direction = CANFD_Direction_RX;
rxMsgObjectParams.msgIdType = CANFD_MCANXidType_11_BIT;
rxMsgObjectParams.msgIdentifier = SBL_CANFD_TERMINATE_MSG_ID;
rxMsgObjHandle3 = CANFD_createMsgObject(gSblMCB.canfdHandle, &rxMsgObjectParams, &errCode);
if (rxMsgObjHandle3 == NULL)
{
SBL_printf("Error: CANFD create Rx message object failed [Error code %d]\n", errCode);
return;
}
}
int32_t gPP_CanTransmit(uint8_t *dataptr, uint32_t datalength, uint32_t msgId)
{
int32_t retVal, errCode;
retVal = CANFD_transmitData(txMsgObjHandle, SBL_CANFD_TRANSMIT_ID, frameType, datalength, dataptr, &errCode);
if (retVal != 0)
{
SBL_printf("###Debug:CAN transmit failed:%d and Errcode :%d\r\n", retVal,errCode);
return 0;
}
SBL_printf("CAN tx done and Errcode:%d\r\n",errCode);
return 1;
}
void SBL_initTask(UArg arg0, UArg arg1)
{
int32_t retVal = 0;
uint8_t autoboot = SBL_AUTOBOOT_COUNT;
uint32_t metaimageUpdate = 0;
uint8_t CanSendData[8] = {[0 ... 7] = 0xAA};
/* Initialize transport peripheral */
SBL_transportInit();
SBL_printf("\r\n");
SBL_printf("**********************************************\r\n");
SBL_printf("Debug: Secondary Bootloader Application Start \r\n");
SBL_printf("**********************************************\r\n");
int16_t i = 10;
while (i--)
{
gPP_CanTransmit(CanSendData, 8U, SBL_CANFD_TRANSMIT_ID);
Task_sleep(10U);
}
return ;
}
With these code I am able to see following logs in the PCAN VIEW:
Ramana,
Can you check by having only the receive objects in your SBL code?
-Raghu
Hi Raghu,
I removed all the all other receive message objects and kept only one transmit and one receive object but still it is not working.
Following is my code :
static void MCANAppInitParams(CANFD_MCANInitParams *mcanCfgParams)
{
/*Intialize MCAN Config Params*/
memset(mcanCfgParams, 0, sizeof(CANFD_MCANInitParams));
mcanCfgParams->fdMode = 0x1U;
mcanCfgParams->brsEnable = 0x0U;
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;
//Triggering callback function for fault interrupts
mcanCfgParams->appErrCallBack = sblErrStatusCallback;
mcanCfgParams->appDataCallBack = sblDataCallback;
}
void PP_CANFD_Init(void)
{
CANFD_MCANInitParams mcanCfgParams;
CANFD_MCANBitTimingParams mcanBitTimingParams;
int32_t errCode, retVal;
CANFD_MCANMsgObjCfgParams rxMsgObjectParams, txMsgObjectParams;
MCANAppInitParams(&mcanCfgParams);
/* Initialize the CANFD driver */
gSblMCB.canfdHandle = CANFD_init(&mcanCfgParams, &errCode);
if (gSblMCB.canfdHandle == NULL)
{
SBL_printf("Error: CANFD Module Initialization failed [Error code %d]\n", errCode);
return;
}
/* Configure the bit timing parameters. */
mcanBitTimingParams.nomBrp = 0x2U;
mcanBitTimingParams.nomPropSeg = 0x8U;
mcanBitTimingParams.nomPseg1 = 0x6U;
mcanBitTimingParams.nomPseg2 = 0x5U;
mcanBitTimingParams.nomSjw = 0x1U;
mcanBitTimingParams.dataBrp = 0x1U;
mcanBitTimingParams.dataPropSeg = 0x2U;
mcanBitTimingParams.dataPseg1 = 0x2U;
mcanBitTimingParams.dataPseg2 = 0x3U;
mcanBitTimingParams.dataSjw = 0x1U;
retVal = CANFD_configBitTime(gSblMCB.canfdHandle, &mcanBitTimingParams, &errCode);
if (retVal < 0)
{
SBL_printf("Error: CANFD Module configure bit time failed [Error code %d]\n", errCode);
return;
}
txMsgObjectParams.direction = CANFD_Direction_TX;
txMsgObjectParams.msgIdType = CANFD_MCANXidType_11_BIT;
txMsgObjectParams.msgIdentifier = SBL_CANFD_TRANSMIT_ID;
txMsgObjHandle = CANFD_createMsgObject(gSblMCB.canfdHandle, &txMsgObjectParams, &errCode);
if (txMsgObjHandle == NULL)
{
SBL_printf("Error: CANFD create Rx message object failed [Error code %d]\n", errCode);
return;
}
rxMsgObjectParams.direction = CANFD_Direction_RX;
rxMsgObjectParams.msgIdType = CANFD_MCANXidType_11_BIT;
rxMsgObjectParams.msgIdentifier = SBL_CANFD_TRANSMIT_ID;
rxMsgObjHandle4 = CANFD_createMsgObject(gSblMCB.canfdHandle, &rxMsgObjectParams, &errCode);
if (rxMsgObjHandle4 == NULL)
{
SBL_printf("Error: CANFD create Rx message object failed [Error code %d]\n", errCode);
return;
}
uint8_t dataptr[8] = {[0 ... 7]=0xAA};
retVal = CANFD_transmitData(txMsgObjHandle, SBL_CANFD_TRANSMIT_ID, frameType, 8U, dataptr, &errCode);
if (retVal != 0)
{
SBL_printf("###Debug:CAN transmit failed:%d\r\n", retVal);
SBL_printf("CAN Error VAlue:%d\r\n", errCode);
}
else
{
SBL_printf("Transmit done and errcode:%d\r\n",errCode);
}
}
It is working fine with code composer studio.
After flashing these code I am getting following error in the PCAN:
Hi Raghu,
My issue got resolved . Nothing to do with message objects.
Thanks for the help.
-Ramana