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


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


Bewertung
0 lesenswert
nicht lesenswert
Bump?
Wirklich keiner?

von Johnny B. (johnnyb)


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

von Niklas G. (erlkoenig) Benutzerseite


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;

von Tycho B. (asellus)


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.

von Tycho B. (asellus)


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.

von Tycho B. (asellus)


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.

von Niklas Gürtler (Gast)


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.

von Tycho B. (asellus)


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

von Tycho B. (asellus)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Um die Funktionalität zu testen habe ich ein kleines Beispielprogramm 
geschrieben: wenn der uC 5 Zeichen erhält, dann sendet er 60 zurück an 
den PC.
    dieptsiz1.d32 = USB.INEP_REGS[1]->DIEPTSIZ;
    dieptsiz1.b.xfrsiz = 60;
    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 < 15; i++){
      *(USB).DFIFO[1]=USB_buffer[i];
    }

Wenn diese IN Übertragung durch ist, also 60 Zeichen an den PC gesendet 
wurden, dann wird das DIEPINT_XFRC (IN Transfer completed interrupt) 
ausgelöst und in dieser ISR SNAK gesetzt, damit ITTXFE(IN token received 
when TxFIFO is empty) beim nächsten IN Token nicht aktiv wird.
USB.INEP_REGS[1]->DIEPCTL |= DIEPCTLx_SNAK;
Das funktioniert auch mehrere Male, nur irgendwann mal antwortet uC 
nicht mit 60 Zeichen, sondern  mit Status 0xC0000004 - STALL_PID.

Und das ist für mich nicht verständlich - warum plötzlich STALL wenn der 
Transfer davor 10 mal funktioniert hat (siehe PNG)?

PS.: Wenn ich kontinuierlich Daten sende und nicht nur 60 Zeichen, dann 
funktioniert es(

: Bearbeitet durch User

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.