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.

TMS320F28P559SJ-Q1: MCAN send data value alwasy 0

Part Number: TMS320F28P559SJ-Q1

Tool/software:

Customer port their firmware from F280039 to F28P55, I confirmed their project has changed all driverlib and header file to F28P55, and now project all function work well on F28P55 except MCAN has issue. The MCAN could send out data with correct ID but content always 0 as below capture. I have attach the customer MCAN code, appreciate expert review if any setting wrong? The MCAN code is totally same as their F280039 project and can work ok in F280039. 

 Drv_MCAN.h

/** **********************************************************************
  * @copyright ����������ص����ɷ����޹�˾ ��ͨ��ҵ��
  * @file      Drv_MCAN.c
  * @author    HUHAOMING
  * @date      2023-03-01
  * @version   V1.0.0
  * @brief     �����������ʼ���������ͺ�������
  * @remarks   ��
**************************************************************************/

#include"F28x_Project.h"
//#include "driverlib.h"
//#include "device.h"
//#include"UDSCAN.h"
//#include "inc/stw_types.h"
//#include "inc/stw_dataTypes.h"

//#define CANDRV_C_TX_PHY_ADDR_STD_CANMSGID 0x780

typedef struct
{
	uint8_t  MailBox;	//�����
	uint32_t MsgId;	//id
	uint32_t MsgIdMask;//����	
}CAN_CFG;

typedef struct
{
    uint8_t  MailBox;   //�����
    uint32_t MsgId; //id
    uint32_t MsgIdMask;//����
    uint8_t  txMsg_fdf;   //CANFDѡ��
    uint8_t  txMsg_xtd;   //��չ֡��׼֡ѡ��
}CAN_CFG_TX;

  uint32_t MCanGetDataLen(uint32_t dlc);
  static void MCAN_calcMsgRamParamsStartAddr(MCAN_MsgRAMConfigParams *msgRAMConfigParams);
#define MCAN0_BASE MCANA_MSG_RAM_BASE

//#define MCAN_STD_ID_FILT_START_ADDR     (0x0U)
//#define MCAN_STD_ID_FILTER_NUM          (6U)
//#define MCAN_EXT_ID_FILT_START_ADDR     (0x0U)
//#define MCAN_EXT_ID_FILTER_NUM          (2U)
//#define MCAN_TX_BUFF_START_ADDR         (0x80U)
//#define MCAN_TX_BUFF_SIZE               (10U)
////#define MCAN_FIFO_1_START_ADDR          (0xc0U)
////#define MCAN_FIFO_1_NUM                 (10U)
//#define MCAN_TX_EVENT_START_ADDR        (0x100U)
//#define MCAN_TX_EVENT_SIZE              (10U)
#define MCAN_EXT_ID_AND_MASK            (0x1FFFFFF0U)
//#define MCAN_RX_BUFF_START_ADDR         (948U)
//#define MCAN_FIFO_0_START_ADDR          (548U)
//#define MCAN_FIFO_0_NUM                 (5U)
//#define MCAN_FIFO_1_START_ADDR          (748U)
//#define MCAN_FIFO_1_NUM                 (5U)
// Global Variables.
//uint8_t u8TxBuff[64]={1,2,3,4,5,6,7,8};
/*  brief    Macros to represent the MCAN STD, EXT and TX/RX Elememt Size*/
#define MCAN_MSG_RAM_STD_ELEM_SIZE          (1U)
/**< Standard ID Filter Element Size */
#define MCAN_MSG_RAM_EXT_ELEM_SIZE          (2U)
/**< Extended ID Filter Element Size */
#define MCAN_MSG_RAM_TX_RX_ELEM_SIZE        (18U)

//#define MCAN_STD_ID_FILT_START_ADDR     (0x0U)
//#define MCAN_STD_ID_FILTER_NUM          18U//(5U)           //RX�������
//#define MCAN_EXT_ID_FILT_START_ADDR     (MCAN_STD_ID_FILT_START_ADDR + ((MCAN_STD_ID_FILTER_NUM * 1U * 4U)))//(0x0U)
//#define MCAN_EXT_ID_FILTER_NUM          (2U)
//#define MCAN_FIFO_0_START_ADDR          (MCAN_EXT_ID_FILT_START_ADDR + ((MCAN_EXT_ID_FILTER_NUM * 2U * 4U)))//(548U)
#define MCAN_FIFO_0_NUM                 5//CANRxMailNO
//#define MCAN_FIFO_1_START_ADDR          (MCAN_FIFO_0_START_ADDR + (18U * 4U * MCAN_FIFO_0_NUM))//(748U)
#define MCAN_FIFO_1_NUM                 24//(0U)

