Hi mat ric,
Thanks for your reply.
I've not encountered the phenomenon you describe, actually, your code works well with LPC11C24 board.
Note; I modify a bit segment of code, however, it doesn't affect the main function of the code.
You can review the modified code and testing result at below.
#include "board.h"
#define CANRXOK (*((volatile unsigned long *) (0x40050004+0x04)))
#define TEST_CCAN_BAUD_RATE 500000
#define T0MR0 (*((volatile unsigned long *) 0x40014014))
#define T0TC (*((volatile unsigned long *) 0x40014008))
CCAN_MSG_OBJ_T msg_obj,msg_obj_tranmit;
int tieniconto = 0;
uint32_t timerFreq;
void Delay(int Ms){
timerFreq = Chip_Clock_GetSystemClockRate();
uint32_t CurrentTime;
Chip_TIMER_MatchEnableInt(LPC_TIMER32_0, 0);
CurrentTime = T0TC;
Chip_TIMER_SetMatch(LPC_TIMER32_0, 0, CurrentTime+Ms*(timerFreq / 1000));
Chip_TIMER_MatchEnableInt(LPC_TIMER32_0, 0);
Chip_TIMER_Enable(LPC_TIMER32_0);
while(((T0MR0)&(0x01))==0x01);
}
void baudrateCalculate(uint32_t baud_rate, uint32_t *can_api_timing_cfg)
{
uint32_t pClk, div, quanta, segs, seg1, seg2, clk_per_bit, can_sjw;
Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_CAN);
pClk = Chip_Clock_GetMainClockRate();
clk_per_bit = pClk / baud_rate;
for (div = 0; div <= 15; div++) {
for (quanta = 1; quanta <= 32; quanta++) {
for (segs = 3; segs <= 17; segs++) {
if (clk_per_bit == (segs * quanta * (div + 1))) {
segs -= 3;
seg1 = segs / 2;
seg2 = segs - seg1;
can_sjw = seg1 > 3 ? 3 : seg1;
can_api_timing_cfg[0] = div;
can_api_timing_cfg[1] =
((quanta - 1) & 0x3F) | (can_sjw & 0x03) << 6 | (seg1 & 0x0F) << 8 | (seg2 & 0x07) << 12;
return;
}
}
}
}
}
void CAN_rx(uint8_t msg_obj_num) {
msg_obj.msgobj = msg_obj_num;
LPC_CCAN_API->can_receive(&msg_obj);
if (msg_obj_num == 1) {
msg_obj.msgobj = msg_obj.msgobj+1;
msg_obj.mode_id = 600;
LPC_CCAN_API->can_transmit(&msg_obj);
}
}
void CAN_tx(uint8_t msg_obj_num) {
tieniconto++;
}
void CAN_error(uint32_t error_info) {}
void CAN_IRQHandler(void) {
LPC_CCAN_API->isr();
}
void TIMER32_0_IRQHandler(void)
{
if (Chip_TIMER_MatchPending(LPC_TIMER32_0, 0)) {
Chip_TIMER_ClearMatch(LPC_TIMER32_0, 0);
Chip_TIMER_MatchDisableInt(LPC_TIMER32_0, 0);
}
}
int main(void)
{
uint32_t CanApiClkInitTable[2];
CCAN_CALLBACKS_T callbacks = {
CAN_rx,
CAN_tx,
CAN_error,
NULL,
NULL,
NULL,
NULL,
NULL,
};
SystemCoreClockUpdate();
Board_Init();
baudrateCalculate(TEST_CCAN_BAUD_RATE, CanApiClkInitTable);
LPC_CCAN_API->init_can(&CanApiClkInitTable[0], TRUE);
LPC_CCAN_API->config_calb(&callbacks);
NVIC_EnableIRQ(CAN_IRQn);
Chip_TIMER_Init(LPC_TIMER32_0);
NVIC_ClearPendingIRQ(TIMER_32_0_IRQn);
NVIC_EnableIRQ(TIMER_32_0_IRQn);
msg_obj.msgobj = 0;
msg_obj.mode_id = 0x345;
msg_obj.mask = 0x7F0;
msg_obj.dlc = 4;
msg_obj.data[0] = 'T';
msg_obj.data[1] = 'E';
msg_obj.data[2] = 'S';
msg_obj.data[3] = 'T';
LPC_CCAN_API->can_transmit(&msg_obj);
msg_obj.msgobj = 1;
msg_obj.mode_id = 0x400;
msg_obj.mask = 0x700;
LPC_CCAN_API->config_rxmsgobj(&msg_obj);
while (1) {
msg_obj_tranmit.msgobj = 3;
msg_obj_tranmit.mode_id = 0x345;
msg_obj_tranmit.mask = 0x7F0;
msg_obj_tranmit.dlc = 4;
msg_obj_tranmit.data[0] = 'O';
msg_obj_tranmit.data[1] = 'K';
msg_obj_tranmit.data[2] = 'a';
msg_obj_tranmit.data[3] = 'y';
LPC_CCAN_API->can_transmit(&msg_obj_tranmit);
Delay(1000);
}
}

Fig 1 Testing result.
Have a great day,
TIC
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------