XMEGA USBsmart zu USBport

  • 1
  • 2
  • 3
  • 4
  • 5
  • Page 1 of 5
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

XMEGA USBsmart zu USBport

 · 
Posted: 11.06.2019 - 19:17  ·  #1
Hallo Leute,

aus Gründen der Geschwindigkeit will ich in meinem aktuellen Projekt den USBsmart gegen den großen USBport umstellen.

Bei einigen Punkte habe ich aber Probleme mit dem Verständnis, bzw. finde die richtigen Infos nicht in dem Demos und dem Handbuch.

1. Verstehe ich das richtig, das ich bei dem USBPort kein TASK ControlJob mehr brauche, um die Verbindung zum PC aufrecht zu halten?

2. Bei dem Demo USBport wird komischerweise aber ein TaskStack und Frame angelegt warum ist das nötig?
Code
  // optional 
  Scheduler               = iData; 
  TaskStack               = $80, iData; 
  TaskFrame               = $100; 
  IDATA1                  = $5FC0; 

Wird im Treiber evtl. doch ein Task angelegt?

3. Der CallBack Eintrag
Code
  xUSB_UserVendorRequest(@xUSB_VendorRequest); // optional, if you need it!

Ist ja eigentlich für die EP0, Im Demo steht dieser ist optional, sprich ich könnte ihn verwenden, aber das muss ich nicht! Richtig?

4. Angenommen ich möchte NUR über die Pipe 1 / 81 reden, dann könnte ich mir den Kram für die EP0 ersparen? Wie bekommt dann der Controller die Infos was er senden soll? Aktuell mache ich das über die EP0 im USBsmart.

5. Welches Testprogramm (Delphi oder EXE) funktionier mit dem XMega_USBport zum austesten? Ich habe hier keines in Funktion gefunden, das zu dem DEMO passt.

6. Muss ich den Treiber auf allen PCs entfernen und gegen einen neuen austauschen? Im Moment scheint bei den PIPEs 64 Byte zu stehen, hier möchte ich aber gerne 1024 oder besser 2048 stehen haben.

Thorsten
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 11.06.2019 - 20:28  ·  #2
Hi Thorsten,

1. Der Treiber läuft im Interrupt und braucht keinen Task -
2. Leichen Zeilen ?
3. Ist nicht nötig aber für einen HW Reset usw evtl Sinnvoll
4. Die beiden Pipes langen. Protokoll drüber legen !
5. Da ist ein universelles Delphi Demo dabei. Mal suchen ..
6. Die Xmega unterstützen Multipacket - das läuft alles im Hintergrund automatisch -Steht im Xmega Manual

miparo
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 11.06.2019 - 20:55  ·  #3
Hallo miparo,

meine ganze USB Routine läuft in einem Process, kann den Process mit WaitPipe() schlafen legen um die Rechenzeit dann für was anderes frei zu haben?

Thorsten
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 11.06.2019 - 21:10  ·  #4
Deine USB Routine hat ja nichts direkt mit dem USB Treiber zu tun, da kann der schlafen gehen.
Nur der xUSB_UserVendorRequest MUSS bedient werden wenn assigned.

Du musst halt dir dann ein Bool USBdataAvail erzeugen, was man evtl fürs WaitPipe benutzen kann ?

Der Treiber informiert dich ja über deine verlinkte RX_Receive Funktion - läuft alles im INT:

Code

....
procedure USB_Rx_Receive(Status : tUSBep_Status; nb_transfered : word);
begin
  if Status = USBEP_TRANSFER_OK then
    usbRXCount:= nb_transfered;
    USBdataAvail:= true;
  else
    usbRXCount:= 0;
    USBdataAvail:= true;
  endif;
end;
....



 // main  
  xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);     // Link RX Event
  ...
  repeat
    if USBdataAvail then
      ......



oder oder , das hängt immer von der Anwendung ab.

miparo
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 11.06.2019 - 21:38  ·  #5
ABER deine USB_Rx_Receive läuft halt im Main, da die aus dem USB Interrupt aufgerufen wird !!

Was du danach mit machst bleibt dir überlassen, der USB nimmt nur solange Pakete an, wie sie in deinen RXbuffer passen und du xUSB_RXsetBuffer neu aufgerufen hast.
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 12.06.2019 - 13:05  ·  #6
Quote by miparo

ABER deine USB_Rx_Receive läuft halt im Main, da die aus dem USB Interrupt aufgerufen wird !!