//#define MCAN_TX_EVENT_START_ADDR        (MCAN_FIFO_1_START_ADDR + (18U * 4U * MCAN_TX_BUFF_SIZE))//(0x100U)
//#define MCAN_TX_EVENT_SIZE              (0U)
//#define MCAN_TX_BUFF_START_ADDR         (MCAN_TX_EVENT_START_ADDR + (18U * 4U * MCAN_TX_EVENT_SIZE))//(0x80U)
//#define MCAN_TX_BUFF_SIZE               (8U)                   //TX�������



const CAN_CFG CanRxCfg[CANRxMailNO]=
{//�����;����ID         ����
	{0,  RX_MSGID_1,                           0x1ffffff0},
//��׼֡��0 ��ʼ
	{1, CANDRV_C_RX_PHY_ADDR_STD_CANMSGID,     0x7ff},
	{2, CANDRV_C_RX_FUNC_ADDR_STD_CANMSGID,    0x7ff},
	{3, VCU_0x214,                0x7ff},
	{4, VCU_0x481,                0x7ff},
//	{5, BMS_0x3A4,               0x7ff},
	{5, ESP_0x185,               0x7ff},
	{6, TBOX_0x551,               0x7ff},
	{7, BMS_0x201,               0x7ff},
//	{9, BMS_0x202,               0x7ff},
	{8, PDCU_0x236,               0x7ff},
	{9, PDCU_0x634,               0x7ff},
	{10, VCU_0x64E,               0x7ff},
	{11, BMS_0x217,               0x7ff},
	{12, VCU_0x484,               0x7ff},
	{13, PDCU_0x511,               0x7ff},
	{14, VCU_0x631,               0x7ff},
	{15,  NM_RX_ID,              0x700},

};

const CAN_CFG_TX CanTxCfg[CANTxMailNO]=
{//�����,        ����ID,                             ����,        CANFD,           ��չ֡
    {0, TX_MSG_MEGMEET_ID,                     0x1ffffff0,     0,               1 },
    {1, CANDRV_C_TX_PHY_ADDR_STD_CANMSGID,     0x7ff,           1,               0 },
    {2, OBC_0x518,                       0x00,            1,               0 },
    {3, OBC_0x521,                       0x00,            1,               0 },
    {4, OBC_0x480,                     0x00,            1,               0 },
    {5, OBC_0x666,                     0x00,            1,               0 },
    {6, OBC_0x6D2,                     0x00,            1,               0 },
    {7, OBC_0x6D3,                     0x00,            1,               0 },
    {8, OBC_0x6D4,                     0x00,            1,               0 },
    {9, OBC_0x6D6,                     0x00,            1,               0 },
    {10, OBC_0x6D7,                    0x00,            1,               0 },
    {11, NM_TX_ID,                     0x00,            0,               0 },
};

