Forum: Mikrocontroller und Digitale Elektronik LPC1788 USB Host


von MikeF (Gast)


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);

von Wolfgang Mües (Gast)


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

von MikeF (Gast)


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

von Martin Thomas (Gast)


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_projects/arm_memcards/index.html#chanfat_lpc_cm3

von Laurian (Gast)


Lesenswert?

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?

von Laurian (Gast)


Lesenswert?

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?

von Martin M. (capiman)


Lesenswert?

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
Noch kein Account? Hier anmelden.