Was du danach mit machst bleibt dir überlassen, der USB nimmt nur solange Pakete an, wie sie in deinen RXbuffer passen und du xUSB_RXsetBuffer neu aufgerufen hast.


Hallo miparo,

kannst Du mir noch ein paar Infos zu dem Code/Funktion geben:
Code
xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);   // Link RX Event


Im Handbuch finde ich dazu leider nichts, keine der im Demo gezeigten Funktionen sind in meinem ProfiDriver-Handbuch zu finden, was sind das für Parameter.

1: ??? (Ist das evtl. die Pipe ?
@USB_Rx_Receive: Dies ist der Pointer zu den Empfangsfunktion, wann wird dieser aufgerufen, erst wenn der Buffer voll ist? Oder beim Empfang von allen Daten?
RxBuf: Empfangsspeicher
512: Anzahl der max. Daten?

Muss ich das denn jedesmal beim gewünschten Empfang anlegen?

Eigentlich würde doch einmal nach dem "xUSB_Attach" und "UsbDriverConnect" ausreichen oder?

In der Demo:
Code
    xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);   // Link RX Event
    while UsbDriverConnect {and USBvBUS.USBvBUSpin}  do
      USBMainLoop;
    endwhile;
 


Bei der Funktion usbRxBuf wird es aber erneut gemacht, mir ist der angedachte Ablauf noch nicht so klar.
Code
function usbRxBuf(p: pointer; c: word): boolean;
var
  i   : word;
begin
  if HostFailed or (not UsbDriverConnect) then
    c:= 0;
    return(false);
  endif;

  SetSysTimer(TimerU, 2000 div SysTick);
  repeat
  until isSysTimerZero(TimerU) or USBdataAvail;
  if c > usbRXCount then
    c:= usbRXCount;
  endif;

  _usbRxTimeOut:= isSysTimerZero(TimerU);

  _Rx:= usbRXCount;
  CopyBlock(@RXBuf[2], p, c); // the first two bytes define the data length
  USBdataAvail:= false;       //
  usbRXCount:= 0;
  xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXBuf, 512);
  return(_Rx > 0);
end;


@miparo;
Vielleicht hast Du noch eine Idee was hier mein Denkfehler ist, ich muss das ganze frei von den LOOPs machen, damit dies nicht meine anderen Prozesse blockt. Wenn ich es als LOOP lasse bleibt das ganze Connected. Aber so blockiere ich meine Steuerung dann.

Code
{--------------------------------------------------------------}
Process USB_RxTx (256, 512 : iData ); {Stacksize = 256 bytes, Framesize = 512bytes}
begin
 if not FirstStartUSB then   // Beim ersten Start des Process Init-Aufgaben erledigen!
  xUSB_UserVendorRequest(@xUSB_VendorRequest); // optional, if you need it!
   xUSB_Enable;        // Attach USB and connect RxBuf for FIRST RX INT
    FirstStartUSB:= true;
       DebugOut('USB: First Start');
  endif;

      xUSB_Attach;

      mDelay(200); // ohne das kommt kein UsbDriverConnect  Warum???? 
   if UsbDriverConnect then   // Ist das USB Device angeschlossem?
       DebugOut('USB: Connect');

                                       // wait for Windows Setconfiguration
    xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);   // Link RX Event

      USBMainLoop;

   
   else
    // Kein USB angeschlossen, Rechenzeit freigeben
     DebugOut('USB: Disconnect');

     HostFailed:= true;
   //   xUSB_Detach;
       Schedule;       // Rechenzeit freigeben
   endif;

end; // Ende der Funktion


Hier mein USBMainLoop
Code
//---------------------------------------
procedure USBMainLoop;      // Hauptroutine USB COM
var
  ch   : char;
begin
//  repeat
    if USBdataAvail then
            DebugOut('USB: USBdataAvail');

      HostCmd:= RxCmd;
      ch:= HostCmd.cmd;
      case HostCmd.typ of
        CTRLcmd :
                 // here your comands from PC are received
                  if ch = 'S' then
                    DebugOut( 'Senddata');
                    mDelay(50);
                    SendFiledata();
                  endif;
                 // ....
                |
      else
        DebugOut('Unknown cmd');
        TXchar('?');
      endcase;
     else
            DebugOut('USB: NoUSBdataAvail');
    endif;
    