uint32_t MCanGetDataLen(uint32_t dlc)
{
    uint32_t dataSize[16] = {0,  1,  2,  3,  4,  5,  6, 7, 8,
                                 12, 16, 20, 24, 32, 48, 64};
    if(dlc < 16)
    {
        return(dataSize[dlc]);
    }
    else
    {
        return 0;
    }

}
static void MCAN_calcMsgRamParamsStartAddr(MCAN_MsgRAMConfigParams
                                           *msgRAMConfigParams)
{
    int32_t status = 0;
    uint32_t startAddr = 0U;

	/* Compute the start Address and populate the Message RAM configuration
	 * parameters */


	/* 11-bit filter configuration */
	/* Assign only if configured */
	if (msgRAMConfigParams->lss != 0U)
	{
		msgRAMConfigParams->flssa = startAddr;
	}

	/* 29-bit filter configuration */
	startAddr += ((msgRAMConfigParams->lss) *
	        MCAN_MSG_RAM_STD_ELEM_SIZE * 4U);
	if (msgRAMConfigParams->lse != 0U)
	{
		msgRAMConfigParams->flesa = startAddr;
	}

	/* Tx buffer configuration */
	startAddr += ((msgRAMConfigParams->lse) *
	        MCAN_MSG_RAM_EXT_ELEM_SIZE * 4U);
	if ((msgRAMConfigParams->txBufNum  != 0U) ||
		(msgRAMConfigParams->txFIFOSize != 0U))
	{
		msgRAMConfigParams->txStartAddr = startAddr;
		msgRAMConfigParams->txBufElemSize = MCAN_ELEM_SIZE_64BYTES;
	}

	/* Tx Event FIFO configuration */
	startAddr += ((msgRAMConfigParams->txBufNum) *
				   MCAN_MSG_RAM_TX_RX_ELEM_SIZE * 4U);
	startAddr += ((msgRAMConfigParams->txFIFOSize) *
				   MCAN_MSG_RAM_TX_RX_ELEM_SIZE * 4U);
	if (msgRAMConfigParams->txEventFIFOSize != 0U)
	{
		msgRAMConfigParams->txEventFIFOStartAddr = startAddr;
	}

	/* Rx FIFO 0 configuration */
	startAddr += ((msgRAMConfigParams->txEventFIFOSize) *
	        MCAN_MSG_RAM_EXT_ELEM_SIZE * 4U);
	if (msgRAMConfigParams->rxFIFO0size != 0U)
	{
		msgRAMConfigParams->rxFIFO0startAddr = startAddr;
		msgRAMConfigParams->rxFIFO0ElemSize = MCAN_ELEM_SIZE_64BYTES;
	}

	/* Rx FIFO 1 configuration */
	startAddr += ((msgRAMConfigParams->rxFIFO0size) *
				   MCAN_MSG_RAM_TX_RX_ELEM_SIZE * 4U);
	if (msgRAMConfigParams->rxFIFO1size != 0U)
	{
		msgRAMConfigParams->rxFIFO1startAddr = startAddr;
		msgRAMConfigParams->rxFIFO1ElemSize = MCAN_ELEM_SIZE_64BYTES;
	}

	/* Rx Buffer configuration */
	startAddr += ((msgRAMConfigParams->rxFIFO1size) *
				   MCAN_MSG_RAM_TX_RX_ELEM_SIZE * 4U);
	msgRAMConfigParams->rxBufStartAddr = startAddr;
	msgRAMConfigParams->rxBufElemSize = MCAN_ELEM_SIZE_64BYTES;

}


//#define NUM_OF_MSG                      (12U)
//#define MCAN_STD_ID_FILTER_NUM          (0U)
//#define MCAN_EXT_ID_FILTER_NUM          (0U)
//#define MCAN_FIFO_0_NUM                 (0U)
//#define MCAN_FIFO_0_ELEM_SIZE           (MCAN_ELEM_SIZE_64BYTES)
//#define MCAN_FIFO_1_NUM                 (0U)
//#define MCAN_FIFO_1_ELEM_SIZE           (MCAN_ELEM_SIZE_64BYTES)
//#define MCAN_RX_BUFF_NUM                (0U)
//#define MCAN_RX_BUFF_ELEM_SIZE          (MCAN_ELEM_SIZE_64BYTES)
//#define MCAN_TX_BUFF_SIZE               (NUM_OF_MSG)
//#define MCAN_TX_FQ_SIZE                 (0U)
//#define MCAN_TX_BUFF_ELEM_SIZE          (MCAN_ELEM_SIZE_64BYTES)
//#define MCAN_TX_EVENT_SIZE              (0U)

//#define MCAN_STD_ID_FILT_START_ADDR     (0x0U)
//#define MCAN_EXT_ID_FILT_START_ADDR     (MCAN_STD_ID_FILT_START_ADDR + ((MCAN_STD_ID_FILTER_NUM * MCANSS_STD_ID_FILTER_SIZE_WORDS * 4U)))
//#define MCAN_FIFO_0_START_ADDR          (MCAN_EXT_ID_FILT_START_ADDR + ((MCAN_EXT_ID_FILTER_NUM * MCANSS_EXT_ID_FILTER_SIZE_WORDS * 4U)))
//#define MCAN_FIFO_1_START_ADDR          (MCAN_FIFO_0_START_ADDR + (MCAN_getMsgObjSize(MCAN_FIFO_0_ELEM_SIZE) * 4U * MCAN_FIFO_0_NUM))
//#define MCAN_RX_BUFF_START_ADDR         (MCAN_FIFO_1_START_ADDR + (MCAN_getMsgObjSize(MCAN_FIFO_1_ELEM_SIZE) * 4U * MCAN_FIFO_1_NUM))
//#define MCAN_TX_BUFF_START_ADDR         (MCAN_RX_BUFF_START_ADDR + (MCAN_getMsgObjSize(MCAN_RX_BUFF_ELEM_SIZE) * 4U * MCAN_RX_BUFF_NUM))
//#define MCAN_TX_EVENT_START_ADDR        (MCAN_TX_BUFF_START_ADDR + (MCAN_getMsgObjSize(MCAN_TX_BUFF_ELEM_SIZE) * 4U * (MCAN_TX_BUFF_SIZE + MCAN_TX_FQ_SIZE)))

