www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC1788 USB Host


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: MikeF (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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);

Autor: Wolfgang Mües (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: MikeF (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: Martin Thomas (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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_pr...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net