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.
1 | dieptsiz1.d32 = USB.INEP_REGS[1]->DIEPTSIZ;
|
2 | dieptsiz1.b.xfrsiz = 60;
|
3 | dieptsiz1.b.pktcnt = 1;
|
4 | USB.INEP_REGS[1]->DIEPTSIZ = dieptsiz1.d32;
|
5 | USB.INEP_REGS[1]->DIEPCTL |= DIEPCTLx_EPENA|DIEPCTLx_CNAK;
|
6 | for (uint32_t i = 0; i < 15; i++){
|
7 | *(USB).DFIFO[1]=USB_buffer[i];
|
8 | }
|
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.
1 | 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(