/*******************************************************************************
** ��������: MCAN_CfgInit
** ��������:��ʼ��can fd
** �䡡 ��: ��
** �䡡 ��: ��
** ����޸�: LINJUNSHENG	  2022��09��19��
*******************************************************************************/
void MCAN_CfgInit(void)
{
    uint8_t i=0;
    MCAN_InitParams initParams;
    MCAN_MsgRAMConfigParams    msgRAMConfigParams;
    MCAN_BitTimingParams       bitTimes;
    MCAN_StdMsgIDFilterElement stdFiltelem;
    MCAN_ConfigParams configParams;
    MCAN_ExtMsgIDFilterElement extFiltelem;
    //
    //  Initializing all structs to zero to prevent stray values
    //
    memset(&initParams, 0, sizeof(initParams));
    memset(&msgRAMConfigParams, 0, sizeof(msgRAMConfigParams));
    memset(&bitTimes, 0, sizeof(bitTimes));

    GPIO_setPinConfig(DEVICE_GPIO_CFG_MCANRXA);
    GPIO_setPinConfig(DEVICE_GPIO_CFG_MCANTXA);

    SysCtl_setMCANClk(SYSCTL_MCANA, SYSCTL_MCANCLK_DIV_4);

    initParams.fdMode            = 0x1U; // FD operation enabled.
    initParams.brsEnable         = 0x1U; // Bit rate switching for
                                         // transmissions enabled.
    initParams.txpEnable         = 0x0U; // Transmit pause disabled.
    initParams.efbi              = 0x0U; // Edge filtering disabled.
    initParams.pxhddisable       = 0x0U; // Protocol exception handling enabled
    initParams.darEnable         = 0x0U; // Enable Automatic retransmission of
                                       // messages not transmitted successfully
    initParams.wkupReqEnable     = 0x1U; // Wakeup request is enabled.
    initParams.autoWkupEnable    = 0x1U; // Auto-Wakeup is enabled.
    initParams.emulationEnable   = 0x1U; // Emulation/Debug Suspend is enabled.
    initParams.tdcEnable         = 0x1U; // Transmitter Delay Compensation is
                                         // enabled.
    initParams.wdcPreload        = 0xFFU; // Start value of the Message RAM
                                          // Watchdog Counter preload.

    //
    // Transmitter Delay Compensation parameters.
    //
    initParams.tdcConfig.tdcf    = 0xAU;
    initParams.tdcConfig.tdco    = 0x6U;

    //
    // Initialize MCAN Config parameters.
    //
    configParams.monEnable         = 0x0U; // Bus Monitoring Mode is disabled
    configParams.asmEnable         = 0x0U;  // Normal CAN operation.
    configParams.tsPrescalar       = 0xFU;  // Prescaler Value.
    configParams.tsSelect          = 0x2U;  // External Timestamp counter value used.
    configParams.timeoutSelect     = MCAN_TIMEOUT_SELECT_CONT;
    // Time-out counter source select.
    configParams.timeoutPreload    = 0xFFFFU; // Start value of the Timeout
                                              // Counter.
    configParams.timeoutCntEnable  = 0x0U; // Time-out Counter is disabled.
    configParams.filterConfig.anfe = 0x1U; // Accept in Rx FIFO 1.
    configParams.filterConfig.anfs = 0x1U; // Accept in Rx FIFO 1.

    configParams.filterConfig.rrfe = 0x1U; // Filter remote frames with
                                           // 29-bit extended IDs.
    configParams.filterConfig.rrfs = 0x1U; // Filter all remote frames with
                                           // 11-bit standard IDs.

//    // Tx Buffer Element Size.
    msgRAMConfigParams.lss                  = MCAN_STD_ID_FILTER_NUM;

    msgRAMConfigParams.lse                  = MCAN_EXT_ID_FILTER_NUM;

    msgRAMConfigParams.txBufNum             =0;// MCAN_TX_BUFF_SIZE;
    // Number of Dedicated Transmit Buffers
    msgRAMConfigParams.txFIFOSize           = MCAN_TX_BUFF_SIZE;//
    msgRAMConfigParams.txBufMode            = 0U; //Tx FIFO operation
    // Tx Event FIFO Start Address.
    msgRAMConfigParams.txEventFIFOSize      = 0;//MCAN_TX_BUFF_SIZE;
    // Event FIFO Size.
    msgRAMConfigParams.txEventFIFOWaterMark = 3U;
    // Rx FIFO0 Start Address.
    msgRAMConfigParams.rxFIFO0size          = MCAN_FIFO_0_NUM;
    // Number of Rx FIFO elements.
    msgRAMConfigParams.rxFIFO0waterMark     = 3U; // Rx FIFO0 Watermark.
    msgRAMConfigParams.rxFIFO0OpMode        = 0U; // FIFO blocking mode.
    // Rx FIFO1 Start Address.
    msgRAMConfigParams.rxFIFO1size          = MCAN_FIFO_1_NUM;
    // Number of Rx FIFO elements.
    msgRAMConfigParams.rxFIFO1waterMark     = 3U; // Level for Rx FIFO 1
                                                  // watermark interrupt.
    msgRAMConfigParams.rxFIFO1OpMode        = 0U; // FIFO blocking mode.
    MCAN_calcMsgRamParamsStartAddr(&msgRAMConfigParams);
    //
    // Initialize bit timings.
    //
    bitTimes.nomRatePrescalar   = 0xBU; // Nominal Baud Rate Pre-scaler
    bitTimes.nomTimeSeg1        = 0x2U; // Nominal Time segment before SP
    bitTimes.nomTimeSeg2        = 0x0U; // Nominal Time segment after SP
    bitTimes.nomSynchJumpWidth  = 0x0U; // Nominal SJW
    bitTimes.dataRatePrescalar  = 0x1U; // Data Baud Rate Pre-scaler
    bitTimes.dataTimeSeg1       = 0xAU; // Data Time segment before SP
    bitTimes.dataTimeSeg2       = 0x2U; // Data Time segment after SP
    bitTimes.dataSynchJumpWidth = 0x2U; // Data SJW
    //
    // Wait for memory initialization to happen.
    //
    while(FALSE == MCAN_isMemInitDone(MCANA_DRIVER_BASE))
    {
    }

    //
    // Put MCAN in SW initialization mode.
    //
    MCAN_setOpMode(MCANA_DRIVER_BASE, MCAN_OPERATION_MODE_SW_INIT);

    //
    // Wait till MCAN is not initialized.
    //
    while (MCAN_OPERATION_MODE_SW_INIT != MCAN_getOpMode(MCANA_DRIVER_BASE))
    {}

    //
    // Initialize MCAN module.
    //
    MCAN_init(MCANA_DRIVER_BASE, &initParams);

    //
    // Configure Bit timings.
    //
    MCAN_setBitTime(MCANA_DRIVER_BASE, &bitTimes);

    //
    // Configure Message RAM Sections
    //
    MCAN_msgRAMConfig(MCANA_DRIVER_BASE, &msgRAMConfigParams);
    for(i=0;i<CANRxMailNO;i++)
    {
        if(CanRxCfg[i].MsgId>0x7ff)//��չ֡
        {
            extFiltelem.efid1 = CanRxCfg[i].MsgId; // Standard Filter ID 1.
            if(CanRxCfg[i].MsgIdMask)//����
            {
                extFiltelem.efid2 = CanRxCfg[i].MsgIdMask;  // Standard Filter ID 2.
                extFiltelem.efec  = 0x6U;  // Set priority and store in FIFO 0 if filter matches
                extFiltelem.eft   = 0x2U;  // Classic filter: SFID1 = filter, SFID2 = mask
            }
            else
            {
                extFiltelem.efid2 = 0;
                extFiltelem.efec  = 0x7U;  //Store into Rx Buffer or as debug message, configuration of SFT[1:0] ignored.
                extFiltelem.eft   = 0x0U;  // Range filter from SFID1 to SFID2
            }
            MCAN_addExtMsgIDFilter(MCAN0_BASE, CanRxCfg[i].MailBox, &extFiltelem);
        }
        else if(CanRxCfg[i].MsgId)//��׼֡
        {
            stdFiltelem.sfid1 = CanRxCfg[i].MsgId; // Standard Filter ID 1.
            if(CanRxCfg[i].MsgIdMask)//����
            {
                stdFiltelem.sfid2 = CanRxCfg[i].MsgIdMask;  // Standard Filter ID 2.
                stdFiltelem.sfec  = 0x6U;  // Set priority and store in FIFO 0 if filter matches
                stdFiltelem.sft   = 0x2U;  // Range filter from SFID1 to SFID2
            }
            else
            {
                stdFiltelem.sfid2 = 0;
                stdFiltelem.sfec  = 0x7U;  // Set priority and store in FIFO 0 if filter matches
                stdFiltelem.sft   = 0x0U;  // Range filter from SFID1 to SFID2
            }
            MCAN_addStdMsgIDFilter(MCAN0_BASE, CanRxCfg[i].MailBox, &stdFiltelem);
        }
    }
    //
    // Take MCAN out of the SW initialization mode
    //
    MCAN_setOpMode(MCANA_DRIVER_BASE, MCAN_OPERATION_MODE_NORMAL);

    while (MCAN_OPERATION_MODE_NORMAL != MCAN_getOpMode(MCANA_DRIVER_BASE))
    {

    }
}


