<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic LPC11C24 CCAN ROM DRIVER - Transmit Lockup in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC11C24-CCAN-ROM-DRIVER-Transmit-Lockup/m-p/539568#M11889</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by emh203 on Wed Jun 03 07:19:05 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hello:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have a problem with usage of the CCAN ROM drivers in the LPC11C24.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1st off,&amp;nbsp; I do know about reserving memory space for the drivers so that is not it... &lt;SPAN class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;&lt;LI-EMOJI id="lia_slightly-smiling-face" title=":slightly_smiling_face:"&gt;&lt;/LI-EMOJI&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have a test setup that consists of 4 LPC11C24 devices on a CAN network at 500KB.&amp;nbsp;&amp;nbsp;&amp;nbsp; The network also has a Peak Systems USB to CAN adapter to monitor/transmit messages.&amp;nbsp;&amp;nbsp; I have a test program that routinely sends out data from a PC which causes the 4 different nodes to respond with traffic.&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is the problem....&amp;nbsp;&amp;nbsp;&amp;nbsp; Eventually all of the LPC11C24 nodes will stop transmitting.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; After lots of debugging,&amp;nbsp; it *looks* like the problem is that the CAN_tx callback is not always called.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; When using the ROM drivers,&amp;nbsp; this is critical as there is no way to know if there are free message objects before I make a call to LPC_CCAN_API-&amp;gt;can_transmit().&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is the flow...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;1.)&amp;nbsp;&amp;nbsp; In my system,&amp;nbsp; I have a software queue of CAN messages.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;2.)&amp;nbsp; when I want to transmit, I put a message in the queue&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;3.)&amp;nbsp; A foreground routine will periodically check the queue and call the CCAN API as needed.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;4.)&amp;nbsp; When a message is sent with the API,&amp;nbsp; A TxReady flag (which is declared a volatile)&amp;nbsp; is reset to indicate that I am sending a message.&amp;nbsp;&amp;nbsp; The CAN_tx callback sets this flag to indicate the previous transmission is finished.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;When happens over time is that my "TxReady" flag never gets set.&amp;nbsp;&amp;nbsp; This means that the callback for transmission is not getting called.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I also have the error handler callback setup (and I enable the proper bits in the config register).&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; At no time does this callback ever get called.&amp;nbsp; So,&amp;nbsp;&amp;nbsp; from the software point of view, it appears that there are no errors and the CAN_tx callback is not always getting called.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Also, the error handler resets all software flags and re-inits the CAN controller (although I never get a call to it)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The CAN API provides no mechanism to know if there are free message objects for me to send data so it seems that I must rely on a software flag to know.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Some more documentation on the API would be helpful.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Some snippets.....&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;

/*CAN transmit callback */
/*Function is executed by the Callback handler after
&amp;nbsp;&amp;nbsp;&amp;nbsp; a CAN message has been transmitted */
void CAN_tx(uint8_t msg_obj_num)
{
txIntCount++;

CAN_TxReady = TRUE;

}


void CAN_Process()
{
uint16_t i,j;
CAN_t TempMsg;
CCAN_MSG_OBJ_T msg_obj;

i = CAN_MessagesInQueue(&amp;amp;CAN_TxQueue);

//if there is data to send, then dequeue and send.
if(CAN_TxReady &amp;amp;&amp;amp; i&amp;gt;0)
{
CAN_TxReady = FALSE;
CAN_MesssageDequeue(&amp;amp;CAN_TxQueue,&amp;amp;TempMsg);

//move from our CAN_t queue to the Rom driver routine

msg_obj.msgobj&amp;nbsp; = 16;
msg_obj.mode_id = CAN_MSGOBJ_EXT | TempMsg.ID;
msg_obj.mask&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x0;
msg_obj.dlc&amp;nbsp;&amp;nbsp;&amp;nbsp; = TempMsg.DLC;

for(j=0;j&amp;lt;TempMsg.DLC;j++)

{
msg_obj.data[j] = TempMsg.Data[j];
}

LPC_CCAN_API-&amp;gt;can_transmit(&amp;amp;msg_obj);


 }
}

