Communicate two LPC54618 cards

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Communicate two LPC54618 cards

1,042 Views
canbazonur
Contributor II

Hello,

I have written a code set in below to communicate two LPC54618 CAN-FD cards. After the running code, the messages are sending and receiving correctly for both cards. However, after a few minutes, the communication stops (I don't know why). Is there anybody help me to solve this issue kindly? Thanks.

#include "board.h"
#include "fsl_debug_console.h"
#include "fsl_gpio.h"
#include "can.h"

#include "pin_mux.h"
#include <stdbool.h>
/*******************************************************************************
* Definitions
******************************************************************************/

#define APP_BOARD_TEST_GPIO_PORT1 BOARD_LED3_GPIO_PORT
#define APP_BOARD_TEST_GPIO_PORT2 BOARD_LED1_GPIO_PORT
#define APP_BOARD_TEST_GPIO_PORT3 BOARD_LED2_GPIO_PORT
#define APP_BOARD_TEST_LED1_PIN BOARD_LED3_GPIO_PIN
#define APP_BOARD_TEST_LED2_PIN BOARD_LED1_GPIO_PIN
#define APP_BOARD_TEST_LED3_PIN BOARD_LED2_GPIO_PIN

/*******************************************************************************
* Prototypes
******************************************************************************/

/*******************************************************************************
* Variables
******************************************************************************/

#define TICKRATE_HZ (1000) /* 1000 ticks per second */
#define TRANSMIT_PERIOD (100) /* milliseconds between transmission */

static volatile uint32_t gTimCnt = 0; /* incremented every millisecond */

/*******************************************************************************
* Code
******************************************************************************/

/*!
* @brief Keeps track of time
*/
void SysTick_Handler(void)
{
// count milliseconds
gTimCnt++;
}

/*!
* @brief Main function
*/
int main(void)
{
can_config_t config;
can_frame_t txmsg = { 0 };
can_frame_t rxmsg = { 0 };
int b;
bool message_transmitted = false;
uint32_t next_id = 0x100;

/* Define the init structure for the output LED pin*/
gpio_pin_config_t led_config = {
kGPIO_DigitalOutput, 0,
};

/* Board pin, clock, debug console init */
/* attach 12 MHz clock to FLEXCOMM0 (debug console) */
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
CLOCK_EnableClock(kCLOCK_Gpio0);
CLOCK_EnableClock(kCLOCK_Gpio1);
CLOCK_EnableClock(kCLOCK_Gpio2);
CLOCK_EnableClock(kCLOCK_Gpio3);

BOARD_InitPins();
BOARD_BootClockFROHF48M();
BOARD_InitDebugConsole();

/* configure for 4Mbps data 1Mbps nominal, CAN-FD */
CAN_GetDefaultConfig(&config);
config.baseAddress = 0x20010000;
config.nominalBaudRate = 1000000;
config.dataBaudRate = 4000000;
config.timestampClock_Hz = 100000;
CAN_Init(CAN0, &config, SystemCoreClock);
CAN_Init(CAN1, &config, SystemCoreClock);

/* receive 0x100 in CAN1 rx message buffer 0 by setting mask 0 */
CAN_SetRxIndividualMask(CAN1, 0, CAN_RX_MB_STD(0x100, 0));

/* receive 0x00000200 (29-bit id) in CAN1 rx message buffer 1 by setting mask 1 */
CAN_SetRxExtIndividualMask(CAN1, 1, CAN_RX_MB_EXT_LOW(0x200, 1), CAN_RX_MB_EXT_HIGH(0x200, 1));

/* receive 0x00000300 (29-bit id) in CAN1 rx message buffer 2 by setting mask 2 */
CAN_SetRxExtIndividualMask(CAN1, 2, CAN_RX_MB_EXT_LOW(0x300, 2), CAN_RX_MB_EXT_HIGH(0x300, 2));

/* enable CAN 0 */
CAN_Enable(CAN0, true);
/* enable CAN 1 */
CAN_Enable(CAN1, true);

/* Enable SysTick Timer */
SysTick_Config(SystemCoreClock / TICKRATE_HZ);

/* Init output LED GPIO. */
GPIO_PinInit(GPIO, BOARD_LED1_GPIO_PORT, BOARD_LED1_GPIO_PIN, &led_config);
GPIO_WritePinOutput(GPIO, BOARD_LED1_GPIO_PORT, BOARD_LED1_GPIO_PIN, 1);
GPIO_PinInit(GPIO, BOARD_LED2_GPIO_PORT, BOARD_LED2_GPIO_PIN, &led_config);
GPIO_WritePinOutput(GPIO, BOARD_LED2_GPIO_PORT, BOARD_LED2_GPIO_PIN, 1);
GPIO_PinInit(GPIO, BOARD_LED3_GPIO_PORT, BOARD_LED3_GPIO_PIN, &led_config);
GPIO_WritePinOutput(GPIO, BOARD_LED3_GPIO_PORT, BOARD_LED3_GPIO_PIN, 1);

while (true)
{
/* time to send messages from CAN1 */
if ((gTimCnt % TRANSMIT_PERIOD == 0) && !message_transmitted)
{
txmsg.id = next_id;
txmsg.format = kCAN_FrameFormatStandard;
txmsg.type = kCAN_FrameTypeData;
txmsg.proto = kCAN_ProtoTypeFD;
txmsg.bitratemode = kCAN_BitrateModeTypeSwitch;
txmsg.length = 64;
for (b = 0; b < txmsg.length; b++) txmsg.dataByte[b] = b;
/* use message buffer 3 */
if (CAN_TransferSendBlocking(CAN1, 3, &txmsg) != kStatus_Success)
{
PRINTF("Failed to transmit message\r\n");
}
else
{
message_transmitted = true;
}

/* send 0x200 (29-bit) on tx message buffer 4 */
txmsg.id = 0x200;
txmsg.format = kCAN_FrameFormatExtend;
txmsg.type = kCAN_FrameTypeData;
txmsg.proto = kCAN_ProtoTypeFD;
txmsg.bitratemode = kCAN_BitrateModeTypeSwitch;
txmsg.length = 64;
for (b = 0; b < txmsg.length; b++) txmsg.dataByte[b] = b;
/* use message buffer 4 */
if (CAN_TransferSendBlocking(CAN1, 4, &txmsg) != kStatus_Success)
{
PRINTF("Failed to transmit message 0x200 (29-bit)\r\n");
}
else
{
message_transmitted = true;
}

/* send 0x300 (29-bit) on tx message buffer 5 */
txmsg.id = 0x300;
txmsg.format = kCAN_FrameFormatExtend;
txmsg.type = kCAN_FrameTypeData;
txmsg.proto = kCAN_ProtoTypeFD;
txmsg.bitratemode = kCAN_BitrateModeTypeSwitch;
txmsg.length = 64;
for (b = 0; b < txmsg.length; b++) txmsg.dataByte[b] = b;
/* use message buffer 5 */
if (CAN_TransferSendBlocking(CAN1, 5, &txmsg) != kStatus_Success)
{
PRINTF("Failed to transmit message 0x300 (29-bit)\r\n");
}
else
{
message_transmitted = true;
}
}
else if (gTimCnt % TRANSMIT_PERIOD != 0)
{
message_transmitted = false;
}

/* check for any received messages on CAN1 message buffer 0 */
if (CAN_ReadRxMb(CAN1, 0, &rxmsg) == kStatus_Success)
{
/* toggle LED1 */
GPIO_TogglePinsOutput(GPIO, BOARD_LED1_GPIO_PORT, 1u << BOARD_LED1_GPIO_PIN);
}

/* check for any received messages on CAN1 message buffer 1 */
if (CAN_ReadRxMb(CAN1, 1, &rxmsg) == kStatus_Success)
{
/* toggle LED2 */
GPIO_TogglePinsOutput(GPIO, BOARD_LED2_GPIO_PORT, 1u << BOARD_LED2_GPIO_PIN);
}
if (CAN_ReadRxMb(CAN1, 2, &rxmsg) == kStatus_Success)
{
/* toggle LED3 */
GPIO_TogglePinsOutput(GPIO, BOARD_LED3_GPIO_PORT, 1u << BOARD_LED3_GPIO_PIN);
}
}
}

Labels (1)
Tags (1)
0 Kudos
Reply
2 Replies

747 Views
canbazonur
Contributor II

Is there anybody to solve the issue ?

Many thanks.

0 Kudos
Reply

747 Views
carstengroen
Senior Contributor II

What have you done to debug this ?? What happens when "the communication stops" ??

(and, have you remembered termination resistors etc ?)

0 Kudos
Reply