/*******************************************************************************
** ��������: MCAN_vTransmit
** ��������:����CAN����
** �䡡 ��: ���ݻ���
** �䡡 ��:ture �ɹ�
** ����޸�: LINJUNSHENG	  2022��09��19��
*******************************************************************************/
uint16_t MCAN_vTransmit(const uint8_t* txdata,uint32_t u32Id,uint8_t u8Len)
{

    MCAN_TxBufElement    txMsg;
    uint16_t i = 0U;
    uint16_t txMsg_xtd = 0;
    uint16_t txMsg_fdf = 0;
    uint16_t MailBox = 0;
    for(i = 0;i<CANTxMailNO;i++)
    {
        if(CanTxCfg[i].MsgId == u32Id)
        {
            txMsg_xtd = CanTxCfg[i].txMsg_xtd;//
            txMsg_fdf = CanTxCfg[i].txMsg_fdf;
            MailBox = CanTxCfg[i].MailBox;
            break;
        }
    }

    if(txMsg_xtd == 1)//��չ֡
	{
		txMsg.id       = (uint32_t)(u32Id)&0x1fffffff; // Identifier Value.
    	txMsg.xtd      = 1U; // 29-bit standard identifier.
	}
	else//��׼֡
	{
		txMsg.id       = ((uint32_t)(u32Id)) << 18U; // Identifier Value.
    	txMsg.xtd      = 0U; // 11-bit standard identifier.
	}
    

    if(txMsg_fdf == 1)//can or can_fd�ж�
    {
        txMsg.fdf      = 1U; // Frame transmitted in CAN FD
        txMsg.brs      = 1U; // CAN FD frames transmitted with bit rate
                      // switching.
    }
    else
    {
        txMsg.fdf      = 0U; // Frame transmitted in CAN
        txMsg.brs      = 0U; // CAN FD frames transmitted with bit rate
    }


    txMsg.rtr      = 0U; // Transmit data frame.
    
    txMsg.esi      = 0U; // ESI bit in CAN FD format depends only on error
                  // passive flag.

    if(u8Len <= 8)  //���ͳ����ж�LYS
    {
        txMsg.dlc      = u8Len;
    }
    else
    {
        switch(u8Len)
        {
            case 12:
                            txMsg.dlc = 9;
                            break;
            case 16:
                            txMsg.dlc = 10;
                            break;
            case 20:
                            txMsg.dlc = 11;
                            break;
            case 24:
                            txMsg.dlc = 12;
                            break;
            case 32:
                            txMsg.dlc = 13;
                            break;
            case 48:
                            txMsg.dlc = 14;
                            break;
            case 64:
                            txMsg.dlc = 15;
                            break;
            default:
                break;
        }
    }




    txMsg.efc      = 1U; // Store Tx events.
    txMsg.mm       = 0xAAU; // Message Marker.

    //
    // Data bytes.
    //

    for(i = 0; i < u8Len; i++)
    {
         txMsg.data[i]  = txdata[i] & 0xFF;
    }

        MCAN_TxFIFOStatus TxFS;
      MCAN_getTxFIFOQueStatus(MCAN0_BASE, &TxFS);
      if(TxFS.fifoFull==0)
      {
          MCAN_writeMsgRam(MCAN0_BASE, MCAN_MEM_TYPE_FIFO, TxFS.putIdx, &txMsg);//
          MCAN_txBufAddReq(MCAN0_BASE, TxFS.putIdx);
          return 1;
      }
      else
      {
          return 0;
      }

}
uint32_t  Drv_CanGetErrorStatus(void)
{
    MCAN_ProtocolStatus CanStatus;
    MCAN_getProtocolStatus(MCAN0_BASE, &CanStatus);
    return CanStatus.busOffStatus;
}