&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Some other notes&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;a.)&amp;nbsp;&amp;nbsp; It looks like the CAN API ignores the msg_obj field in the CAN struct.&amp;nbsp;&amp;nbsp; I manually set this to 16 but I noticed that the can_tx callback sometimes indicates it use a different msg_obj.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;b.)&amp;nbsp; I currently only use one msg_obj and a software queue.&amp;nbsp; I would like to use more of the available msg_objects but I cannot see any reliable way to know what is free via the CAN API.&amp;nbsp;&amp;nbsp;&amp;nbsp; The documentation on the ROM API is spare.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am at a point where I am considering disassembly the ROM code to see the behavior of the tx function.... Or simply writing my own from scratch.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Any ideas?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 19:38:45 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T19:38:45Z</dc:date>
    <item>
      <title>LPC11C24 CCAN ROM DRIVER - Transmit Lockup</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC11C24-CCAN-ROM-DRIVER-Transmit-Lockup/m-p/539568#M11889</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by emh203 on Wed Jun 03 07:19:05 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hello:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have a problem with usage of the CCAN ROM drivers in the LPC11C24.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1st off,&amp;nbsp; I do know about reserving memory space for the drivers so that is not it... &lt;SPAN class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;&lt;LI-EMOJI id="lia_slightly-smiling-face" title=":slightly_smiling_face:"&gt;&lt;/LI-EMOJI&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have a test setup that consists of 4 LPC11C24 devices on a CAN network at 500KB.&amp;nbsp;&amp;nbsp;&amp;nbsp; The network also has a Peak Systems USB to CAN adapter to monitor/transmit messages.&amp;nbsp;&amp;nbsp; I have a test program that routinely sends out data from a PC which causes the 4 different nodes to respond with traffic.&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is the problem....&amp;nbsp;&amp;nbsp;&amp;nbsp; Eventually all of the LPC11C24 nodes will stop transmitting.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; After lots of debugging,&amp;nbsp; it *looks* like the problem is that the CAN_tx callback is not always called.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; When using the ROM drivers,&amp;nbsp; this is critical as there is no way to know if there are free message objects before I make a call to LPC_CCAN_API-&amp;gt;can_transmit().&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is the flow...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;1.)&amp;nbsp;&amp;nbsp; In my system,&amp;nbsp; I have a software queue of CAN messages.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;2.)&amp;nbsp; when I want to transmit, I put a message in the queue&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;3.)&amp;nbsp; A foreground routine will periodically check the queue and call the CCAN API as needed.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;4.)&amp;nbsp; When a message is sent with the API,&amp;nbsp; A TxReady flag (which is declared a volatile)&amp;nbsp; is reset to indicate that I am sending a message.&amp;nbsp;&amp;nbsp; The CAN_tx callback sets this flag to indicate the previous transmission is finished.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;When happens over time is that my "TxReady" flag never gets set.&amp;nbsp;&amp;nbsp; This means that the callback for transmission is not getting called.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I also have the error handler callback setup (and I enable the proper bits in the config register).&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; At no time does this callback ever get called.&amp;nbsp; So,&amp;nbsp;&amp;nbsp; from the software point of view, it appears that there are no errors and the CAN_tx callback is not always getting called.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Also, the error handler resets all software flags and re-inits the CAN controller (although I never get a call to it)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The CAN API provides no mechanism to know if there are free message objects for me to send data so it seems that I must rely on a software flag to know.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Some more documentation on the API would be helpful.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Some snippets.....&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;

/*CAN transmit callback */
/*Function is executed by the Callback handler after
&amp;nbsp;&amp;nbsp;&amp;nbsp; a CAN message has been transmitted */
void CAN_tx(uint8_t msg_obj_num)
{
txIntCount++;

CAN_TxReady = TRUE;

}


void CAN_Process()
{
uint16_t i,j;
CAN_t TempMsg;
CCAN_MSG_OBJ_T msg_obj;

i = CAN_MessagesInQueue(&amp;amp;CAN_TxQueue);

//if there is data to send, then dequeue and send.
if(CAN_TxReady &amp;amp;&amp;amp; i&amp;gt;0)
{
CAN_TxReady = FALSE;
CAN_MesssageDequeue(&amp;amp;CAN_TxQueue,&amp;amp;TempMsg);

//move from our CAN_t queue to the Rom driver routine

msg_obj.msgobj&amp;nbsp; = 16;
msg_obj.mode_id = CAN_MSGOBJ_EXT | TempMsg.ID;
msg_obj.mask&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x0;
msg_obj.dlc&amp;nbsp;&amp;nbsp;&amp;nbsp; = TempMsg.DLC;

for(j=0;j&amp;lt;TempMsg.DLC;j++)

{
msg_obj.data[j] = TempMsg.Data[j];
}

LPC_CCAN_API-&amp;gt;can_transmit(&amp;amp;msg_obj);


 }
}

&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Some other notes&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;a.)&amp;nbsp;&amp;nbsp; It looks like the CAN API ignores the msg_obj field in the CAN struct.&amp;nbsp;&amp;nbsp; I manually set this to 16 but I noticed that the can_tx callback sometimes indicates it use a different msg_obj.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;b.)&amp;nbsp; I currently only use one msg_obj and a software queue.&amp;nbsp; I would like to use more of the available msg_objects but I cannot see any reliable way to know what is free via the CAN API.&amp;nbsp;&amp;nbsp;&amp;nbsp; The documentation on the ROM API is spare.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am at a point where I am considering disassembly the ROM code to see the behavior of the tx function.... Or simply writing my own from scratch.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Any ideas?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:38:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC11C24-CCAN-ROM-DRIVER-Transmit-Lockup/m-p/539568#M11889</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:38:45Z</dc:date>
    </item>
    <item>
      <title>Re: LPC11C24 CCAN ROM DRIVER - Transmit Lockup</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC11C24-CCAN-ROM-DRIVER-Transmit-Lockup/m-p/539569#M11890</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by R2D2 on Wed Jun 03 07:32:44 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: emh203&lt;/STRONG&gt;&lt;BR /&gt;Any ideas?&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The usual workaround is to use a transmit timeout (a few ms) to reset your transmit flag&amp;nbsp; :O &lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:38:46 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC11C24-CCAN-ROM-DRIVER-Transmit-Lockup/m-p/539569#M11890</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:38:46Z</dc:date>
    </item>
  </channel>
</rss>

