<?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>LPC MicrocontrollersのトピックUSBCDC sample code of LPC4330 issue.</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/USBCDC-sample-code-of-LPC4330-issue/m-p/578430#M19825</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by CH Wu on Sun Feb 01 21:45:09 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hello NXP team,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;We'd like to ask interruption occurrence condition of USB0 of LPC4330.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;We use USBCDC by making reference to a sample code of following Keil &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;and achieve a virtual serial communication between the PC and LPC4330.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.lpcware.com%2Fcontent%2Fnxpfile%2Flpc4350apdlzip" rel="nofollow" target="_blank"&gt;http://www.lpcware.com/content/nxpfile/lpc4350apdlzip&lt;/A&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The defect at which data transmission in the LPC4330-&amp;gt;PC direction stops at present occurs.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;When it's checked, interruption isn't rising from USB0 at the time of data transmission completion.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;A rough processing flow is indicated below.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;----&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;[Tx of 330byte data in the LPC4330-&amp;gt;PC direction (64 * 5 + 10 byte)]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 1) Data is written in Endpoint in BulkIn (EP2) 64 bytes from LPC4330.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 2) Data is sent 64 bytes at the timing of BulkIn packet reception from a PC.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 3) USB interruption occurs on LPC4330 side by the timing to &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; which ACK to BulkIn transmission data has been returned from a PC.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 4) Transmission data of the 64byte continued by USB interruption &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; processing is written in Endpoint in BulkIn.(EP2) 64 bytes.&amp;nbsp; ( 2)-4) is repeated 4 times.)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 5) Remaining 10 byte is written in Endpoint in BulkIn (EP2).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 6) Data is sent 10 bytes at the timing of BulkIn packet reception from a PC.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 7) ACK from a PC to BulkIn transmission data is the timing which has returned, &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; and interruption of USB0 occurs. Transmission processing is completed by the timing.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;----&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;We expect that interruption of USB0 occurs after transmission of 7), &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;but there is a case that interrupt of USB0 doesn't occur by a fixed probability.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;We want an answer of the following question.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; A) We understand as follows.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Interruption occurs by the timing which received ACK in USB BulkIn &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from a PC after data transmission of BulkIn processing from LPC4330.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Is this our understanding right?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; B)Isn't interruption considered as the factor which doesn't occur?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;A question related to above.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;We found the cause point of the issue USB0 interruption doesn't generate.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.lpcware.com%2Fcontent%2Fnxpfile%2Flpc4350apdlzip" rel="nofollow" target="_blank"&gt;http://www.lpcware.com/content/nxpfile/lpc4350apdlzip&lt;/A&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lpc43xx\Examples\USBDEV\Usb_Cdc\usbhw.c&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;We are refer to the sample code that available usbhw.c from the above URL.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;In the process of them seems to be such a factor &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;in missed interrupt has occurred following.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; * HighSpeed mode USB&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Interrupt source clear ENDPTCOMPLETE is performed &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; after the processing for each Endpoint&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * In the processing of each Endpoint, take a little time &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; to such memory copy to another bank&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So we have modified the process as described in "No.8 Details" sheet.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;In the modified contents, to perform the processing &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;of each Endpoint interrupt factors from clear at the beginning.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;We applied this modification, the interrupt missed no longer occurred.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;We want to hear your opinion about the following.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;1) What is the meaning of the interruption factor clearance &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; which is ENDPTNAK in the original sample code?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;2) Is the handle of "Code modification proposal" proper?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; (Even than missed interrupts can occur in this deal?)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;--------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The original sample code&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.lpcware.com%2Fcontent%2Fnxpfile%2Flpc4350apdlzip" rel="nofollow" target="_blank"&gt;http://www.lpcware.com/content/nxpfile/lpc4350apdlzip&lt;/A&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;lpc43xx\Examples\USBDEV\Usb_Cdc\usbhw.c : L725 - L750&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;'''&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; /* handle completion interrupts */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; val = LPC_USB-&amp;gt;ENDPTCOMPLETE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; if (val)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART1-&amp;gt;THR = 'C';&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART1-&amp;gt;THR = '\n';&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTNAK = val;&amp;lt;- ???&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (n = 0; n &amp;lt; EP_NUM_MAX / 2; n++)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val &amp;amp; (1&amp;lt;&amp;lt;n))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_drv.USB_P_EP[n])&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_drv.USB_P_EP[n](USB_EVT_OUT);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = (1&amp;lt;&amp;lt;n);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val &amp;amp; (1&amp;lt;&amp;lt;(n + 16)))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ep_TD [(n &amp;lt;&amp;lt; 1) + 1 ].total_bytes &amp;amp;= 0xC0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_drv.USB_P_EP[n])&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_drv.USB_P_EP[n](USB_EVT_IN);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = (1&amp;lt;&amp;lt;(n + 16));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;'''&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;--------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;--------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Code modification proposal&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;'''&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; /* handle completion interrupts */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; val = LPC_USB-&amp;gt;ENDPTCOMPLETE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; if (val)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART1-&amp;gt;THR = 'C';&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART1-&amp;gt;THR = '\n';&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTNAK = val;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = val;&amp;nbsp; /* XXX clear interruption factor */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (n = 0; n &amp;lt; EP_NUM_MAX / 2; n++)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val &amp;amp; (1&amp;lt;&amp;lt;n))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_drv.USB_P_EP[n])&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_drv.USB_P_EP[n](USB_EVT_OUT);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = (1&amp;lt;&amp;lt;n);&amp;nbsp;&amp;nbsp;&amp;nbsp; /* XXX comment out */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val &amp;amp; (1&amp;lt;&amp;lt;(n + 16)))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ep_TD [(n &amp;lt;&amp;lt; 1) + 1 ].total_bytes &amp;amp;= 0xC0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_drv.USB_P_EP[n])&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_drv.USB_P_EP[n](USB_EVT_IN);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = (1&amp;lt;&amp;lt;(n + 16));&amp;nbsp;&amp;nbsp;&amp;nbsp; /* XXX comment out */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;'''&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;--------&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 19:02:07 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T19:02:07Z</dc:date>
    <item>
      <title>USBCDC sample code of LPC4330 issue.</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/USBCDC-sample-code-of-LPC4330-issue/m-p/578430#M19825</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by CH Wu on Sun Feb 01 21:45:09 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hello NXP team,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;We'd like to ask interruption occurrence condition of USB0 of LPC4330.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;We use USBCDC by making reference to a sample code of following Keil &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;and achieve a virtual serial communication between the PC and LPC4330.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.lpcware.com%2Fcontent%2Fnxpfile%2Flpc4350apdlzip" rel="nofollow" target="_blank"&gt;http://www.lpcware.com/content/nxpfile/lpc4350apdlzip&lt;/A&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The defect at which data transmission in the LPC4330-&amp;gt;PC direction stops at present occurs.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;When it's checked, interruption isn't rising from USB0 at the time of data transmission completion.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;A rough processing flow is indicated below.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;----&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;[Tx of 330byte data in the LPC4330-&amp;gt;PC direction (64 * 5 + 10 byte)]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 1) Data is written in Endpoint in BulkIn (EP2) 64 bytes from LPC4330.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 2) Data is sent 64 bytes at the timing of BulkIn packet reception from a PC.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 3) USB interruption occurs on LPC4330 side by the timing to &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; which ACK to BulkIn transmission data has been returned from a PC.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 4) Transmission data of the 64byte continued by USB interruption &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; processing is written in Endpoint in BulkIn.(EP2) 64 bytes.&amp;nbsp; ( 2)-4) is repeated 4 times.)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 5) Remaining 10 byte is written in Endpoint in BulkIn (EP2).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 6) Data is sent 10 bytes at the timing of BulkIn packet reception from a PC.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; 7) ACK from a PC to BulkIn transmission data is the timing which has returned, &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; and interruption of USB0 occurs. Transmission processing is completed by the timing.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;----&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;We expect that interruption of USB0 occurs after transmission of 7), &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;but there is a case that interrupt of USB0 doesn't occur by a fixed probability.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;We want an answer of the following question.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; A) We understand as follows.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Interruption occurs by the timing which received ACK in USB BulkIn &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from a PC after data transmission of BulkIn processing from LPC4330.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Is this our understanding right?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; B)Isn't interruption considered as the factor which doesn't occur?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;A question related to above.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;We found the cause point of the issue USB0 interruption doesn't generate.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.lpcware.com%2Fcontent%2Fnxpfile%2Flpc4350apdlzip" rel="nofollow" target="_blank"&gt;http://www.lpcware.com/content/nxpfile/lpc4350apdlzip&lt;/A&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lpc43xx\Examples\USBDEV\Usb_Cdc\usbhw.c&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;We are refer to the sample code that available usbhw.c from the above URL.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;In the process of them seems to be such a factor &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;in missed interrupt has occurred following.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; * HighSpeed mode USB&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Interrupt source clear ENDPTCOMPLETE is performed &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; after the processing for each Endpoint&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * In the processing of each Endpoint, take a little time &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; to such memory copy to another bank&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So we have modified the process as described in "No.8 Details" sheet.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;In the modified contents, to perform the processing &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;of each Endpoint interrupt factors from clear at the beginning.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;We applied this modification, the interrupt missed no longer occurred.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;We want to hear your opinion about the following.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;1) What is the meaning of the interruption factor clearance &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; which is ENDPTNAK in the original sample code?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;2) Is the handle of "Code modification proposal" proper?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; (Even than missed interrupts can occur in this deal?)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;--------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The original sample code&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.lpcware.com%2Fcontent%2Fnxpfile%2Flpc4350apdlzip" rel="nofollow" target="_blank"&gt;http://www.lpcware.com/content/nxpfile/lpc4350apdlzip&lt;/A&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;lpc43xx\Examples\USBDEV\Usb_Cdc\usbhw.c : L725 - L750&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;'''&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; /* handle completion interrupts */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; val = LPC_USB-&amp;gt;ENDPTCOMPLETE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; if (val)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART1-&amp;gt;THR = 'C';&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART1-&amp;gt;THR = '\n';&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTNAK = val;&amp;lt;- ???&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (n = 0; n &amp;lt; EP_NUM_MAX / 2; n++)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val &amp;amp; (1&amp;lt;&amp;lt;n))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_drv.USB_P_EP[n])&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_drv.USB_P_EP[n](USB_EVT_OUT);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = (1&amp;lt;&amp;lt;n);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val &amp;amp; (1&amp;lt;&amp;lt;(n + 16)))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ep_TD [(n &amp;lt;&amp;lt; 1) + 1 ].total_bytes &amp;amp;= 0xC0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_drv.USB_P_EP[n])&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_drv.USB_P_EP[n](USB_EVT_IN);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = (1&amp;lt;&amp;lt;(n + 16));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;'''&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;--------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;--------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Code modification proposal&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;'''&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; /* handle completion interrupts */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; val = LPC_USB-&amp;gt;ENDPTCOMPLETE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; if (val)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART1-&amp;gt;THR = 'C';&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART1-&amp;gt;THR = '\n';&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTNAK = val;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = val;&amp;nbsp; /* XXX clear interruption factor */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (n = 0; n &amp;lt; EP_NUM_MAX / 2; n++)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val &amp;amp; (1&amp;lt;&amp;lt;n))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_drv.USB_P_EP[n])&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_drv.USB_P_EP[n](USB_EVT_OUT);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = (1&amp;lt;&amp;lt;n);&amp;nbsp;&amp;nbsp;&amp;nbsp; /* XXX comment out */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val &amp;amp; (1&amp;lt;&amp;lt;(n + 16)))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ep_TD [(n &amp;lt;&amp;lt; 1) + 1 ].total_bytes &amp;amp;= 0xC0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_drv.USB_P_EP[n])&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_drv.USB_P_EP[n](USB_EVT_IN);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = (1&amp;lt;&amp;lt;(n + 16));&amp;nbsp;&amp;nbsp;&amp;nbsp; /* XXX comment out */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;'''&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;--------&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:02:07 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/USBCDC-sample-code-of-LPC4330-issue/m-p/578430#M19825</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:02:07Z</dc:date>
    </item>
    <item>
      <title>Re: USBCDC sample code of LPC4330 issue.</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/USBCDC-sample-code-of-LPC4330-issue/m-p/578431#M19826</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by CH Wu on Sun Feb 01 21:53:59 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hello NXP team,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;please refer code modification proposalas following.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;//The original sample code&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN&gt;//&lt;/SPAN&gt;&lt;A _jive_internal="true" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.lpcware.com%2Fcontent%2Fnxpfile%2Flpc4350apdlzip" rel="nofollow" target="_blank"&gt;http://www.lpcware.com/content/nxpfile/lpc4350apdlzip&lt;/A&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//lpc43xx\Examples\USBDEV\Usb_Cdc\usbhw.c : L725 - L750&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//'''&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; /* handle completion interrupts */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; val = LPC_USB-&amp;gt;ENDPTCOMPLETE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; if (val)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART1-&amp;gt;THR = 'C';&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART1-&amp;gt;THR = '\n';&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTNAK = val;&amp;lt;- ???&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (n = 0; n &amp;lt; EP_NUM_MAX / 2; n++)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val &amp;amp; (1&amp;lt;&amp;lt;n))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_drv.USB_P_EP[n])&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_drv.USB_P_EP[n](USB_EVT_OUT);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = (1&amp;lt;&amp;lt;n);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val &amp;amp; (1&amp;lt;&amp;lt;(n + 16)))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ep_TD [(n &amp;lt;&amp;lt; 1) + 1 ].total_bytes &amp;amp;= 0xC0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_drv.USB_P_EP[n])&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_drv.USB_P_EP[n](USB_EVT_IN);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = (1&amp;lt;&amp;lt;(n + 16));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//'''&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//--------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//--------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//Code modification proposal&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//'''&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; /* handle completion interrupts */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; val = LPC_USB-&amp;gt;ENDPTCOMPLETE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; if (val)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART1-&amp;gt;THR = 'C';&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_UART1-&amp;gt;THR = '\n';&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTNAK = val;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = val;&amp;nbsp; /* XXX clear interruption factor */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (n = 0; n &amp;lt; EP_NUM_MAX / 2; n++)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val &amp;amp; (1&amp;lt;&amp;lt;n))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_drv.USB_P_EP[n])&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_drv.USB_P_EP[n](USB_EVT_OUT);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = (1&amp;lt;&amp;lt;n);&amp;nbsp;&amp;nbsp;&amp;nbsp; /* XXX comment out */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val &amp;amp; (1&amp;lt;&amp;lt;(n + 16)))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ep_TD [(n &amp;lt;&amp;lt; 1) + 1 ].total_bytes &amp;amp;= 0xC0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_drv.USB_P_EP[n])&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_drv.USB_P_EP[n](USB_EVT_IN);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;ENDPTCOMPLETE = (1&amp;lt;&amp;lt;(n + 16));&amp;nbsp;&amp;nbsp;&amp;nbsp; /* XXX comment out */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//'''&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//--------&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:02:08 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/USBCDC-sample-code-of-LPC4330-issue/m-p/578431#M19826</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:02:08Z</dc:date>
    </item>
  </channel>
</rss>