//  until (not UsbDriverConnect) {or (not USBvBUS.USBvBUSpin)} ;
end USBMainLoop;


Wenn ich das so mache kommt beim einstecken USB: Connect, da noch keine Daten vorhanden sind kommt dann "USB: NoUSBdataAvail". Und dann kommt er wieder in das "USB: Disconnect"
Müsste er nicht trotzdem die Verbindung halten, so lange er mit dem PC verbunden ist?
Sprich "UsbDriverConnect" sollte doch die ganze Zeit TRUE bleiben. Oder habe ich hier einen Denkfehler für den Ablauf?

Thorsten
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 12.06.2019 - 15:35  ·  #7
Hi Thorsten,
der "große" USB wird tatsächlich nicht im Manual erwähnt.

Code

xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);   // Link RX Event

//  RX Pipe NUmmer,  prt Callback RX Funktion , ptr RX Buffer und RX Buffer größe

Das ist mehr ein Job für den USB Treiber.

Der USB Int ruft beim Empfang von Daten dein USB_Rx_Receive auf, wo man nur Flags bearbeiten sollte, da das Teil ja aus dem Interrupt kommt.
Der USB Treiber nimmt aber keiner weiteren Pakete an bevor du diesen Job nicht bearbeitet hast.
Also im usbRxBuf alles abholen bzw. bearbeiten und einen neuen Job anlegen mit xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);

Wenn du jetzt von der PC Seite ein bulkl_write(Datan, 1024, TimeOut) machst, da bekommst du halt zwei Ints mit je 512 Bytes an Daten.
Das Timeout nicht zu kurz machen, da dein Xmega kein I7 Core ist.

Das ganze läuft so mit 1MB/s, je nach Puffergröße.

Ich würde mal im Demo testen und nicht in deiner 300kB App dann sieht man was wo passiert.

Eine Win App gibt es auch unter ..AVRcoIDEUSBtester dazu.

miparo
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 12.06.2019 - 19:17  ·  #8
Quote by miparo

...
Das ist mehr ein Job für den USB Treiber.
...
Wenn du jetzt von der PC Seite ein bulkl_write(Datan, 1024, TimeOut) machst, da bekommst du halt zwei Ints mit je 512 Bytes an Daten.
...
Ich würde mal im Demo testen und nicht in deiner 300kB App dann sieht man was wo passiert.

Eine Win App gibt es auch unter ..AVRcoIDEUSBtester dazu.

miparo


Hallo miparo,

was ich nicht ganz verstehe. Das "UsbDriverConnect" wann wird dies wieder FALSE, beim abziehen der PC-Verbindung oder wenn der HOST-PC die Daten gesendet hat?

Die Demo bekomme ich leider nicht sauber zusammen mit dem xUSBPort ans laufen, er kann zwar EP0 empfangen bekommt auch oft mal ein "unknown CMD", aber ich erhalte im Delphi Demo sehr oft die Fehlermeldung das er versucht auf PID $0 und VID $0 zu schreiben bzw. zu lesen.

Zum Verständnis:

1. für den EP0 richte ich den "xUSB_UserVendorRequest()" ein, wenn gewünscht.
2. Beim Start vom XMEGA starte ich "xUSB_Enable", hiermit aktiviere ich den USB-Treiber im XMEGA und den CallBack "xUSB_UserVendorRequest"
3. Mit dem xUSB_Attach, Connecte ich den XMEGA mit dem PC (DingDong am PC)
4. Was passiert mit dem "UsbDriverConnect", wann wird dieser TRUE?
5. Wenn "UsbDriverConnect" true ist erzeuge ich einen Receive-Job mit "xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);"
6. im USB-Rx_Receive prüfe ich kurz ob Daten vorhanden sind und wieviele. Sind Daten vorhanden setze ich das "USBdataAvail" auf TRUE
7. In meinen anderen Process prüfe ich auf "USBdataAvail" wenn true, dann verarbeite die Daten aus dem RxBuff und setzte am Ende das "USBdataAvail" False, "usbRXCount:= 0;" und starte einen erneuten JOB. Bei False beende ich den Process sofort und gebe die Rechenleistung mit "Schedule" frei.

Der Punkt 4 ist für mich besonderst wichtig, im Moment verstehe ich nicht wann dieser TRUE bzw FALSE wird.

Thorsten
  • 1
  • 2
  • 3
  • 4
  • 5
  • Page 1 of 5
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   137   151 · Page-Gen-Time: 0.045151s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI