Missing of CAN frames during receving CAN frames in interrupt mode.

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

Missing of CAN frames during receving CAN frames in interrupt mode.

714 次查看
Pavankumar1
Contributor III

I am using the MIMXRT1041 controller to receive CAN messages. I have configured the CAN module with a 250Kbps bit rate and a single message buffer to receive messages with a specific message ID. While I am able to receive the CAN messages, I am encountering an issue where, when sending 100 frames from the PCAN view application with a 100ms delay between each frame, I only receive 90 frames.

Here is my configuration code for reference:

 

#include "fsl_debug_console.h"

#include "fsl_flexcan.h"

#include "pin_mux.h"

#include "clock_config.h"

#include "board.h"

 

/*******************************************************************************

* Definitions

******************************************************************************/

#define EXAMPLE_CAN CAN3

#define EXAMPLE_FLEXCAN_IRQn CAN3_IRQn

#define EXAMPLE_FLEXCAN_IRQHandler CAN3_IRQHandler

#define RX_MESSAGE_BUFFER_NUM (9)

#define TX_MESSAGE_BUFFER_NUM (8)

 

/* Select OSC24Mhz as master flexcan clock source */

#define FLEXCAN_CLOCK_SOURCE_SELECT (1U)

/* Clock divider for master flexcan clock source */

#define FLEXCAN_CLOCK_SOURCE_DIVIDER (1U)

/* Get frequency of flexcan clock */

#define EXAMPLE_CAN_CLK_FREQ ((CLOCK_GetRootClockFreq(kCLOCK_Root_Can3) / 100000U) * 100000U)

/* Set USE_IMPROVED_TIMING_CONFIG macro to use api to calculates the improved CAN / CAN FD timing values. */

#define USE_IMPROVED_TIMING_CONFIG (1U)

/* Fix MISRA_C-2012 Rule 17.7. */

#define LOG_INFO (void)PRINTF

 

#if (defined(USE_CANFD) && USE_CANFD)

/*

* DWORD_IN_MB DLC BYTES_IN_MB Maximum MBs

* 2 8 kFLEXCAN_8BperMB 64

* 4 10 kFLEXCAN_16BperMB 42

* 8 13 kFLEXCAN_32BperMB 25

* 16 15 kFLEXCAN_64BperMB 14

*

* Dword in each message buffer, Length of data in bytes, Payload size must align,

* and the Message Buffers are limited corresponding to each payload configuration:

*/

#define DWORD_IN_MB (16)

#define DLC (15)

#define BYTES_IN_MB kFLEXCAN_64BperMB

#else

#define DLC (8)

#endif

/*******************************************************************************

* Prototypes

******************************************************************************/

 

/*******************************************************************************

* Variables

******************************************************************************/

volatile bool rxComplete = false;

#if (defined(USE_CANFD) && USE_CANFD)

flexcan_fd_frame_t txFrame, rxFrame;

#else

flexcan_frame_t txFrame, rxFrame;

#endif

 

/*******************************************************************************

* Code

******************************************************************************/

uint32_t counter;

void EXAMPLE_FLEXCAN_IRQHandler(void)

{

/* If new data arrived. */

 

counter++;

if (0U != FLEXCAN_GetMbStatusFlags(EXAMPLE_CAN, (uint64_t)1U << RX_MESSAGE_BUFFER_NUM))

{

FLEXCAN_ClearMbStatusFlags(EXAMPLE_CAN, (uint64_t)1U << RX_MESSAGE_BUFFER_NUM);

rxComplete = true;

}

 

if (rxComplete)

{

(void)FLEXCAN_ReadRxMb(EXAMPLE_CAN, RX_MESSAGE_BUFFER_NUM, &rxFrame);

}

SDK_ISR_EXIT_BARRIER;

}

 

/*!

* @brief Main function

*/

int main(void)

