www.mikrocontroller.net

Forum: Compiler & IDEs USB Endpoint-Interrupt Problem


Autor: Frank S. (mcufan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo forum,
nach dem Initialisieren von USb hab enumeration angefangen. Nach dem
General-Interrupt läuft Endpoint-Interrupt nicht . Ich hab schon am Ende
von ISR(SB_GEN_vect)
UEIENX = (1<<RXSTPE)|(1<<RXOUTE)
gesetzt.
Woran liegt es?
vielen Dank!

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha, warte, ich muss meine glaskugel erst fragen, was du für einen 
controller hast...

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... wrote:
> aha, warte, ich muss meine glaskugel erst fragen, was du für einen
> controller hast...

Scheinbar garkeinen µC, sondern einen PC:
Beitrag "USB Endpoint-Interrupt funktioniert nicht"

SCNR.

Grobe Vermutung: Irgendein Atmel AVR mit USB?

Autor: Frank S. (mcufan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, der Controller ist AT90usb1287.
Ernst hat recht :)

Autor: at90usb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lese doch bitte usb2.0 spec. chapter 9 und Atmels doku zu at90usb1278 
Seiten 246-289. Du bekommst eine Erleuchtung.

Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur so als Hinweis, mit LUFA gibt es für die AT90USB* eine sehr gute 
library, die den Umgang mit USB deutlich vereinfacht.

http://www.fourwalledcubicle.com/LUFA.php

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank S. wrote:

> Woran liegt es?

Daran, dass wir gerade mal eine Zeile Code von dir gesehen haben,
das Ganze aber ein verdammt komplexes Gebilde ist.  Been there,
done that.  Meine Version kannst du auf 1400 Zeilen Quellcode in
µracoli nachlesen.  Im Gegensatz zu den eierlegenden Wollmilchsäuen
wie LUFA oder dem Atmel-Code habe ich dort eine reine CDC-Implemen-
tierung gebaut, die nicht über 10 verschiedene Makro-Abstraktions-
Ebenen läuft.  Das sollte dem, was du möglicherweise hier vor hast,
nicht so sehr fern sei -- wobei du dich ja neblig-trüb bedeckt
hälst, was für eine Art USB-Gerät du da gerade aufbauen willst.

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
könnte irgendwer bitte die letzte lufa hochladen, da die seite gerade 
down ist

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bitte sorry

Autor: Frank S. (mcufan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, sorry so lange keine Rückmeldung.
Ich hab das code geändert.
Meine usb-initialisierung:
void USB_Init()
{
  uchar i;
//VID / PID: 0x03EB / 0x2FFB

   //reset usb
   USBCON=(1<<FRZCLK);
   USBCON &=~_BV(USBE);
   UDCON = (1<<DETACH);
   OTGIEN=0;
   UDIEN=0;
   UHIEN=0;
   UEIENX=0;
   UPIENX=0;

   for (i=0;i<8;i++)
   {
     UENUM=i;
     UEINTX=0x00;
     UECONX=0x00;
   UECFG1X=0x00;
   }

   UHWCON=(1<<UIMOD)|(1<<UVREGE);  //enable the usb device mode and 
enable pad regulator
   USBCON &= ~_BV(HOST); //device mode
 PLLCSR=0x14; // external XTAL required for usb operation:16M,
  PLLCSR=0x16;  //enable PLL
  while(!(PLLCSR & (1<<PLOCK)));

   USBCON = (1<<USBE)|(1<<FRZCLK)|(1<<OTGPADE);

    USBCON &= ~_BV(FRZCLK);
    UDCON&=~_BV(LSM);  //select full speed mode

   USBCON |= _BV(VBUSTE);
   UDCON &= ~_BV(DETACH);  //reconnect the device
    UDIEN=(1<<EORSTE)|(1<<WAKEUPE)|(1<<SOFE)|(1<<SUSPE)|(1<<EORSME);
 sei();
  }

Mein Interrupt Code:
ISR(USB_GEN_vect)
{
  uchar i, EP_Num;

 cli();

 //EP_Num = UENUM;

 if (UDINT & (1<<SUSPI))  //suspend
 {

   UDIEN |= _BV(WAKEUPE);
   UDINT &= ~_BV(WAKEUPI);

   USBCON |= (1<<FRZCLK);
   PLLCSR &= ~_BV(PLLE);
   UDINT &= ~_BV(SUSPI);
   UDINT &= ~_BV(SUSPE);
 }

 if (UDINT & (1<<EORSMI))   //resume
 {

   UDIEN &= ~_BV(WAKEUPE);
   UDINT &= ~_BV(EORSMI);
   UDIEN &= ~_BV(EORSME);

 }

 if (UDINT & (1<<WAKEUPI))   //wakeup
 {
    UDINT &= ~_BV(WAKEUPI);
    UDIEN &= ~_BV(WAKEUPE);

   PLLCSR |= (1<<PLLE);
   PLLCSR = (1<<PLLP2)|(1<<PLLP0);
   PLLCSR &= ~_BV(PLLP1);
   while(!(PLLCSR & (1<<PLOCK)));
    USBCON &= ~_BV(FRZCLK);

 }

 if (UDINT & (1<<EORSTI))   //end of reset interrupt
 {

   UDINT &= ~_BV(EORSTI); //delete INT flag
   USBCON &= ~_BV(FRZCLK);
   USBCON |= _BV(USBE);
//configuration ep0
  UENUM = 0x00;   //select endpoint 0
  UECONX &= ~_BV(EPEN);
  UECONX |= (1<<EPEN);  //enable endpoint
  UECFG0X=0x00; //control Endpoint, out.
  UECFG1X=0x30; //64 bytes, one bank
  UECFG1X |= _BV(ALLOC);//allocate the endpoint memory

  while(!(UESTA0X & (1<<CFGOK)));   //until the config is ok

 //reset all the endpoints
  UERST |= (1<<UENUM);
  UERST &= ~_BV(UENUM);

  UEIENX = (1<<RXSTPE)|(1<<RXOUTE)|(1<<TXINE);  //enable received setup 
int, enable received out data int

  }
}

In main() hab ich eine Funktion usb_poll() geschrieben:
usb_poll()
{
UENUM = 0;
//sei();
  if (UEINTX & (1<<RXSTPI))  //check if a new setup packet is received
  {}
}

Jetzt ist das Problem: RXSTPI nicht gleich 1! Fuse habe ich auch richtig 
eingestellt. Weiß jemand wieso? Bitte mir einen Vorschlag geben. Danke

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.