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.

AWR1843BOOST: CanFD interface is not working in SBL with Uniflash

Part Number: AWR1843BOOST
Other Parts Discussed in Thread: UNIFLASH

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 

  • Please make sure you double check the Memory Protection configuration in the SBL design document

    thank you
    Cesar
  • 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

  • Hello Ramana,

    Please refer to the below link where the SBL is being implemented as per the steps mentioned in the appendix.
    e2e.ti.com/.../2771385
    Please check the thread for the SBL code.

    Also could you post any of the error logs or what is seen in your serial console when you have flashed the code?

    -Raghu
  • 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