Hallo Freunde, Ich versuche am LPC1788 den USB Host am Port 2 zum laufen zu bekommen. Ich verwende einen externen 12MHz Quarz, PLL0 ist auf 120MHz eingestellt, damit der LPC1788 auf vollen Takt läuft. Für den USB HOST will ich den PLL1 verwenden damit ich die notwedigen 48MHz bekomme. Nur irgendwo ist da ein Hund drinnen, entweder bekomme ich fortlaufend einen NEED_CLOCK Interrupt, oder ich kann erkenne nicht, wenn ein USB Stick angeschlossen wird. Hat da einer eine Idee?? // Turn on USB PCONP_bit.PCUSB = 1; // Disable USB interrupts USBINTS_bit.EN_USB_INTS = 0; // Init USB engine clk freq - 48MHz // Set PLL settings für 192 MHz PLL1CFG_bit.PSEL = PLL1_MUL; // PLL Divisor (_ConfigHW) PLL1CFG_bit.MSEL = PLL1_DIV; // PLL Multiplikator (_ConfigHW) PLL1CON_bit.PLLE = 1; // PLL Enable PLL1FEED = 0xAA; PLL1FEED = 0x55; while(!PLL1STAT_bit.PLOCK); //Wait for PLL Lock PLL1CON = 0x03; //PLL Enable PLL1FEED = 0xAA; PLL1FEED = 0x55; USBCLKSEL_bit.USBSEL = 2; // PLL1 ist USB Clock USBCLKSEL_bit.USBDIV = 4; // 192MHz OTGCLKCTRL = 0x11; // Enable USB Host clock while((OTGCLKST & 0x01) == 0); //---------------------------------------------------------------------- --- // USB 1: Host // IOCON_P1_30 = IOCON(1, IO_MODE_UP, IO_HYS_ENABLE, 0, 0, 0, 0); // USB2: VBus IOCON_P0_12 = IOCON(1, IO_MODE_NONE, IO_HYS_DISABLE, 0, 0, 0, 0); // USB2: PPWR IOCON_P1_31 = IOCON(1, IO_MODE_NONE, IO_HYS_DISABLE, 0, 0, 0, 0); // USB2: On IOCON_P0_31 = IOCON(1, IO_MODE_NONE, IO_HYS_ENABLE, 0, 0, 0, 0); // USB2.D+ //---- Assign Core Buffer LibHost_InitED(&g_tHost.tCtrl); LibHost_InitED(&g_tHost.tBlkRx); LibHost_InitED(&g_tHost.tBlkTx); LibHost_InitTD(&g_tHost.tHead); LibHost_InitTD(&g_tHost.tTail); LibHost_InitHCCA(&g_tHost.tHCCA); Delay_uS(50000); HCCONTROL = 0; // HARDWARE RESET HCCONTROLHEADED = 0; // Initialize Control list head to Zero HCBULKHEADED = 0; // Initialize Bulk list head to Zero //---- SOFTWARE RESET HCCOMMANDSTATUS = OR_CMD_STATUS_HCR; HCFMINTERVAL = DEFAULT_FMINTERVAL; // Write Fm Interval and Largest Data Packet Counter //---- Put HC in operational state HCCONTROL = (HCCONTROL & (~OR_CONTROL_HCFS)) | OR_CONTROL_HC_OPER; HCRHSTATUS = OR_RH_STATUS_LPSC; // Set Global Power HCHCCA = (Int32U)&g_tHost.tHCCA; HCINTERRUPTSTATUS |= HCINTERRUPTSTATUS; //Clear Interrrupt Status //---- Enable interrupts HCINTERRUPTENABLE_bit.WDH = 1; HCINTERRUPTENABLE_bit.MIE = 1; HCINTERRUPTENABLE_bit.RHSC = 1; //Root Hub Status Change SysNVIC_IntEnable (NVIC_USB); SysNVIC_SetPriority (NVIC_USB, IRQPRIORITY_USB);
Schau mal ins User Manual: der erlaubte Takt fuer den PLL-Ausgang ist nur 160 MHz oder so. Also PLL1 auf 96 MHz schalten und USB-Clockteiler auf durch 2. Da haben sie im Manual noch den einen oder anderen Hänger... Gruß Wolfgang
Hallo Zusammen, Entschuldigt die späte Reaktion. Ich hab nun 96MHz und 192MHz probiert: PLL1CFG = (16-1); //PLL 192MHz (von 12MHz Quarz) PLL1CON_bit.PLLE = 1; //PLL Enable PLL1FEED = 0xAA; PLL1FEED = 0x55; while(!PLL1STAT_bit.PLOCK); //Wait for PLL Lock PLL1CON = 0x03; //PLL Enable PLL1FEED = 0xAA; PLL1FEED = 0x55; USBCLKSEL = 0x204; //PLL1 ist USB Clock, 192MHz OTGCLKCTRL = 0x1F; //Enable USB Host clock while((OTGCLKST & 0x0000001F) != 0x1F); OTGSTCTRL = 0; //---------------------- 96MHz PLL1CFG = (8-1); //PLL 96MHz (von 12MHz Quarz) PLL1CON_bit.PLLE = 1; //PLL Enable PLL1FEED = 0xAA; PLL1FEED = 0x55; while(!PLL1STAT_bit.PLOCK); //Wait for PLL Lock PLL1CON = 0x03; //PLL Enable PLL1FEED = 0xAA; PLL1FEED = 0x55; USBCLKSEL = 0x202; //PLL1 ist USB Clock, 96MHz OTGCLKCTRL = 0x1F; //Enable USB Host clock while((OTGCLKST & 0x0000001F) != 0x1F); OTGSTCTRL = 0; Funktioniert beides nicht wie erwartet. IOCON_P1_30 = 1; // USB2: VBus IOCON_P0_12 = 1; // USB2: PPWR, On IOCON_P1_31 = 1; // USB2: Fail IOCON_P0_31 = 1; // USB2.D+ USB2.D- hat kein IOCON, sollte also immer D- sein ?? Nach einem Reset bekomme ich 'meist' einen USB IRQ OCIC, egal ob ein USB Stick angeschlossen ist oder nicht. Danach nie mehr einen, egal ob ein Stick angeschlossen wird oder nicht. Hat da wer eine Idee ?? mfg Mike
Mglw. kann der Beispielquellcode von NXP und OnChip als Inspirationsquelle dienen: http://ics.nxp.com/support/software/usb.host.msc/ -> USBHostLite stack ported to the LPC1768... Habe diesen Code erfolgreich als Basis für die Einsteuerung eines USB-Speichersticks genutzt: http://siwawi.bauing.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html#chanfat_lpc_cm3
Hi This link it is invalid... http://siwawi.bauing.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html#chanfat_lpc_cm3 Can some one help me with a new working link?
This link it is invalid ... http://siwawi.bauing.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html#chanfat_lpc_cm3 Can some one help me with a new working link?
The original messages are over 9 years old. It is no surprise that a link gets broken over such a long time. Perhaps have a look at http://elm-chan.org/fsw/ff/00index_e.html or try your favorite search engine to locate yourself what you are looking for. E.g. "LPC1788 USB fat fs" (or similar) or e.g. "chanfat_lpc_cm3" Good luck! PS: And as guest you are not even receiving my helpful hint. So useless...
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.