Hi Pete,
I am working on a new board with a LPC1517. I found this thread and your post where you say the project is attached but I don't see the file. Maybe because this was moved. Would it be possible to get your sample project.
Thanks,
Gary
.... void CAN_IRQHandler(void) .... |
//transmit message #1
[color=#f00] while(LPC_CAN->TXREQ1 & (1<<0)){}//read pending transmission request of object 0[/color]
msg_obj.msgobj = 0;
msg_obj.mode_id = 0x700+ NODE_ID;
msg_obj.mask = 0x0;
msg_obj.dlc = 0x4;
msg_obj.data[0] = 0x11;
msg_obj.data[1] = 0x11;
msg_obj.data[2] = 0x11;
msg_obj.data[3] = 0x11;
LPC_CAND_API->hwCAN_MsgTransmit(pCanHandle, &msg_obj);
//transmit message #2
[color=#f00] while(LPC_CAN->TXREQ1 & (1<<0)){}//read pending transmission request of object 0[/color]
msg_obj.msgobj = 0;
msg_obj.mode_id = 0x700 + NODE_ID+1;
msg_obj.mask = 0x0;
msg_obj.dlc = 3;
msg_obj.data[0] = 0x22;
msg_obj.data[1] = 0x22;
msg_obj.data[2] = 0x22;
LPC_CAND_API->hwCAN_MsgTransmit(pCanHandle, &msg_obj); |
#define NODE_ID 0x20//own node id //message #1 msg_obj.msgobj = 0; [color=#f00]msg_obj.mode_id = 0x700+ NODE_ID[/color]; msg_obj.mask = 0x0; [color=#f00]msg_obj.dlc = 0x4;[/color] msg_obj.data[0] = 0x11; msg_obj.data[1] = 0x11; msg_obj.data[2] = 0x11; [color=#f00]msg_obj.data[3] = 0x11;[/color] LPC_CAND_API->hwCAN_MsgTransmit(pCanHandle, &msg_obj); //message #2 msg_obj.msgobj = 0; msg_obj.mode_id = 0x700 + NODE_ID+1; msg_obj.mask = 0x0; msg_obj.dlc = 3; [color=#30f]msg_obj.data[0] = 0x22; msg_obj.data[1] = 0x22; msg_obj.data[2] = 0x22;[/color] LPC_CAND_API->hwCAN_MsgTransmit(pCanHandle, &msg_obj); |
//wait 5ms before CAN_Fail
#define CAN_TX_TIME 5
//CAN State
enum CAN_STATE
{
CAN_Success,
CAN_TX,
CAN_Fail
};
//CAN
typedef struct _CAN_STATE
{
volatile uint16_t timeout; //tx timeout
volatile uint8_t state;//CAN state
}CAN_STATE_t;
CAN_STATE_t can_state;
...
static void CAN_tx(uint8_t msg_obj)
{
Board_LED_Toggle(1);//show TX
can_state.state = CAN_Success;//success, ready to transmit next message
}
...
//CAN timer, call every ms in SysTick...
__attribute__((always_inline)) __INLINE void CAN_1ms_timer(void)
{
//timer to control tx
if(can_state.state == CAN_TX)
{
//timeout to fail
if(can_state.timeout)
{
can_state.timeout--;
if(can_state.timeout==0) can_state.state = CAN_Fail;
}
}
}
//transmit message #1
while(!((can_state.state == CAN_Success) || (can_state.state == CAN_Fail))){}; //wait
can_state.timeout = CAN_TX_TIME;//can timeout
can_state.state = CAN_TX; //set tx busy flag
msg_obj.msgobj = 0;
msg_obj.mode_id = 0x700+ NODE_ID;
msg_obj.mask = 0x0;
msg_obj.dlc = 0x4;
msg_obj.data[0] = 0x11;
msg_obj.data[1] = 0x11;
msg_obj.data[2] = 0x11;
msg_obj.data[3] = 0x11;
LPC_CAND_API->hwCAN_MsgTransmit(pCanHandle, &msg_obj);
//transmit message #2
while(!((can_state.state == CAN_Success) || (can_state.state == CAN_Fail))){}; //wait
can_state.timeout = CAN_TX_TIME; //can timeout
can_state.state = CAN_TX; //set tx busy flag
msg_obj.msgobj = 0;
msg_obj.mode_id = 0x700 + NODE_ID+1;
msg_obj.mask = 0x0;
msg_obj.dlc = 3;
msg_obj.data[0] = 0x22;
msg_obj.data[1] = 0x22;
msg_obj.data[2] = 0x22;
LPC_CAND_API->hwCAN_MsgTransmit(pCanHandle, &msg_obj);
|