<?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 Re: usb_cdc maximum bandwidth in LPCXpresso IDE</title>
    <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546373#M9653</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Tsuneo on Sun Sep 16 22:04:14 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: &lt;/STRONG&gt;&lt;BR /&gt;obviously I meant 500kbit/s ( 64byte per frame ; one frame per ms)&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Heh, obvious?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I thought you meant high-speed (480M bps) USB &lt;SPAN class="lia-unicode-emoji" title=":winking_face:"&gt;&lt;LI-EMOJI id="lia_winking-face" title=":winking_face:"&gt;&lt;/LI-EMOJI&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Anyway, bits/s is wrong unit to measure USB transfer speed, because bus bit rate is fixed.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Apply bytes/s, or full-size transactions (packets)/frame, instead.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: &lt;/STRONG&gt;&lt;BR /&gt;the hw_usb_cdc sample code for the lpc1347 seems to send only one packet per USB frame.&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Do you understand the code exactly?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Where does "one packet per USB frame" come from?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;As of usbcdc example in examples.lpc13xx.new.zip,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;1) Host --&amp;gt; device direction&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Whenever an OUT transaction finishes on the bulk OUT Endpoint, CDC_WrOutBuf() appends the packet to CDC_OutBuf.data[] array.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;USB_EndPoint3(USB_EVT_OUT) --&amp;gt; CDC_BulkOut() --&amp;gt; CDC_WrOutBuf()&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The firmware runs a cyclic buffer on this array. But the array size, CDC_BUF_SIZE, is set to 64 bytes.&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;cdcuser.c

#define CDC_BUF_SIZE&amp;nbsp;&amp;nbsp; (64)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Output buffer in bytes (power 2)&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;When transactions come from host too quickly, UART can't consume it in time, and then overwrite occurs on the cyclic buffer. To hold entire packets on the cyclic buffer, increase CDC_BUF_SIZE value.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;For example, set it to 1024 bytes. &lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;#define CDC_BUF_SIZE&amp;nbsp;&amp;nbsp; (1024)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Output buffer in bytes (power 2)&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;On your PC application, send 1024 bytes data to the COM port in single call.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;PC host controller splits this transfer into 16 transactions of 64 bytes. Most likely these 16 transactions are sent to the device in single frame.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;2) Device --&amp;gt; host direction&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;When the transfer size is greater than 64 bytes, you'll see multiple transactions in a frame.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The original code doesn't fit to large transfer size.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;- It doesn't limit the packet size within 64 bytes when it calls USB_WriteEP() in CDC_BulkIn() and VCOM_Serial2Usb().&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;- It doesn't care transfer termination by ZLP, when the transfer size is just the multiple of 64.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;In these reasons, the original code should be replaced to support large transfer size.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;CDC_BulkIn() is replaced as follows.&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
cdcuser.c

uint32_t cdc_bulkIN_count&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;
uint8_t *cdc_bulkIN_ptr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NULL;
uint8_t&amp;nbsp; cdc_bulkIN_occupied = FALSE;
uint8_t&amp;nbsp; cdc_bulkIN_ZLP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = FALSE;

