<?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>Processor Expert Software中的主题 Usb transactions overwritten or missing</title>
    <link>https://community.nxp.com/t5/Processor-Expert-Software/Usb-transactions-overwritten-or-missing/m-p/317379#M2405</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I am using the USB component in Processor Expert with MQX Lite on the K20, and I seeing what looks like missing transactions, or transacations that have been overwritten.&amp;nbsp; I am setting up the BDT entry with a buffer and a callback routine.&amp;nbsp; The callback routine simply sets a semaphore to wake up a task that reads the contents of the buffer, and initializes the next reception.&amp;nbsp; I thought the next reception would be held off until the next BDT entry was set up, but it looks like it's overwriting the previous buffer before the data is transferred.&amp;nbsp; Am I using this API correctly?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt;/************************************************************************************************************&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt;*&amp;nbsp; this routine is called by the application task to transfer the buffer data to the parsing buffer&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt;*************************************************************************************************************/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;void ReadInputDataSetup(unsigned char *bufin, int *size)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; int tdata;&lt;BR /&gt;&amp;nbsp; int x;&lt;BR /&gt; &lt;BR /&gt;&amp;nbsp; tdata = DataTD.TransmittedDataSize;&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; if (tdata)&lt;BR /&gt;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; memcpy(&amp;amp;bufin[*size], Buffer, tdata);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; *size += tdata;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; DataTD.Head.EpNum&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Initialize receive request for EP0(Out), when data is received, &lt;BR /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call ReadInputDataTask routine&amp;nbsp; */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; DataTD.Head.BufferPtr&amp;nbsp; = (uint8_t *)Buffer;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Input buffer pointer */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; DataTD.Head.BufferSize = (uint16_t)32;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Size of input buffer */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; DataTD.Head.Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = LDD_USB_DEVICE_TRANSFER_FLAG_EXT_PARAM;&amp;nbsp; /* TD contains extension parameter. Callback doesn't occur without this */&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; DataTD.CallbackFnPtr&amp;nbsp;&amp;nbsp; = &amp;amp;ReadInputDataTask;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Set pointer to the ReadInputDataTask function */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; (void)USB1_DeviceRecvData(SavedMyUsbPtr-&amp;gt;UsbPtr,(LDD_USB_Device_TTD *)&amp;amp;DataTD);&lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;}&lt;BR /&gt;/*******************************************************&lt;BR /&gt;**&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp; ReadInputDataTask (User method)&lt;BR /&gt;**&lt;BR /&gt;**&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Description :&lt;BR /&gt;**&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set the semaphore to cause the reading of the buffer,&lt;BR /&gt;**&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; and set up for the next receive.&lt;BR /&gt;* */&lt;BR /&gt;void ReadInputDataTask(LDD_TDeviceData *USBDevDataPtr, LDD_USB_Device_TTD* pTD)&lt;BR /&gt;{&lt;BR /&gt; &lt;BR /&gt; SavedMyUsbPtr&amp;nbsp;&amp;nbsp; = (MY_USB *)USBDevDataPtr;&lt;/P&gt;&lt;P&gt;if (pTD-&amp;gt;TransferState == LDD_USB_TRANSFER_DONE)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; PostUSBSem();&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// application task loop&amp;nbsp; pulls in 32 byte at a time until there is not enough room for another 32, then parses.&lt;/P&gt;&lt;P&gt;for(;;)&lt;BR /&gt; {&lt;BR /&gt;&amp;nbsp; WaitUSBSem();&lt;BR /&gt;&amp;nbsp; ReadInputDataSetup(flash_buf, &amp;amp;x);&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; if (((sizeof(flash_buf) - x) &amp;lt; 32)||&amp;nbsp; (dfu_state == DFU_MANIFEST_SYNC_STATE))&lt;BR /&gt;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; result = FlashArrayS19(flash_buf, x, line);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; x = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //reset buffer pointer&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; switch(result)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_OK:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_FACCERR:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfu_status.state = DFU_ERRERASE_STATUS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_FPVIOL:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfu_status.state = DFU_ERRWRITE_STATUS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_MGSTAT0:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfu_status.state = DFU_ERRUNKNOWN_STATUS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_RDCOLERR:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfu_status.state = DFU_ERRWRITE_STATUS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_NOT_ERASED:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfu_status.state = DFU_ERRPROG_STATUS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_CONTENTERR:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfu_status.state = DFU_ERRADDRESS_STATUS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; block_status = BLOCK_DONE;&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt;&lt;BR /&gt;=======================================================================&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt;After a little further study, I found out the DMAERR bit in the USB0_ERRSTAT register is set when the problem occurs.&amp;nbsp; This causes an interrupt without data, but the offending &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt;packet is already "eaten".&amp;nbsp; Possible timing problem?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN lang="JA" style="font-family: HelveticaLTStd-Roman; font-size: 8pt;"&gt;&lt;SPAN lang="JA" style="font-family: HelveticaLTStd-Roman; font-size: 8pt;"&gt;&lt;SPAN lang="JA" style="font-family: HelveticaLTStd-Roman; font-size: 8pt;"&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;"This bit is set if the USB Module has requested a DMA access to read a new BDT but has not been given&lt;/P&gt;&lt;P&gt;the bus before it needs to receive or transmit data. If processing a TX transfer this would cause a transmit&lt;/P&gt;&lt;P&gt;data underflow condition. [&lt;STRONG&gt;not doing a TX&lt;/STRONG&gt;]&lt;/P&gt;&lt;P&gt;If processing a RX transfer this would cause a receive data overflow condition.&lt;/P&gt;&lt;P&gt;This interrupt is useful when developing device arbitration hardware for the microprocessor and the USB&lt;/P&gt;&lt;P&gt;module to minimize bus request and bus grant latency. &lt;STRONG&gt;This bit is also set if a data packet to or from the&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;host is larger than the buffer size allocated in the BDT. In this case the data packet is truncated as it is put&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;in buffer memory&lt;/STRONG&gt;."&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm using a USB sniffer, and the packet doesn't look too big.&amp;nbsp; Hmmm.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;DMAERR bit appears to be a red herring.&amp;nbsp; It's set all the time regardless of failure.&amp;nbsp; It also is not OR'd into the&lt;/P&gt;&lt;P&gt;ISTAT ERROR bit BTW&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;found the problem.&amp;nbsp; Programmer error (whew).&amp;nbsp; I was making a call to&amp;nbsp;&amp;nbsp;&amp;nbsp; (void)USB1_DeviceRecvData(SavedMyUsbPtr-&amp;gt;UsbPtr,(LDD_USB_Device_TTD *)&amp;amp;DataTD); when I didn't have to.&amp;nbsp; I had already made the call when the USB command was issued.&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt; &lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 11 Jun 2014 17:21:16 GMT</pubDate>
    <dc:creator>marcbunyard</dc:creator>
    <dc:date>2014-06-11T17:21:16Z</dc:date>
    <item>
      <title>Usb transactions overwritten or missing</title>
      <link>https://community.nxp.com/t5/Processor-Expert-Software/Usb-transactions-overwritten-or-missing/m-p/317379#M2405</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I am using the USB component in Processor Expert with MQX Lite on the K20, and I seeing what looks like missing transactions, or transacations that have been overwritten.&amp;nbsp; I am setting up the BDT entry with a buffer and a callback routine.&amp;nbsp; The callback routine simply sets a semaphore to wake up a task that reads the contents of the buffer, and initializes the next reception.&amp;nbsp; I thought the next reception would be held off until the next BDT entry was set up, but it looks like it's overwriting the previous buffer before the data is transferred.&amp;nbsp; Am I using this API correctly?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt;/************************************************************************************************************&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt;*&amp;nbsp; this routine is called by the application task to transfer the buffer data to the parsing buffer&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt;*************************************************************************************************************/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;void ReadInputDataSetup(unsigned char *bufin, int *size)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; int tdata;&lt;BR /&gt;&amp;nbsp; int x;&lt;BR /&gt; &lt;BR /&gt;&amp;nbsp; tdata = DataTD.TransmittedDataSize;&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; if (tdata)&lt;BR /&gt;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; memcpy(&amp;amp;bufin[*size], Buffer, tdata);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; *size += tdata;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; DataTD.Head.EpNum&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Initialize receive request for EP0(Out), when data is received, &lt;BR /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call ReadInputDataTask routine&amp;nbsp; */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; DataTD.Head.BufferPtr&amp;nbsp; = (uint8_t *)Buffer;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Input buffer pointer */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; DataTD.Head.BufferSize = (uint16_t)32;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Size of input buffer */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; DataTD.Head.Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = LDD_USB_DEVICE_TRANSFER_FLAG_EXT_PARAM;&amp;nbsp; /* TD contains extension parameter. Callback doesn't occur without this */&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; DataTD.CallbackFnPtr&amp;nbsp;&amp;nbsp; = &amp;amp;ReadInputDataTask;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Set pointer to the ReadInputDataTask function */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; (void)USB1_DeviceRecvData(SavedMyUsbPtr-&amp;gt;UsbPtr,(LDD_USB_Device_TTD *)&amp;amp;DataTD);&lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;}&lt;BR /&gt;/*******************************************************&lt;BR /&gt;**&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp; ReadInputDataTask (User method)&lt;BR /&gt;**&lt;BR /&gt;**&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Description :&lt;BR /&gt;**&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set the semaphore to cause the reading of the buffer,&lt;BR /&gt;**&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; and set up for the next receive.&lt;BR /&gt;* */&lt;BR /&gt;void ReadInputDataTask(LDD_TDeviceData *USBDevDataPtr, LDD_USB_Device_TTD* pTD)&lt;BR /&gt;{&lt;BR /&gt; &lt;BR /&gt; SavedMyUsbPtr&amp;nbsp;&amp;nbsp; = (MY_USB *)USBDevDataPtr;&lt;/P&gt;&lt;P&gt;if (pTD-&amp;gt;TransferState == LDD_USB_TRANSFER_DONE)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; PostUSBSem();&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// application task loop&amp;nbsp; pulls in 32 byte at a time until there is not enough room for another 32, then parses.&lt;/P&gt;&lt;P&gt;for(;;)&lt;BR /&gt; {&lt;BR /&gt;&amp;nbsp; WaitUSBSem();&lt;BR /&gt;&amp;nbsp; ReadInputDataSetup(flash_buf, &amp;amp;x);&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; if (((sizeof(flash_buf) - x) &amp;lt; 32)||&amp;nbsp; (dfu_state == DFU_MANIFEST_SYNC_STATE))&lt;BR /&gt;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; result = FlashArrayS19(flash_buf, x, line);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; x = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //reset buffer pointer&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; switch(result)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_OK:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_FACCERR:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfu_status.state = DFU_ERRERASE_STATUS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_FPVIOL:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfu_status.state = DFU_ERRWRITE_STATUS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_MGSTAT0:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfu_status.state = DFU_ERRUNKNOWN_STATUS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_RDCOLERR:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfu_status.state = DFU_ERRWRITE_STATUS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_NOT_ERASED:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfu_status.state = DFU_ERRPROG_STATUS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; case Flash_CONTENTERR:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfu_status.state = DFU_ERRADDRESS_STATUS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; block_status = BLOCK_DONE;&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt;&lt;BR /&gt;=======================================================================&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt;After a little further study, I found out the DMAERR bit in the USB0_ERRSTAT register is set when the problem occurs.&amp;nbsp; This causes an interrupt without data, but the offending &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt;packet is already "eaten".&amp;nbsp; Possible timing problem?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN lang="JA" style="font-family: HelveticaLTStd-Roman; font-size: 8pt;"&gt;&lt;SPAN lang="JA" style="font-family: HelveticaLTStd-Roman; font-size: 8pt;"&gt;&lt;SPAN lang="JA" style="font-family: HelveticaLTStd-Roman; font-size: 8pt;"&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;"This bit is set if the USB Module has requested a DMA access to read a new BDT but has not been given&lt;/P&gt;&lt;P&gt;the bus before it needs to receive or transmit data. If processing a TX transfer this would cause a transmit&lt;/P&gt;&lt;P&gt;data underflow condition. [&lt;STRONG&gt;not doing a TX&lt;/STRONG&gt;]&lt;/P&gt;&lt;P&gt;If processing a RX transfer this would cause a receive data overflow condition.&lt;/P&gt;&lt;P&gt;This interrupt is useful when developing device arbitration hardware for the microprocessor and the USB&lt;/P&gt;&lt;P&gt;module to minimize bus request and bus grant latency. &lt;STRONG&gt;This bit is also set if a data packet to or from the&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;host is larger than the buffer size allocated in the BDT. In this case the data packet is truncated as it is put&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;in buffer memory&lt;/STRONG&gt;."&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm using a USB sniffer, and the packet doesn't look too big.&amp;nbsp; Hmmm.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;DMAERR bit appears to be a red herring.&amp;nbsp; It's set all the time regardless of failure.&amp;nbsp; It also is not OR'd into the&lt;/P&gt;&lt;P&gt;ISTAT ERROR bit BTW&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;found the problem.&amp;nbsp; Programmer error (whew).&amp;nbsp; I was making a call to&amp;nbsp;&amp;nbsp;&amp;nbsp; (void)USB1_DeviceRecvData(SavedMyUsbPtr-&amp;gt;UsbPtr,(LDD_USB_Device_TTD *)&amp;amp;DataTD); when I didn't have to.&amp;nbsp; I had already made the call when the USB command was issued.&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt;"&gt; &lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 11 Jun 2014 17:21:16 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Processor-Expert-Software/Usb-transactions-overwritten-or-missing/m-p/317379#M2405</guid>
      <dc:creator>marcbunyard</dc:creator>
      <dc:date>2014-06-11T17:21:16Z</dc:date>
    </item>
  </channel>
</rss>

