mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32F407 Weitere IN Token am EP1


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: Tycho B. (asellus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe einen Virtual ComPort von STM realisiert, Anmelden am System 
funktioniert, jetzt gehe ich über, Daten hin und her zu schicken. Die 
erste Testidee war, nach einem Erhalt von 5 Zeichen im uC eine Antwort 
mit z.B. 36 Zeichen an den PC zu schicken.

Ich erhalte auch die Zeichen, dann initialisiere ich die Senderoutine 
mit:
dieptsiz1.d32 = USB.INEP_REGS[1]->DIEPTSIZ;
dieptsiz1.b.xfrsiz = 36;
dieptsiz1.b.pktcnt = 1;
USB.INEP_REGS[1]->DIEPTSIZ = dieptsiz1.d32;
USB.INEP_REGS[1]->DIEPCTL |= DIEPCTLx_EPENA|DIEPCTLx_CNAK;
for (uint32_t i = 0; i < 9; i++){
  *(USB).DFIFO[1]=USB_buffer[i];
}
Daten werden auch am PC empfangen und ein XFRC (transfer complete) am 
EP1 IN wird ausgelöst. Danach kommt aber ein weiterer IN token und ich 
bekomme ein ITTXFE (IN token received while Tx empty) interrupt.

Eigentlich ist doch dem Host durch vorherige Anweisung bekannt, dass ich 
nur 36 Bytes senden möchte, warum kommt da ein weiteres IN Token?

: Bearbeitet durch User
Autor: Tycho B. (asellus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bump?
Wirklich keiner?

Autor: Johnny B. (johnnyb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das macht doch alles die HAL für Dich und Du brauchst nur diese eine 
Funktion um was zu senden:
CDC_Transmit_FS(USB_buffer, USB_buffer_len);

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tycho B. schrieb:
> Eigentlich ist doch dem Host durch vorherige Anweisung bekannt, dass ich
> nur 36 Bytes senden möchte, warum kommt da ein weiteres IN Token?

Der Host sendet doch immer wieder "IN", bis Daten im Puffer sind. 
Solange keine Daten da sind, antwortet die Peripherie automatisch mit 
"NAK". Diese ankommenden "IN" sollten die Software aber normalerweise 
nicht interessieren. Den ITTXFE Interrupt kannst du daher komplett 
weglassen und abgeschaltet lassen.

Im Transfer Complete Interrupt kannst du zur Sicherheit wieder NAK 
aktivieren, aber das sollte eigentlich nicht nötig sein:
USB.INEP_REGS[1]->DIEPCTL |= USB_OTG_DIEPCTL_SNAK_Msk;

Autor: Tycho B. (asellus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin mir nicht sicher ob es so stimmt. Ich sende ja bei der 
Enumeration Deskriptoren an das System. Danach taucht dieses ITTXFE 
nicht auf. Ich dachte, wenn ich SNAK setze, dann sendet der uc nacks an 
den PC transparent ohne mich zu belästigen. Erst wenn ich mit
USB.INEP_REGS[1]->DIEPCTL |= DIEPCTLx_EPENA|DIEPCTLx_CNAK;
starte und etwas falsch konfiguriere oder sende, dann kommt ITTXFE und 
sagt mir, dass der Host noch Daten erwartet.

Autor: Tycho B. (asellus)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Johnny B. schrieb:
> Das macht doch alles die HAL für Dich und Du brauchst nur diese eine
> Funktion um was zu senden:
> CDC_Transmit_FS(USB_buffer, USB_buffer_len);

Ich programmiere bare metal.

Autor: Tycho B. (asellus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok...
Also: wenn der XFRC-Interrupt ausgelöst wird, dann muss
USB.INEP_REGS[1]->DIEPCTL |= DIEPCTLx_SNAK;
gesetzt werden.
Ich dachte das geschieht automatisch.

Autor: Niklas Gürtler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tycho B. schrieb:
> Ich dachte das geschieht automatisch.

Das muss automatisch passieren, sonst würde die Kommunikation abreißen 
wenn der Interrupt nicht extrem schnell kommt...

Tycho B. schrieb:
> Danach taucht dieses ITTXFE nicht auf.

Ja, weil der Host auf dem EP0 nicht kontinuierlich IN sendet.

Tycho B. schrieb:
> Ich dachte, wenn ich SNAK setze, dann sendet der uc nacks an den PC
> transparent ohne mich zu belästigen

Jo.

Vermutlich sendet der uC bei leerem FIFO automatisch immer NAK, aber 
wenn du das NAK Bit nicht gesetzt hast ("SNAK") kommt der ITTXFE 
Interrupt, den du aber eigentlich ignorieren kannst.

Autor: Tycho B. (asellus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, zu früh gefreut,
irgendwie funktioniert es 2-3-5 mal, dann kommt wieder ein ITTXFE.

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.