void CDC_BulkIn(void) {
&amp;nbsp; int numBytesSend;
&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // split into packets
&amp;nbsp; numBytesSend = (cdc_bulkIN_count &amp;lt; USB_CDC_BUFSIZE) ? cdc_bulkIN_count : USB_CDC_BUFSIZE;

&amp;nbsp; if ( numBytesSend || ((numBytesSend == 0) &amp;amp;&amp;amp; cdc_bulkIN_ZLP) ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_WriteEP (CDC_DEP_IN, cdc_bulkIN_ptr, numBytesSend);&amp;nbsp; // send over USB
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_count -= numBytesSend;&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; cdc_bulkIN_ptr&amp;nbsp;&amp;nbsp; += numBytesSend;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_ZLP&amp;nbsp;&amp;nbsp; = (numBytesSend == USB_CDC_BUFSIZE);
&amp;nbsp; } else {
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_occupied = FALSE;
&amp;nbsp; }
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;To start large size transfer, fill a buffer with data, and pass the buffer to CDC_block_send()&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
uint32_t CDC_block_send( uint8_t *buffer, uint32_t send_size )
{
&amp;nbsp; if ( !cdc_bulkIN_occupied ) {&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;&amp;nbsp; // The bulk IN endpoint is not busy
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_occupied = TRUE;&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;&amp;nbsp; // fill the context
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_ptr&amp;nbsp;&amp;nbsp; = buffer;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_count = send_size;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_ZLP&amp;nbsp;&amp;nbsp; = FALSE;
&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;DevIntSet = EPAdr( CDC_DEP_IN );&amp;nbsp;&amp;nbsp; // trigger interrupt manually
&amp;nbsp;&amp;nbsp;&amp;nbsp; return TRUE;
&amp;nbsp; }
&amp;nbsp; return FALSE;
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;lastly, the context is initialized at Set_Configuration, to cope with detach/attach&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
usbuser.c

#if USB_CONFIGURE_EVENT
void USB_Configure_Event (void) {

&amp;nbsp; if (USB_Configuration) {&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;&amp;nbsp;&amp;nbsp; /* Check if USB is configured */
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* add your code here */
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_count&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_ptr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NULL;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_occupied = FALSE;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_ZLP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = FALSE;
&amp;nbsp; }
}
#endif
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Tsuneo&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 22:02:14 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T22:02:14Z</dc:date>
    <item>
      <title>usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546370#M9650</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by sebseb7 on Fri Sep 14 17:11:31 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;is there a way to get more than 500000kbit/s with software usb_cdc (lpc1343) or rom usb_cdc (lpc1347) ?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;a packet size seems to be maxium 64 bytes I find no wa increasing the bandwidth.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;thank you&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;sebastian&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:11 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546370#M9650</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:11Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546371#M9651</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Tsuneo on Sat Sep 15 20:37:45 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;You would be better to learn the basic of USB, first.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: &lt;/STRONG&gt;&lt;BR /&gt;is there a way to get more than 500000kbit/s with software usb_cdc (lpc1343) or rom usb_cdc (lpc1347) ?&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC1347 has Full-Speed (FS) USB device engine. "Full-speed" means bus bit rate of 12M bps.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;How can you carry 500000kbit/s over 12M bps?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: &lt;/STRONG&gt;&lt;BR /&gt;a packet size seems to be maxium 64 bytes I find no wa increasing the bandwidth.&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;SPAN&gt;FS Bulk transfer may have 19 full-size (64bytes) transactions at most, in single USB frame.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I've explained on Transfer - transaction on this post.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Transfer - transaction - packet&lt;/SPAN&gt;&lt;BR /&gt;&lt;A href="http://"&gt;http://www.cygnal.org/ubb/Forum9/HTML/001627.html&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Tsuneo&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:11 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546371#M9651</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:11Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546372#M9652</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by sebseb7 on Sun Sep 16 10:31:38 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: Tsuneo&lt;/STRONG&gt;&lt;BR /&gt;You would be better to learn the basic of USB, first.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;LPC1347 has Full-Speed (FS) USB device engine. "Full-speed" means bus bit rate of 12M bps.&lt;BR /&gt;How can you carry 500000kbit/s over 12M bps?&lt;BR /&gt;&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;obviously I meant 500kbit/s&amp;nbsp; ( 64byte per frame ; one frame per ms)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: Tsuneo&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;FS Bulk transfer may have 19 full-size (64bytes) transactions at most, in single USB frame.&lt;BR /&gt;I've explained on Transfer - transaction on this post.&lt;BR /&gt;&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;the hw_usb_cdc sample code for the lpc1347 seems to send only one packet per USB frame. &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Does anyone know how to send multiple packets in one frame ?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:13 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546372#M9652</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:13Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546373#M9653</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Tsuneo on Sun Sep 16 22:04:14 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: &lt;/STRONG&gt;&lt;BR /&gt;obviously I meant 500kbit/s ( 64byte per frame ; one frame per ms)&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Heh, obvious?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I thought you meant high-speed (480M bps) USB &lt;SPAN class="lia-unicode-emoji" title=":winking_face:"&gt;&lt;LI-EMOJI id="lia_winking-face" title=":winking_face:"&gt;&lt;/LI-EMOJI&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Anyway, bits/s is wrong unit to measure USB transfer speed, because bus bit rate is fixed.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Apply bytes/s, or full-size transactions (packets)/frame, instead.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: &lt;/STRONG&gt;&lt;BR /&gt;the hw_usb_cdc sample code for the lpc1347 seems to send only one packet per USB frame.&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Do you understand the code exactly?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Where does "one packet per USB frame" come from?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;As of usbcdc example in examples.lpc13xx.new.zip,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;1) Host --&amp;gt; device direction&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Whenever an OUT transaction finishes on the bulk OUT Endpoint, CDC_WrOutBuf() appends the packet to CDC_OutBuf.data[] array.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;USB_EndPoint3(USB_EVT_OUT) --&amp;gt; CDC_BulkOut() --&amp;gt; CDC_WrOutBuf()&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The firmware runs a cyclic buffer on this array. But the array size, CDC_BUF_SIZE, is set to 64 bytes.&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;cdcuser.c

#define CDC_BUF_SIZE&amp;nbsp;&amp;nbsp; (64)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Output buffer in bytes (power 2)&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;When transactions come from host too quickly, UART can't consume it in time, and then overwrite occurs on the cyclic buffer. To hold entire packets on the cyclic buffer, increase CDC_BUF_SIZE value.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;For example, set it to 1024 bytes. &lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;#define CDC_BUF_SIZE&amp;nbsp;&amp;nbsp; (1024)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Output buffer in bytes (power 2)&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;On your PC application, send 1024 bytes data to the COM port in single call.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;PC host controller splits this transfer into 16 transactions of 64 bytes. Most likely these 16 transactions are sent to the device in single frame.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;2) Device --&amp;gt; host direction&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;When the transfer size is greater than 64 bytes, you'll see multiple transactions in a frame.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The original code doesn't fit to large transfer size.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;- It doesn't limit the packet size within 64 bytes when it calls USB_WriteEP() in CDC_BulkIn() and VCOM_Serial2Usb().&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;- It doesn't care transfer termination by ZLP, when the transfer size is just the multiple of 64.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;In these reasons, the original code should be replaced to support large transfer size.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;CDC_BulkIn() is replaced as follows.&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
cdcuser.c

uint32_t cdc_bulkIN_count&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;
uint8_t *cdc_bulkIN_ptr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NULL;
uint8_t&amp;nbsp; cdc_bulkIN_occupied = FALSE;
uint8_t&amp;nbsp; cdc_bulkIN_ZLP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = FALSE;

void CDC_BulkIn(void) {
&amp;nbsp; int numBytesSend;
&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // split into packets
&amp;nbsp; numBytesSend = (cdc_bulkIN_count &amp;lt; USB_CDC_BUFSIZE) ? cdc_bulkIN_count : USB_CDC_BUFSIZE;

&amp;nbsp; if ( numBytesSend || ((numBytesSend == 0) &amp;amp;&amp;amp; cdc_bulkIN_ZLP) ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_WriteEP (CDC_DEP_IN, cdc_bulkIN_ptr, numBytesSend);&amp;nbsp; // send over USB
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_count -= numBytesSend;&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; cdc_bulkIN_ptr&amp;nbsp;&amp;nbsp; += numBytesSend;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_ZLP&amp;nbsp;&amp;nbsp; = (numBytesSend == USB_CDC_BUFSIZE);
&amp;nbsp; } else {
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_occupied = FALSE;
&amp;nbsp; }
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;To start large size transfer, fill a buffer with data, and pass the buffer to CDC_block_send()&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
uint32_t CDC_block_send( uint8_t *buffer, uint32_t send_size )
{
&amp;nbsp; if ( !cdc_bulkIN_occupied ) {&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;&amp;nbsp; // The bulk IN endpoint is not busy
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_occupied = TRUE;&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;&amp;nbsp; // fill the context
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_ptr&amp;nbsp;&amp;nbsp; = buffer;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_count = send_size;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_ZLP&amp;nbsp;&amp;nbsp; = FALSE;
&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;DevIntSet = EPAdr( CDC_DEP_IN );&amp;nbsp;&amp;nbsp; // trigger interrupt manually
&amp;nbsp;&amp;nbsp;&amp;nbsp; return TRUE;
&amp;nbsp; }
&amp;nbsp; return FALSE;
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;lastly, the context is initialized at Set_Configuration, to cope with detach/attach&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
usbuser.c

#if USB_CONFIGURE_EVENT
void USB_Configure_Event (void) {

&amp;nbsp; if (USB_Configuration) {&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;&amp;nbsp;&amp;nbsp; /* Check if USB is configured */
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* add your code here */
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_count&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_ptr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NULL;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_occupied = FALSE;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_ZLP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = FALSE;
&amp;nbsp; }
}
#endif
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Tsuneo&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:14 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546373#M9653</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:14Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546374#M9654</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by sebseb7 on Sun Sep 16 22:54:18 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: Tsuneo&lt;/STRONG&gt;&lt;BR /&gt;Heh, obvious?&lt;BR /&gt;I thought you meant high-speed (480M bps) USB &lt;SPAN class="lia-unicode-emoji" title=":winking_face:"&gt;&lt;LI-EMOJI id="lia_winking-face" title=":winking_face:"&gt;&lt;/LI-EMOJI&gt;&lt;/SPAN&gt;&lt;BR /&gt;Anyway, bits/s is wrong unit to measure USB transfer speed, because bus bit rate is fixed.&lt;BR /&gt;Apply bytes/s, or full-size transactions (packets)/frame, instead.&lt;BR /&gt;&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;sorry.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: Tsuneo&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;Do you understand the code exactly?&lt;BR /&gt;&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;not really. And I can't follow you (but thank you anyway) , because I use the lpc1347 rom driver.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;You can find the code here: &lt;/SPAN&gt;&lt;A href="http://" rel="nofollow noopener noreferrer" target="_blank"&gt;https://github.com/sebseb7/pentarm13uxx/blob/usb_cdc/main.c&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;this is only a test, which echoes everyting from usb back:&lt;/SPAN&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;
pVcom-&amp;gt;rxlen = pUsbApi-&amp;gt;hw-&amp;gt;ReadEP(hUsb, USB_CDC_EP_BULK_OUT, pVcom-&amp;gt;rxBuf);
pVcom-&amp;gt;rxBuf[pVcom-&amp;gt;rxlen++] = pVcom-&amp;gt;rxlen;
pUsbApi-&amp;gt;hw-&amp;gt;WriteEP (pVcom-&amp;gt;hUsb, USB_CDC_EP_BULK_IN, pVcom-&amp;gt;rxBuf, pVcom-&amp;gt;rxlen);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;thank you&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;sebastian&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546374#M9654</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:15Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546375#M9655</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by sebseb7 on Sun Sep 16 22:55:43 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;increasing USB_FS_MAX_BULK_PACKET in &lt;/SPAN&gt;&lt;A href="http://"&gt;https://github.com/sebseb7/pentarm13uxx/blob/usb_cdc/usb/app_usbd_cfg.h&lt;/A&gt;&lt;SPAN&gt; does not help.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546375#M9655</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:15Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546376#M9656</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Tsuneo on Mon Sep 17 04:29:30 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: &lt;/STRONG&gt;&lt;BR /&gt;increasing USB_FS_MAX_BULK_PACKET in &lt;A href="http://" rel="nofollow noopener noreferrer" target="_blank"&gt;https://github.com/sebseb7/pentarm13...app_usbd_cfg.h&lt;/A&gt; does not help.&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Does USB_FS_MAX_BULK_PACKET give wMaxPacketSize of the bulk endpoints?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Then, you should not increase it. For full-Speed bulk, 64 bytes is the greatest value.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Rather, increase the transfer size.&lt;/SPAN&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;
ErrorCode_t VCOM_bulk_out_hdlr(USBD_HANDLE_T hUsb, void* data, uint32_t event) 
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...
&amp;nbsp;&amp;nbsp;&amp;nbsp; pVcom-&amp;gt;rxlen = pUsbApi-&amp;gt;hw-&amp;gt;ReadEP(hUsb, USB_CDC_EP_BULK_OUT, pVcom-&amp;gt;rxBuf);
&amp;nbsp;&amp;nbsp;&amp;nbsp; pVcom-&amp;gt;rxBuf[pVcom-&amp;gt;rxlen++] = pVcom-&amp;gt;rxlen;&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;lt;------ (1) delete this line
&amp;nbsp;&amp;nbsp;&amp;nbsp; pUsbApi-&amp;gt;hw-&amp;gt;WriteEP (pVcom-&amp;gt;hUsb, USB_CDC_EP_BULK_IN, pVcom-&amp;gt;rxBuf, pVcom-&amp;gt;rxlen);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The problem of above code lies in (1) line.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;When your PC application sends more than 64 bytes to the COM port in single call, this transfer is split into multiple transactions by PC host controller. For example of 200 bytes transfer, four transactions, 64, 64, 64, 8, occur on the bulk OUT endpoint.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;When every OUT transaction finishes, above VCOM_bulk_out_hdlr() is called over interrupt. In your code, ReadEP() retrieves a packet from the bulk OUT EP, and WriteEP() sends it back. The problem lies in above (1) line, at "pVcom-&amp;gt;rxlen++". When 64 bytes transaction comes, this line increases pVcom-&amp;gt;rxlen to 65. And then, this value is fed to WriteEP(). But wMaxPacketSize of bulk endpoints is 64, 65 is invalid. Delete (1) line.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Another problem of this code is, it doesn't terminate the bulk IN transfer, when the transfer size is multiple of 64 (64, 128, 192, ...). Your PC application doesn't see this size of transfer on the loopback, until it sends short transfer (less than 64 bytes) after it.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Tsuneo&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:16 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546376#M9656</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:16Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546377#M9657</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by sebseb7 on Mon Sep 17 05:10:56 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: Tsuneo&lt;/STRONG&gt;&lt;BR /&gt;Does USB_FS_MAX_BULK_PACKET give wMaxPacketSize of the bulk endpoints?&lt;BR /&gt;Then, you should not increase it. For full-Speed bulk, 64 bytes is the greatest value.&lt;BR /&gt;Rather, increase the transfer size.&lt;BR /&gt;&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;if 64 bytes is the maximum that can be transferred in one transfer, how one should reach more than 62.5kbyte/s ? As I understood only 1 transfer per millisecond can be done.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/sebastian&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:17 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546377#M9657</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:17Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546378#M9658</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Tsuneo on Mon Sep 17 07:10:32 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;You are mixing up [B]Transfer[/B] and [B]Transaction[/B], both are USB-specific terminology.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Read this explanation, as I suggested in my first post.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Transfer - transaction - packet&lt;/SPAN&gt;&lt;BR /&gt;&lt;A href="http://"&gt;http://www.cygnal.org/ubb/Forum9/HTML/001627.html&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Tsuneo&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:17 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546378#M9658</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:17Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546379#M9659</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by BrunoF on Thu Jul 03 11:11:30 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi Tsuneo,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;i've read you in several forums and i know you're a Guru in the USB subject.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Maybe you can give me a hint with something because i'm out of ideas. I'm working with a LPC1343 Bulk USB project. I'm using endpoint 0x81 for IN transfers and 0x02 for OUT transfers (i would love to use endpoint 0x03 because of FIQ and double buffering, but im limited to 0x02 cause of Host Driver side).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Problem is that Host may send data fast (up to 1mBps). So, i must receive the data as faster as i can. I started modifying the CDC example for my purpose. Everything works fine. Host side sends around 520 byte each 30mS in my tests. It works just fine for sometimes a few seconds, sometimes something more (a minute or so). Nothing is dropped. Thing is that at a certain point, OUT transactions start to get Cancelled forever.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;My main code doesn't make anything more than sending 2 bytes (IN) each 16mS intervals. I removed all code so i can just read the Endpoint 0x02 as fast as i can. Still, you can see in the Report i've attached to this post that starting from Seq 2112 Endpoint 0x02 seems to stop responding and i have no clue why or how to recover it from that state.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I would love to fix this problem, so ideally it coud not drop even one packet, but, if this happen a couple of times per minute, i can live with that too. But at least i need to know a way to:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;1) knowing if there's a error with OUT transfers (when endpoint stop responding, the associated interrupt stop occurring too), so i don't know how to detect the error, specially if no interrupt occur to indicate the error;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;2) recover from that permanent CANCELLED state somehow, so i can continue receiving future transfers.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks in advance!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546379#M9659</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:18Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546380#M9660</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Tsuneo on Sun Jul 06 08:31:27 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi BrunoF,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In your USB log,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The bulk OUT transfers (C:I:E=01:00:02) run within 2ms (Duration) at the start up.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;But at the sequence #2125, the bulk OUT transfer is canceled by the host app. because of timeout.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;No USB error is reported between the last successful transfer (#2111) and canceled one (#2125)&lt;/SPAN&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: &lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Seq&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Duration&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:I:E&lt;BR /&gt;URB 0004-0003 ... 897 us&amp;nbsp;&amp;nbsp; Bulk or Interrupt Transfer 4 bytes&amp;nbsp;&amp;nbsp; buffer&amp;nbsp; out 01:00:02&amp;nbsp; Success (Success)&lt;BR /&gt;URB 0006-0005 ... 1.990 ms Bulk or Interrupt Transfer 511 bytes buffer&amp;nbsp; out 01:00:02&amp;nbsp; Success (Success)&lt;BR /&gt;...&lt;BR /&gt;...&lt;BR /&gt;URB 2111-2110 ... 1.987 ms Bulk or Interrupt Transfer 511 bytes buffer&amp;nbsp; out 01:00:02&amp;nbsp; Success (Success) &lt;BR /&gt;URB 2125-2112 ... 101.973 ms Bulk or Interrupt Transfer&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;&amp;nbsp; out 01:00:02&amp;nbsp; Cancelled (Canceled)&lt;BR /&gt;&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;SPAN&gt;It suggests that the bulk OUT endpoint is not read out by your firmware any more after #2111.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If you would show us your code around the bulk OUT EP, more suggestion should come.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;What is the base example of your code?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Tsuneo&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:19 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546380#M9660</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:19Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546381#M9661</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by BrunoF on Sun Jul 06 11:22:30 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks a lot for your reply Tsuneo!&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm using LPCXPresso 5 IDE and the base example is the usbcdc example inside file ...\lpcxpresso\Examples\NXP\LPC1000\LPC13xx\examples.lpc13xx.new.zip.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I've modified it to just keep the bulk part.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;in usbhw.c, function void USB_IRQHandler (void) is the function called when a USB IRQ interrupt occur.&lt;/SPAN&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (USB_P_EP[m]) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_P_EP[m](USB_EVT_OUT);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;is the code part that executes &lt;/SPAN&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;
void USB_EndPoint2 (uint32_t event) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CDC_BulkOut ();&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; /* data received from Host */
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&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;
void CDC_BulkOut(void) {
&amp;nbsp; static uint32_t led_state = 0;

&amp;nbsp; led_state++;

if(led_state &amp;amp; 0x80)
&amp;nbsp; GPIOSetValue( LED_PORT, LED_BIT, LED_ON );
else
&amp;nbsp; GPIOSetValue( LED_PORT, LED_BIT, LED_OFF );

&amp;nbsp; // get data from USB into intermediate buffer
&amp;nbsp; numBytesRead = USB_ReadEP(CDC_DEP_OUT, &amp;amp;BulkBufOut[0]);

&amp;nbsp; // ... add code to check for overwrite

&amp;nbsp; // store data in a buffer to transmit it over serial interface
&amp;nbsp; //CDC_WrOutBuf ((char *)&amp;amp;BulkBufOut[0], &amp;amp;numBytesRead);
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;That's all code respecting to OUT transfers. I've disable all my other code that made something usefull with the incoming data packets.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;my main code is:&lt;/SPAN&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;int main (void) {
&amp;nbsp; /* Basic chip initialization is taken care of in SystemInit() called
&amp;nbsp;&amp;nbsp; * from the startup code. SystemInit() and chip settings are defined
&amp;nbsp;&amp;nbsp; * in the CMSIS system_&amp;lt;part family&amp;gt;.c file.
&amp;nbsp;&amp;nbsp; */

/* Enable Timer32_1, IOCON, and USB blocks */
LPC_SYSCON-&amp;gt;SYSAHBCLKCTRL |= (EN_TIMER32_1 | EN_IOCON | EN_USBREG);

&amp;nbsp; /* Initialize 32-bit timer 0. TIME_INTERVAL is defined as 10mS */
&amp;nbsp; /* You may also want to use the Cortex SysTick timer to do this */
&amp;nbsp; /* interrupt each 16 mS **/
&amp;nbsp; init_timer32(0, (SystemFrequency/LPC_SYSCON-&amp;gt;SYSAHBCLKDIV)/62);
&amp;nbsp; /* Enable timer 0. Our interrupt handler will begin incrementing
&amp;nbsp;&amp;nbsp; * the TimeTick global each time timer 0 matches and resets.
&amp;nbsp;&amp;nbsp; */
&amp;nbsp; enable_timer32(0);

&amp;nbsp; /* Initialize GPIO (sets up clock) */
&amp;nbsp; GPIOInit();
&amp;nbsp; /* Set LED port pin to output */
&amp;nbsp; GPIOSetDir( LED_PORT, LED_BIT, 1 );
&amp;nbsp; /* LED off */
&amp;nbsp; GPIOSetValue( LED_PORT, LED_BIT, LED_OFF );


&amp;nbsp; USBIOClkConfig();

&amp;nbsp; VCOM_Init();&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;&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; // VCOM Initialization

&amp;nbsp; USB_Init();&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;&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; // USB Initialization
&amp;nbsp; USB_Connect(TRUE);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // USB Connect

&amp;nbsp; NVIC_SetPriority(USB_IRQn, 0);//maximum interrupt prior for USB IRQ
&amp;nbsp; NVIC_SetPriority(TIMER_32_0_IRQn, 31);//minimum interrupt prior for TIMER32_0 IRQ

&amp;nbsp; while (!USB_Configuration) ;&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; // wait until USB is configured

&amp;nbsp; while (1) {&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;&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; // Loop forever
&amp;nbsp;&amp;nbsp;&amp;nbsp; VCOM_Serial2Usb();&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // read serial port and initiate USB event
&amp;nbsp;&amp;nbsp;&amp;nbsp; //VCOM_CheckSerialState();
//VCOM_Usb2Serial();
&amp;nbsp; } // end while
} // end main ()&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;void VCOM_Serial2Usb(void) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; static char serBuf [USB_CDC_BUFSIZE];&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; int&amp;nbsp; numBytesRead, numAvailByte;&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;&amp;nbsp; /* timer32_0_counter is incremented in TMR32_0 interrupt */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; if((timer32_0_counter) /*&amp;amp;&amp;amp; CDC_DepInEmpty*/)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; timer32_0_counter = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; serBuf[0] = 0x31;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; serBuf[1] = 0x60;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CDC_DepInEmpty = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; USB_WriteEP (CDC_DEP_IN, (unsigned char *)&amp;amp;serBuf[0], 2);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thing is, as you said, firmware stop reading the Endpoint 0x02, but that's because IRQ for OUT Transfers at 0x02 seems to stop happening. CDC_BulkOut() stops being called, so the LED stops blinking too. That's my visual warning that something went wrong. I can then see the USB Analyzer showing those kind of log like the one i've attached here.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm having troubles debugging the code too. I can't even use printf() to the IDE Console because it result in USB transfers failing. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Some tests i've made:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;1) See if somehow USB_Configure() function was deconfiguring the Endpoint 0x02. It doesn't. &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;2) Speed up USB_IRQHandler(), skipping checking endpoints my app doesn't use. Even looping LPC_USB-&amp;gt;DevIntSt state to see if other transaction (one of the 19) happened, so i can just read data without having to re-enter interrupt service routine. No change.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:20 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546381#M9661</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:20Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546382#M9662</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Tsuneo on Mon Jul 07 06:43:47 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;In your code, USB_ReadEP() is called at interrupt context, and USB_WriteEP() is called by the main loop. And then, violation of exclusive access to the shared resources (USB Endpoint control register, USB protocol engine) occurs.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Both of USB_ReadEP() and USB_WriteEP() touch to USBCtrl (LPC_USB-&amp;gt;Ctrl) register, to transfer data over USBTxData / USBRxData registers. While these routines reads from / writes to the Tx/Rx registers, USBCtrl should be kept untouched. Similar problem occurs in the access to the USB protocol engine over USBCmdCode (LPC_USB-&amp;gt;CmdData) and USBCmdData (LPC_USB-&amp;gt;CmdData) registers.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;There are a couple of solutions for this problem.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;a) Mask USB (or endpoint) interrupt around USB_WriteEP() call in the main loop.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;b) Move USB_WriteEP() into the endpoint ISR, and invoke the endpoint interrupt manually.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;c) Register USB_ReadEP() and USB_WriteEP() as SVC routines.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is an example of b) option.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;1) In VCOM_Serial2Usb() routine, USB_WriteEP() call is replaced with this line&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
&amp;nbsp;&amp;nbsp; CDC_DepInEmpty = 0;
// USB_WriteEP (CDC_DEP_IN, (unsigned char *)&amp;amp;serBuf[0], 2);&amp;nbsp; // comment this line
&amp;nbsp;&amp;nbsp; LPC_USB-&amp;gt;DevIntSet = 1 &amp;lt;&amp;lt; (EPAdr( CDC_DEP_IN ) + 1);&amp;nbsp;&amp;nbsp; // invoke endpoint interrupt
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;2) in the USB_EndPoint1() callback, USB_WriteEP() is called.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;As this callback is also called when the bulk IN transaction completes, CDC_DepInEmpty is applied to distinguish the first manual call and the secondary complete call.&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
void USB_EndPoint1 (uint32_t event) {
&amp;nbsp;&amp;nbsp; if ( (event == USB_EVT_IN) &amp;amp;&amp;amp; (CDC_DepInEmpty == 0) ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CDC_DepInEmpty = 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_WriteEP (CDC_DEP_IN, (unsigned char *)&amp;amp;serBuf[0], 2);
&amp;nbsp;&amp;nbsp; }
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Tsuneo&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:20 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546382#M9662</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:20Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546383#M9663</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by BrunoF on Mon Jul 07 12:50:15 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;As always, you are right. You're a lifesaver.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I was not thinking about shared access to those things.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I do have a remaining question,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;let's say i have to send 600 bytes to Host (IN endpoint). What would be the best way to achieve this transfer as faster as possible and without blocking the CPU? &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;Thanks a lot!!&lt;/STRONG&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546383#M9663</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:21Z</dc:date>
    </item>
    <item>
      <title>Re: usb_cdc maximum bandwidth</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546384#M9664</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by BrunoF on Wed Jul 09 21:02:48 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Ok, i totally missed your previous post in this Topic talking about exactly that subject,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;though i had to modified the code to:&lt;/SPAN&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;void CDC_BulkIn(void) {
&amp;nbsp; int numBytesSend;
&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // split into packets
&amp;nbsp; numBytesSend = (cdc_bulkIN_count &amp;lt; USB_CDC_BUFSIZE) ? cdc_bulkIN_count : USB_CDC_BUFSIZE;

&amp;nbsp; if ( numBytesSend || ((numBytesSend == 0) &amp;amp;&amp;amp; cdc_bulkIN_ZLP) ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_WriteEP (CDC_DEP_IN, cdc_bulkIN_ptr, numBytesSend);&amp;nbsp; // send over USB
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_count -= numBytesSend;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_ptr&amp;nbsp;&amp;nbsp; += numBytesSend;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_ZLP&amp;nbsp;&amp;nbsp; = (numBytesSend == USB_CDC_BUFSIZE);
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((!cdc_bulkIN_count) &amp;amp;&amp;amp; (!cdc_bulkIN_ZLP))&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;&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;lt;---added for mono-packet transfers to release flag
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_occupied = FALSE;&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;lt;---added for mono-packet transfers to release flag
&amp;nbsp; } else {
&amp;nbsp;&amp;nbsp;&amp;nbsp; cdc_bulkIN_occupied = FALSE;
&amp;nbsp; }
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Because flag &lt;/SPAN&gt;&lt;I&gt;cdc_bulkIN_occupied&lt;/I&gt;&lt;SPAN&gt; wasn't being released when i sent a packet of size &amp;lt; USB_CDC_BUFSIZE bytes. I know that if it's &amp;lt; USB_CDC_BUFSIZE bytes, then packet isn't a multi-packet really, but as only one callback is called and used to send data IN (&lt;/SPAN&gt;&lt;STRONG&gt;CDC_BulkIn&lt;/STRONG&gt;&lt;SPAN&gt;) i thought it was important to be able to just use the callback function for all kind of packets.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Cheers and thank you so much again,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;B&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:02:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/usb-cdc-maximum-bandwidth/m-p/546384#M9664</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:02:21Z</dc:date>
    </item>
  </channel>
</rss>