{

flexcan_config_t flexcanConfig;

flexcan_rx_mb_config_t mbConfig;

 

/* Initialize board hardware. */

BOARD_ConfigMPU();

BOARD_InitPins();

BOARD_BootClockRUN();

BOARD_InitDebugConsole();

 

/*Clock setting for FLEXCAN*/

clock_root_config_t rootCfg = {0};

rootCfg.mux = FLEXCAN_CLOCK_SOURCE_SELECT;

rootCfg.div = FLEXCAN_CLOCK_SOURCE_DIVIDER;

CLOCK_SetRootClock(kCLOCK_Root_Can3, &rootCfg);

 

LOG_INFO("\r\n==FlexCAN loopback functional example -- Start.==\r\n\r\n");

 

/* Init FlexCAN module. */

/*

* flexcanConfig.clksrc=kFLEXCAN_ClkSrc0;

* flexcanConfig.bitRate = 1000000U;

* flexcanConfig.bitRateFD = 2000000U;

* flexcanConfig.maxMbNum = 16;

* flexcanConfig.enableLoopBack = false;

* flexcanConfig.enableSelfWakeup = false;

* flexcanConfig.enableIndividMask = false;

* flexcanConfig.disableSelfReception = false;

* flexcanConfig.enableListenOnlyMode = false;

* flexcanConfig.enableDoze = false;

*/

FLEXCAN_GetDefaultConfig(&flexcanConfig);

 

flexcanConfig.bitRate = 250000U;

flexcanConfig.enableLoopBack = false;

 

flexcan_timing_config_t timing_config;

memset(&timing_config, 0, sizeof(flexcan_timing_config_t));

 

if (FLEXCAN_CalculateImprovedTimingValues(EXAMPLE_CAN, flexcanConfig.bitRate, EXAMPLE_CAN_CLK_FREQ, &timing_config))

{

/* Update the improved timing configuration*/

memcpy(&(flexcanConfig.timingConfig), &timing_config, sizeof(flexcan_timing_config_t));

}

else

{

LOG_INFO("No found Improved Timing Configuration. Just used default configuration\r\n\r\n");

}

 

 

FLEXCAN_Init(EXAMPLE_CAN, &flexcanConfig, EXAMPLE_CAN_CLK_FREQ);

 

/* Setup Rx Message Buffer. */

mbConfig.format = kFLEXCAN_FrameFormatStandard;

mbConfig.type = kFLEXCAN_FrameTypeData;

mbConfig.id = FLEXCAN_ID_STD(0x123);

 

FLEXCAN_SetRxMbConfig(EXAMPLE_CAN, RX_MESSAGE_BUFFER_NUM, &mbConfig, true);

 

/* Setup Tx Message Buffer. */

 

FLEXCAN_SetTxMbConfig(EXAMPLE_CAN, TX_MESSAGE_BUFFER_NUM, true);

 

 

/* Enable Rx Message Buffer interrupt. */

 

FLEXCAN_EnableMbInterrupts(EXAMPLE_CAN, (uint64_t)1U << RX_MESSAGE_BUFFER_NUM);

 

 

(void)EnableIRQ(EXAMPLE_FLEXCAN_IRQn);

__NVIC_SetPriority(CAN3_IRQn, 1);

while (true)

{

}

}

What could be the possible reasons for missing CAN frames,

and how can I resolve this issue to ensure all frames are received?

Thank you.

 

0 项奖励
回复
1 回复

681 次查看
mayliu1
NXP Employee
NXP Employee

Hi @Pavankumar1

Thank you for your interest in the NXP MIMXRT product, I would  like to provide service for you.

Please check the following item:

1:  Message Format: Verify that the CAN message format (standard or extended ID).

2: Termination Resistors: It is typically 120Ω.

3: Error Handling:  the error handling mechanisms implemented in the project.   

Wish it helps you.
If you still have question about it, please kindly let me know.

 

Best Regards

mayliu

0 项奖励
回复