LPC11C14 no interrupt when receiving a CAN RTR message, after sending the same COB ID

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

LPC11C14 no interrupt when receiving a CAN RTR message, after sending the same COB ID

576 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by Christian_RX7 on Sun May 03 10:54:58 MST 2015
Hello.

This is my first project with a LPC11C14 and I trying to run CANopen based on the AN11238. SDO and PDO communication are working fine except one thing.
When the controller receives a CAN RTR message after sending the exact same COB ID, nothing happens, no interrupt also nothing to see in the CAN registers during debugging.
For PDO sending I use the message buffer 10.
For receiving RTR PDOs I use the message buffer 11, there I configured DIR=1, RMTEN=0, and UMASK=1, to get an interrupt for handling the answer in software.
Until now there are two PDO COB-IDs 0x181 and 0x281. When the RTR alternates between those two, every request results an interrupt and my software sends an answer. But two times the same request and nothing happens at the second RTR. The same result after sending an event triggered message, then the following request (same COB) is unhanded.

That´s the part where I initialise the CAN controller:
  /* Initialize the CAN controller */
  (*rom)->pCAND->init_can(&ClkInitTable[0], 1);
  /* Configure the CAN callback functions */
  (*rom)->pCAND->config_calb(&callbacks);
  /* Initiate object dictionary */
  CANopen_Init_SDO();
  /* Initialize CANopen handler */
  myCANopen.node_id = CANnodeId;
  myCANopen.od_const_num = NumberOfmyConstODEntries;
  myCANopen.od_num = NumberOfmyODEntries;
  (*rom)->pCAND->config_canopen((CAN_CANOPENCFG *)&myCANopen);
  /* Enable the CAN Interrupt */
  NVIC_EnableIRQ(CAN_IRQn);
  /* Configure message object 3 to receive all 11-bit messages 0x700-0x77F  Network Management Error Control */
  CANopen_Msg_Obj.msgobj = CAN_MSG_BUFFER_HEARTBEAT_RX;
  CANopen_Msg_Obj.mode_id = 0x700;
  CANopen_Msg_Obj.mask = 0x780;
  (*rom)->pCAND->config_rxmsgobj(&CANopen_Msg_Obj);

  /* Configure message object 5 to receive all 11-bit messages 0x000 (Network Management) */
  CANopen_Msg_Obj.msgobj = CAN_MSG_BUFFER_NMT_RX;
  CANopen_Msg_Obj.mode_id = 0x000;
  CANopen_Msg_Obj.mask = 0x7FF;
  (*rom)->pCAND->config_rxmsgobj(&CANopen_Msg_Obj);

  /* Configure message object 7 to receive all 11-bit messages 0x580-5FF (SDO) */
  CANopen_Msg_Obj.msgobj = CAN_MSG_BUFFER_SDO_CLIENT_RX;
  CANopen_Msg_Obj.mode_id = 0x580;
  CANopen_Msg_Obj.mask = 0x780;
  (*rom)->pCAND->config_rxmsgobj(&CANopen_Msg_Obj);

  /* Configure message object 9 to receive all 11-bit messages 0x200+NodeID (PDO) */
  CANopen_Msg_Obj.msgobj = CAN_MSG_BUFFER_PDO_RX;
  CANopen_Msg_Obj.mode_id = SDOS_1400Sub1_Data;
  CANopen_Msg_Obj.mask = 0x7FF;
  (*rom)->pCAND->config_rxmsgobj(&CANopen_Msg_Obj);

  /* Configure message object 11 to receive all 11-bit rtr messages 0x?80+NodeID (PDO request) */
  CANopen_Msg_Obj.msgobj = CAN_MSG_BUFFER_PDO_RXTX_REQ;
  CANopen_Msg_Obj.mode_id = SDOS_1800Sub1_Data | CAN_MSGOBJ_RTR;
  CANopen_Msg_Obj.mask = (~(SDOS_1800Sub1_Data ^ SDOS_1801Sub1_Data) & 0x7FF);
  (*rom)->pCAND->config_rxmsgobj(&CANopen_Msg_Obj);


Has anyone an idea?

Thanks,
Christian_RX7
Labels (1)
0 Kudos
Reply
1 Reply

434 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by Christian_RX7 on Tue May 05 05:48:07 MST 2015
After many hours of picking in the dark, I found something interresting.

When I swap the message buffers for the PDO RX and the PDO RTR to
Message Buffer to receive PDO messages = 11
Message Buffer to transmit PDO messages = 10
Message Buffer to receive PDO RTR messages = 9

Then all works fine and every RTR triggers an interrupt.
That messages in a lower buffer have a higher priority is obvious but why they influence each other?

Christian_RX7
0 Kudos
Reply