<?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のトピックRe: LPC43XX USB HOST Mass storage class - drive fails the second time it is plugged in</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC43XX-USB-HOST-Mass-storage-class-drive-fails-the-second-time/m-p/578486#M19833</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Nataraj,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Your workaround is correct, that way the &lt;SPAN&gt;Stat variable is set back to STA_NOINT each time the device is unattached.&lt;/SPAN&gt;&lt;SPAN&gt; The problem is that the&lt;/SPAN&gt; USB Mass storage Host example was developed to read the files from USB mass storage device only the first time it is connected to the USB host port and then print the results to the UART console, it was not tested in the scenario when this is done multiple times.&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Hope it helps!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards,&lt;BR /&gt;Carlos Mendoza&lt;BR /&gt;Technical Support Engineer&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 05 Oct 2016 00:41:15 GMT</pubDate>
    <dc:creator>Carlos_Mendoza</dc:creator>
    <dc:date>2016-10-05T00:41:15Z</dc:date>
    <item>
      <title>LPC43XX USB HOST Mass storage class - drive fails the second time it is plugged in</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC43XX-USB-HOST-Mass-storage-class-drive-fails-the-second-time/m-p/578482#M19829</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by iemc on Thu Oct 15 17:59:51 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Chip: LPC4357 (1MB internal flash)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Manual: UM10503.pdf Rev. 1.9 — 18 February 2015&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPCOpen: lpcopen_2_16_lpcxpresso_nxp_lpcxpresso_4337.zip&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Using the LPCUSBlib_MassStorageHost example code.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In release code I want the software to detect a drive being plugged in to the USB Host port which can happen multiple times. I have discovered two problems using the mass storage example code when I try to do this.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The first problem I have been able to work around, which I will explain below. The second problem I haven't been able to find a fix for. Please note that the example code works perfectly the first time a thumb drive is plugged in. It only fails when the drive is removed and plugged in again.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Is it expected to use the LPCOpen code for production software as is? I see this comment in the source code "Software that is described herein is for illustrative purposes only". Should I be looking for a commercial USB library?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is how I modified the LPCUSBlib_MassStorageHost example code.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;When the event function EVENT_USB_Host_DeviceAttached is called I set a flag for the main loop to run the file test. The idea is to run the test each time a USB thumb drive is plugged in.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;File: LPCUSBlib_MassStorageHost\example\src\MassStorageHost.c&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;bool&amp;nbsp;&amp;nbsp;&amp;nbsp; DoTestUSBHost; /* flag set by attached event to trigger test code */

int main(void)
{
&amp;nbsp; SetupHardware();

&amp;nbsp; while (1)
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (DoTestUSBHost)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DEBUGOUT("Mass Storage Host Demo running.\r\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_ReadWriteFile();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DEBUGOUT("Example completed.\r\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DoTestUSBHost = false;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp; }
}