void MCAN_GetErrorCnt(uint8_t *pRCR,uint8_t *pTCR)
{
    MCAN_ErrCntStatus ErrCounter;
    MCAN_getErrCounters(MCAN0_BASE, &ErrCounter);
    *pRCR = ErrCounter.recErrCnt;
    *pTCR = ErrCounter.transErrLogCnt;
}
/*******************************************************************************
** ��������: CAN_FrameSend
** ��������:����CAN����
** �䡡 ��: TxMsg ���ݻ���
** �䡡 ��:ture �ɹ�
** ����޸�: LINJUNSHENG	  2022��09��19��
*******************************************************************************/
uint8_t CAN_FrameSend(CANFRAME TxMsg)
{
    MCAN_vTransmit(TxMsg.Data,TxMsg.CanId.all,TxMsg.u8Len);
    return 1;
}
/*******************************************************************************
** ��������: CAN_ConfirmTx
** ��������:����CANȷ��
** �䡡 ��: ���ݻ���
** �䡡 ��:ture �ɹ�
** ����޸�: LINJUNSHENG	  2022��09��19��
*******************************************************************************/
uint16_t CAN_ConfirmTx(uint32 ubObjNr)
{
    int16 RET = FALSE;
    uint32 NbTransmitStatus;
    uint32 Nb;

    Nb = MCAN_getTxBufTransmissionStatus(MCAN0_BASE);

    NbTransmitStatus = (Nb >> ubObjNr)&0x01UL;

//    if(( 1U == NbTransmitStatus) &&  (1U == ((MailBoxSendRequestSts >> ubObjNr)&0x01UL )))
    {
//        MailBoxSendRequestSts = 0U;
        RET =  TRUE;
    }

    return RET;
}

/*******************************************************************************
** ��������: Drv_CANReceiveQuery
** ��������:����CAN����
** �䡡 ��: ��
** �䡡 ��:��
** ����޸�: LINJUNSHENG	  2022��09��19��
*******************************************************************************/
void Drv_CANReceiveQuery(void)
{
    uint32 rxMsgID;
    uint8_t i=0;
    uint16 MailIndex;
    MCAN_RxNewDataStatus newData;
    MCAN_RxBufElement    rxMsg;
    //rxMsg1msTickCntr++;
    CANFRAME CanRxBuff;
    uint16_t u16RxLen=0;
    MCAN_RxFIFOStatus RxFS;

//    MCAN_getNewDataStatus(MCAN0_BASE, &newData);
//
//    for(MailIndex = 0U; MailIndex < CANRxMailNO ;MailIndex++ )
//    {
//        if( 0UL != (( newData.statusLow >> MailIndex ) & 0x01UL))
//        {
//            MCAN_readMsgRam(MCAN0_BASE, MCAN_MEM_TYPE_BUF, MailIndex,0, &rxMsg);
//            if(rxMsg.xtd==0)
//            {
//                rxMsgID = (rxMsg.id & 0x1FFFFFFFUL) >> 18;
//            }
//            else
//            {
//                rxMsgID = rxMsg.id & 0x1FFFFFFFUL;
//            }
//            CanRxBuff.CanId.all = rxMsgID;
//            u16RxLen = MCanGetDataLen(rxMsg.dlc);
//            memcpy(CanRxBuff.Data,rxMsg.data,u16RxLen);
//            CanRxBuff.u8Len = u16RxLen;
//            sCanRxPutQue(CanRxBuff);
//        }
//    }
//    MCAN_clearNewDataStatus(MCAN0_BASE,&newData);
    
//���������FIFO0Ҫ��Ӧ�Ķ�ȡMCAN_RX_FIFO_NUM_0
//    RxFS.num =MCAN_RX_FIFO_NUM_0;
//    MCAN_getRxFIFOStatus(MCAN0_BASE, &RxFS);
//    if(RxFS.fillLvl)
//    {
//		MCAN_readMsgRam(MCAN0_BASE, MCAN_MEM_TYPE_FIFO, RxFS.getIdx,RxFS.num, &rxMsg);
//		MCAN_writeRxFIFOAck(MCAN0_BASE, RxFS.num,RxFS.getIdx);//��һ��
//		MCAN_getRxFIFOStatus(MCAN0_BASE, &RxFS);
//        if(rxMsg.xtd==0)
//        {
//            rxMsgID = (rxMsg.id & 0x1FFFFFFFUL) >> 18;
//        }
//        else
//        {
//            rxMsgID = rxMsg.id & 0x1FFFFFFFUL;
//        }
//        CanRxBuff.CanId.all = rxMsgID;
//        u16RxLen = MCanGetDataLen(rxMsg.dlc);
//        memcpy(CanRxBuff.Data,rxMsg.data,u16RxLen);
//        CanRxBuff.u8Len = u16RxLen;
//        sCanRxPutQue(CanRxBuff);
//
//    }

    //���������FIF1Ҫ��Ӧ�Ķ�ȡMCAN_RX_FIFO_NUM_1
    RxFS.num =MCAN_RX_FIFO_NUM_1;
    MCAN_getRxFIFOStatus(MCAN0_BASE, &RxFS);
    while(RxFS.fillLvl)
    {
        MCAN_readMsgRam(MCAN0_BASE, MCAN_MEM_TYPE_FIFO, RxFS.getIdx,RxFS.num, &rxMsg);
        RxFS.num =MCAN_RX_FIFO_NUM_1;
        MCAN_writeRxFIFOAck(MCAN0_BASE, RxFS.num,RxFS.getIdx);//��һ��
        MCAN_getRxFIFOStatus(MCAN0_BASE, &RxFS);
        if(rxMsg.xtd==0)
        {
            rxMsgID = (rxMsg.id & 0x1FFFFFFFUL) >> 18;
        }
        else
        {
            rxMsgID = rxMsg.id & 0x1FFFFFFFUL;
        }
        CanRxBuff.CanId.all = rxMsgID;
        u16RxLen = MCanGetDataLen(rxMsg.dlc);
        memcpy(CanRxBuff.Data,rxMsg.data,u16RxLen);
        CanRxBuff.u8Len = u16RxLen;
        sCanRxPutQue(CanRxBuff);
        if (s_u16CanRxLength >= CAN_RXBUF_SIZE)
        {
            break;
        }
    }
}

void SetCanNormal(void)
{
    MCAN_setOpMode(MCAN0_BASE, MCAN_OPERATION_MODE_NORMAL);
    while (MCAN_OPERATION_MODE_NORMAL != MCAN_getOpMode(MCAN0_BASE));
}

  • Hi Terry,

    What is the System clock, and MCAN baudrate in your settings?

    SysCtl_setMCANClk(SYSCTL_MCANA, SYSCTL_MCANCLK_DIV_4);

    bitTimes.nomRatePrescalar = 0xBU;
    bitTimes.nomTimeSeg1 = 0x2U; 
    bitTimes.nomTimeSeg2 = 0x0U; 
    bitTimes.nomSynchJumpWidth = 0x0U; 


    bitTimes.dataRatePrescalar = 0x1U; 
    bitTimes.dataTimeSeg1 = 0xAU; 
    bitTimes.dataTimeSeg2 = 0x2U; 
    bitTimes.dataSynchJumpWidth = 0x2U; 

    The F28P55x SDK has MCAN example for TX and RX, why do you use F280039 MCAN example?

    It's not a good idea to set TimeSeg2=0.

  • Hi QJ

    This is not F280039 example, the code is from customer firmware which has already MP on F280039, now they just port the same code to F28P55.

    The issue has solved by change the cmd file, in beginning customer keep F280039 memory cmd in project so that MCAN run issue in F28P55, after replace to F28P55 memory cmd then the MCAN run well.

    However I cannot understand why the flash/ram placement will affect the MCAN running? F28P55 should be larger memory space than F280039, so why can not use F280039 memory cmd directly in F28P55 device?

  • Do you know what changes are made in cmd file?

  • Hi Terry,

    I checked the cmd files for F280039 and F28P55x.  Some memory sections in F280039 CMD file has smaller size which might be big enough for P55x MCAN driver.