void EVENT_USB_Host_DeviceAttached(const uint8_t corenum)
{
&amp;nbsp; DEBUGOUT(("Device Attached on port %d\r\n"), corenum);
&amp;nbsp; DoTestUSBHost = true;
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;When I run this code it succeeds the first time I plug in a thumb drive. When I remove the drive and plug it in a second time I get the following error.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Error reading device block.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Which is in LPCUSBlib_MassStorageHost\example\src\MassStorageHost.c in this code.&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;/* Read sectors */
int FSUSB_DiskReadSectors(DISK_HANDLE_T *hDisk, void *buff, uint32_t secStart, uint32_t numSec)
{
&amp;nbsp; if (MS_Host_ReadDeviceBlocks(hDisk, 0, secStart, numSec, DiskCapacity.BlockSize, buff)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; DEBUGOUT("Error reading device block.\r\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_Host_SetDeviceConfiguration(FlashDisk_MS_Interface.Config.PortNumber, 0);
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;
&amp;nbsp; }
&amp;nbsp; return 1;
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I traced this problem to fatfs\src\fs_usb.c&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;/* Disk Status */
static volatile DSTATUS Stat = STA_NOINIT;

/* Initialize Disk Drive */
DSTATUS disk_initialize(BYTE drv)
{
&amp;nbsp; if (drv) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; return STA_NOINIT;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Supports only single drive */
&amp;nbsp; }
&amp;nbsp; /*&amp;nbsp; if (Stat &amp;amp; STA_NODISK) return Stat; *//* No card in the socket */

&amp;nbsp; if (Stat != STA_NOINIT) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; return Stat;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* card is already enumerated */

&amp;nbsp; }

&amp;nbsp; #if !_FS_READONLY
&amp;nbsp; FSUSB_InitRealTimeClock();
&amp;nbsp; #endif

&amp;nbsp; /* Initialize the Card Data Strucutre */
&amp;nbsp; hDisk = FSUSB_DiskInit();

&amp;nbsp; /* Reset */
&amp;nbsp; Stat = STA_NOINIT;

&amp;nbsp; FSUSB_DiskInsertWait(hDisk); /* Wait for card to be inserted */

&amp;nbsp; /* Enumerate the card once detected. Note this function may block for a little while. */
&amp;nbsp; if (!FSUSB_DiskAcquire(hDisk)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; DEBUGOUT("Disk Enumeration failed...\r\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; return Stat;
&amp;nbsp; }

&amp;nbsp; Stat &amp;amp;= ~STA_NOINIT;
&amp;nbsp; return Stat;

}&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 Stat variable is initialized to STA_NOINIT. The first time disk_initialize() is called it clears the STA_NOINIT bit before returning.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So the when the drive is plugged in the second time and disk_initialize() is called again it returns at this statement.&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; if (Stat != STA_NOINIT) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; return Stat;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* card is already enumerated */
&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 code after that is therefore not called and the USB does not enumerate the thumb drive properly. The Stat variable is never set back to STA_NOINIT.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;To work around this I added this function to MassStorageHost.c to do the necessary initialization that disk_initialize() failed to do.&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;bool USBHostWaitForReady(void)
{
&amp;nbsp; FSUSB_DiskInsertWait(&amp;amp;FlashDisk_MS_Interface);
&amp;nbsp; return (USB_HostState[FlashDisk_MS_Interface.Config.PortNumber] == HOST_STATE_Configured);
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I then call this new function in the function USB_ReadWriteFile just before the call to f_mount().&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;/* Function to do the read/write to USB Disk */
static void USB_ReadWriteFile(void)
{
...snip...

&amp;nbsp; if (!USBHostWaitForReady()) /* FIX for disk_initialize(): STA_NOINIT is never reset! */
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; DEBUGOUT("\rUSBHostWaitForReady failed");
&amp;nbsp;&amp;nbsp;&amp;nbsp; return;
&amp;nbsp; }

&amp;nbsp; f_mount(0, &amp;amp;fatFS);&amp;nbsp;&amp;nbsp; /* Register volume work area (never fails) */
...&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;With this change the drive is enumerated correctly the second time and the test succeeds.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;But now another problem happens. When the test finished I see a spurious unattach, attach event. The test tried to run again and hangs. My debug log look like this.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;EVENT_USB_Host_DeviceAttached&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;TestUSBHost started&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;FSUSB_DiskInsertWait begin&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Total LUNs: 1 - Using first LUN in device.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Mass Storage Device Enumerated.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;FSUSB_DiskInsertWait end&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Create a new file (hello.txt).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Write a text data. (Hello world!)14 bytes written.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Close the file.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Opened file HELLO.TXT from USB Disk. Printing contents...&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Hello world!&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Close the file.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Deleted HELLO.TXT from USB Disk.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Test completed.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Example completed.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;EVENT_USB_Host_DeviceUnattached&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;EVENT_USB_Host_DeviceAttached&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;TestUSBHost started&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;FSUSB_DiskInsertWait begin&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Total LUNs: 1 - Using first LUN in device.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Mass Storage Device Enumerated.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;FSUSB_DiskInsertWait end&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Create a new file (hello.txt).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(hangs)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;At this point I am stuck.&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:19:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC43XX-USB-HOST-Mass-storage-class-drive-fails-the-second-time/m-p/578482#M19829</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:19:29Z</dc:date>
    </item>
    <item>
      <title>Re: LPC43XX USB HOST Mass storage class - drive fails the second time it is plugged in</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC43XX-USB-HOST-Mass-storage-class-drive-fails-the-second-time/m-p/578483#M19830</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by ehughes on Mon Oct 26 17:51:12 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I have successfully gotten this code to work.&amp;nbsp; Here are some tips&amp;nbsp; (this also applies to SD cards)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;You really need to implement a state machine in a continuously running process that a manages the state of the drive and returning proper return codes for the functions in the fat_fs disk io layer.&amp;nbsp;&amp;nbsp; Something like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; switch(USB_HostEnumState)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&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; case USB_HOST_STATE_DEVICE_INIT:&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;&amp;nbsp;&amp;nbsp; USB_Stat = STA_NODISK | STA_NOINIT;&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;&amp;nbsp;&amp;nbsp; hDisk = FSUSB_DiskInit();&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;&amp;nbsp;&amp;nbsp; USB_HostEnumState =&amp;nbsp; USB_HOST_STATE_WAIT_FOR_DEVICE_ATTACH;&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;&amp;nbsp;&amp;nbsp; break;&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; case&amp;nbsp; USB_HOST_STATE_WAIT_FOR_DEVICE_ATTACH:&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;&amp;nbsp;&amp;nbsp; USB_Stat = STA_NOINIT;&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;&amp;nbsp;&amp;nbsp; if (USB_HostState[hDisk-&amp;gt;Config.PortNumber] != HOST_STATE_Configured)&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; {&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; MS_Host_USBTask(hDisk);&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; USB_USBTask(hDisk-&amp;gt;Config.PortNumber, USB_MODE_Host);&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; }&lt;/SPAN&gt;&lt;BR /&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;&amp;nbsp;&amp;nbsp; break;&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; case USB_HOST_STATE_DEVICE_ATTACHED_ENUMERATING:&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;&amp;nbsp;&amp;nbsp; USB_Stat = STA_NOINIT;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&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;&amp;nbsp;&amp;nbsp; break;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case USB_HOST_STATE_DEVICE_ATTACHED_GET_DISK_CAPACITY:&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;&amp;nbsp;&amp;nbsp; USB_Stat = STA_NOINIT;&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;&amp;nbsp;&amp;nbsp; if (FSUSB_GetDeviceCapacity(hDisk) == 0)&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; {&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; DEBUGOUT("Error retrieving device capacity.\r\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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_Host_SetDeviceConfiguration(hDisk-&amp;gt;Config.PortNumber, 0);&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; USB_HostEnumState = USB_HOST_STATE_DEVICE_ENUMERATION_ERROR;&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; }&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; else&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; {&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; USB_HostEnumState = USB_HOST_STATE_DEVICE_ATTACHED_READY;&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; DEBUGOUT(("%lu blocks of %lu bytes on USB drive\r\n"), FSUSB_DiskGetSectorCnt(hDisk), FSUSB_DiskGetSectorSz(hDisk));&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; }&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;&amp;nbsp;&amp;nbsp; break;&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; case USB_HOST_STATE_DEVICE_ATTACHED_READY:&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;&amp;nbsp;&amp;nbsp; USB_Stat = 0;&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;&amp;nbsp;&amp;nbsp; break;&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; case USB_HOST_STATE_DEVICE_ENUMERATION_ERROR:&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;&amp;nbsp;&amp;nbsp; USB_Stat =&amp;nbsp; STA_NOINIT;&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;&amp;nbsp;&amp;nbsp; break;&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; case USB_HOST_STATE_HOST_ERROR:&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; USB_Stat =&amp;nbsp; STA_NOINIT;&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; break;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I found that this cannot be done reliably unless you you continously like fat_fs to the actual state of the drive.&amp;nbsp;&amp;nbsp;&amp;nbsp; I can't see where you reset the USB Port after spurious disconnection (FSUSB_DiskInit())&amp;nbsp;&amp;nbsp; Look into that...&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:19:30 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC43XX-USB-HOST-Mass-storage-class-drive-fails-the-second-time/m-p/578483#M19830</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:19:30Z</dc:date>
    </item>
    <item>
      <title>Re: LPC43XX USB HOST Mass storage class - drive fails the second time it is plugged in</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC43XX-USB-HOST-Mass-storage-class-drive-fails-the-second-time/m-p/578484#M19831</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by iemc on Tue Oct 27 05:04:40 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks for the reply. I'll definitely try implementing a state machine as you suggest. It might be why I am seeing spurious disconnects.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Also, the FSUSB_DiskInit() goes to this code in MassStorageHost.c&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;/* Get the disk data structure */
DISK_HANDLE_T *FSUSB_DiskInit(void)
{
&amp;nbsp; return &amp;amp;FlashDisk_MS_Interface;
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Which is returning a pointer to this struct also in MassStorageHost.c&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;/** LPCUSBlib Mass Storage Class driver interface configuration and state information. This structure is
 *&amp;nbsp; passed to all Mass Storage Class driver functions, so that multiple instances of the same class
 *&amp;nbsp; within a device can be differentiated from one another.
 */
static USB_ClassInfo_MS_Host_t FlashDisk_MS_Interface = {
&amp;nbsp; .Config = {
&amp;nbsp;&amp;nbsp;&amp;nbsp; .DataINPipeNumber&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 1,
&amp;nbsp;&amp;nbsp;&amp;nbsp; .DataINPipeDoubleBank&amp;nbsp;&amp;nbsp; = false,

&amp;nbsp;&amp;nbsp;&amp;nbsp; .DataOUTPipeNumber&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2,
&amp;nbsp;&amp;nbsp;&amp;nbsp; .DataOUTPipeDoubleBank&amp;nbsp; = false,
&amp;nbsp;&amp;nbsp;&amp;nbsp; .PortNumber = 1,
&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;It is called by disk_initialize in fs_usb.c which has problems with drives being re-inserted (because the static Stat variable is never set back to STA_NOINT).&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:19:31 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC43XX-USB-HOST-Mass-storage-class-drive-fails-the-second-time/m-p/578484#M19831</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:19:31Z</dc:date>
    </item>
    <item>
      <title>Re: LPC43XX USB HOST Mass storage class - drive fails the second time it is plugged in</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC43XX-USB-HOST-Mass-storage-class-drive-fails-the-second-time/m-p/578485#M19832</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I am using #&lt;STRONG&gt;LPC1769&lt;/STRONG&gt;, I faced same problem.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have added following function to&lt;STRONG&gt; fs_usb.c&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;&lt;SPAN class="keyword token"&gt;void&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;diskDeinitialize&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Stat &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; STA_NOINIT&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I called &lt;STRONG&gt;diskDeinitialize&lt;/STRONG&gt; function in &lt;STRONG&gt;EVENT_USB_Host_DeviceUnattached&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;&lt;SPAN class="keyword token"&gt;void&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;EVENT_USB_Host_DeviceUnattached&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;const&lt;/SPAN&gt; uint8_t corenum&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="token function"&gt;DEBUGOUT&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="string token"&gt;"\r\nDevice Unattached on port %d\r\n"&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; corenum&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="token function"&gt;diskDeinitialize&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For me it's serves the purpose.&lt;/P&gt;&lt;P&gt;Is this the correct way to fix the problem ??&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 20 Sep 2016 04:43:40 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC43XX-USB-HOST-Mass-storage-class-drive-fails-the-second-time/m-p/578485#M19832</guid>
      <dc:creator>natarajbalasubr</dc:creator>
      <dc:date>2016-09-20T04:43:40Z</dc:date>
    </item>
    <item>
      <title>Re: LPC43XX USB HOST Mass storage class - drive fails the second time it is plugged in</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC43XX-USB-HOST-Mass-storage-class-drive-fails-the-second-time/m-p/578486#M19833</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Nataraj,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Your workaround is correct, that way the &lt;SPAN&gt;Stat variable is set back to STA_NOINT each time the device is unattached.&lt;/SPAN&gt;&lt;SPAN&gt; The problem is that the&lt;/SPAN&gt; USB Mass storage Host example was developed to read the files from USB mass storage device only the first time it is connected to the USB host port and then print the results to the UART console, it was not tested in the scenario when this is done multiple times.&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Hope it helps!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards,&lt;BR /&gt;Carlos Mendoza&lt;BR /&gt;Technical Support Engineer&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 05 Oct 2016 00:41:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC43XX-USB-HOST-Mass-storage-class-drive-fails-the-second-time/m-p/578486#M19833</guid>
      <dc:creator>Carlos_Mendoza</dc:creator>
      <dc:date>2016-10-05T00:41:15Z</dc:date>
    </item>
    <item>
      <title>Re: LPC43XX USB HOST Mass storage class - drive fails the second time it is plugged in</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC43XX-USB-HOST-Mass-storage-class-drive-fails-the-second-time/m-p/578487#M19834</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;SPAN class=""&gt;&lt;A _jive_internal="true" class="" data-content-finding="Community" data-userid="219774" data-username="Carlos_Mendoza" href="https://community.nxp.com/people/Carlos_Mendoza"&gt;Hi Carlos_Mendoza&lt;/A&gt;,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;Thanks for your response.&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 05 Oct 2016 04:23:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC43XX-USB-HOST-Mass-storage-class-drive-fails-the-second-time/m-p/578487#M19834</guid>
      <dc:creator>natarajbalasubr</dc:creator>
      <dc:date>2016-10-05T04:23:21Z</dc:date>
    </item>
  </channel>
</rss>

