Forum: Mikrocontroller und Digitale Elektronik USB CDC Protocol STM32446 Geschwindigkeit der Übertragung


von Andres (Gast)


Lesenswert?

Hallo zusammen,

Ich arbeite gerade mit dem Evaluation Board STM32446 um den Protocol USB 
CDC FS zu nutzen. Ich kann schon Daten am Computer senden bzw. empfangen 
aber jetzt möchte ich wissen, mit welcher Geschwindigkeit die 
Übertragung der Daten wirklich ist. Kann ich das am besten per Software 
oder Hardware durchführen?.
Kann ich diese Zeit der Übertragung in den Pins PA12 (Data+) und 
PA11(Data-) in einem Oszilloskop messen?

uint8_t  mystring[] = "Hello";


int main(void)
{
  /* STM32F446xx HAL library initialization */
  HAL_Init();

  /* Configure the system clock to 180 MHz */
  SystemClock_Config();

  MX_GPIO_Init();

  /* Init Device Library */
  USBD_Init(&USBD_Device, &VCP_Desc, 0);

  /* Add Supported Class */
  USBD_RegisterClass(&USBD_Device, USBD_CDC_CLASS);

  /* Add CDC Interface Class */
  USBD_CDC_RegisterInterface(&USBD_Device, &USBD_CDC_fops);

  /* Start Device Process */
  USBD_Start(&USBD_Device);

  /* Run Application (Interrupt mode) */
  while (1)
  {


    CDC_Transmit_FS(mystring,strlen((const char*)mystring));
    HAL_Delay(1000);
  }
}

von Student (Gast)


Lesenswert?

Hallo zusammen,

Ich arbeite gerade mit dem Evaluation Board STM32446 um den Protocol USB
CDC FS zu nutzen. Ich kann schon Daten am Computer senden bzw. empfangen
aber jetzt möchte ich wissen, mit welcher Geschwindigkeit die
Übertragung der Daten wirklich ist. Kann ich das am besten per Software
oder Hardware durchführen?.
Kann ich diese Zeit der Übertragung in den Pins PA12 (Data+) und
PA11(Data-) in einem Oszilloskop messen?

uint8_t  mystring[] = "Hello";


int main(void)
{
  /* STM32F446xx HAL library initialization */
  HAL_Init();

  /* Configure the system clock to 180 MHz */
  SystemClock_Config();

  MX_GPIO_Init();

  /* Init Device Library */
  USBD_Init(&USBD_Device, &VCP_Desc, 0);

  /* Add Supported Class */
  USBD_RegisterClass(&USBD_Device, USBD_CDC_CLASS);

  /* Add CDC Interface Class */
  USBD_CDC_RegisterInterface(&USBD_Device, &USBD_CDC_fops);

  /* Start Device Process */
  USBD_Start(&USBD_Device);

  /* Run Application (Interrupt mode) */
  while (1)
  {


    CDC_Transmit_FS(mystring,strlen((const char*)mystring));
    HAL_Delay(1000);
  }
}

von STMler (Gast)


Lesenswert?


von Student (Gast)


Lesenswert?

Ich implementiere das Beispielprogramm (USB CDC Standalone) von dem 
EvaluationBoard STM32446E um Daten nur per USB senden bzw empfangen zu 
können. Das scheint gut zu funktionieren, aber jetzt möchte ich wissen, 
wie hoch diese Geschwindigkeit der Datenübertragung ist. Wie könnte ich 
das messen?

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Student schrieb:
> Wie könnte ich
> das messen?

Am PC die einen Zeitstempel nehmen, dann viele Daten senden, dann wieder 
einen Zeitstempel nehmen?

von Student (Gast)


Lesenswert?

Das ist was ich sende,


uint8_t  mystring[] = "Hello";


int main(void)
{
  /* STM32F446xx HAL library initialization */
  HAL_Init();

  /* Configure the system clock to 180 MHz */
  SystemClock_Config();

  MX_GPIO_Init();

  /* Init Device Library */
  USBD_Init(&USBD_Device, &VCP_Desc, 0);

  /* Add Supported Class */
  USBD_RegisterClass(&USBD_Device, USBD_CDC_CLASS);

  /* Add CDC Interface Class */
  USBD_CDC_RegisterInterface(&USBD_Device, &USBD_CDC_fops);

  /* Start Device Process */
  USBD_Start(&USBD_Device);

  /* Run Application (Interrupt mode) */
  while (1)
  {


    CDC_Transmit_FS(mystring,strlen((const char*)mystring));
    HAL_Delay(1000);
  }
}



Auf der Datei des Boards steht, dass die Geschwindigkeit bei 12Mbts 
beträgt, Das ist das ich messen möchte.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Student schrieb:
> Auf der Datei des Boards steht, dass die Geschwindigkeit bei 12Mbts
> beträgt, Das ist das ich messen möchte.

Das ist nicht die Datenrate, die Du per CDC erreichen kannst, das ist 
die Bruttodatenrate von "Full-Speed"-USB. Die hat "Full-Speed"-USB 
immer.

Und daher kannst Du diese Bruttodatenrate auch nicht sinnvoll messen.

von Student (Gast)


Lesenswert?

Ja, stimmt. Dann wenn ich  zB das per USB sende    uint8_t  mystring[] = 
"Hello";    oder wenn ich etwas in dem Board per Hterminal empfange, 
Kann ich irgenwie die Zeit messen, die mein Board um diese Daten zu 
übertragen benötigt?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du kannst messen, wie lange die Ausführung der Funktion "CDC_Transmit" 
dauert - dazu verwendest Du einen I/O-Pin, den Du als Ausgang 
konfigurierst, legst den unmittelbar vor Aufruf der Funktion auf High 
und unmittelbar nach Aufruf der Funktion auf Low. Mit einem Oszilloskop 
kannst Du die Dauer des High-Pulses bestimmen.

1
while (1)
2
{
3
  SetMyIoPin(1); 
4
  CDC_Transmit_FS(mystring,strlen((const char*)mystring));
5
  SetMyIoPin(0);
6
7
  HAL_Delay(1000);

Anstatt von "SetMyIoPin" musst Du natürlich was zu Deinem µC passendes 
einfügen.

von W.S. (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Du kannst messen, wie lange...

Ach Rufus, laß mal. Der TO hat noch nicht kapiert, daß all seine Zeiten 
und Durchsätze zum größten Teil davon abhängen, wie doof man sich auf 
der µC-Seite beim zuständigen Handler anstellt.

Auch bei den USB-Cores von ST gibt es die Möglichkeit, mit mehreren 
verschiedenen Blockpuffern zu arbeiten, so daß der µC einen Puffer füllt 
(oder leert), während der andere gerade im USB-Procedere hängt.

Aber das ist bei stinknormalen CDC eher unüblich, weil's dort eigentlich 
nicht benötigt wird. Jetzt versucht der TO mit einem Standard-Zeugs von 
ST's Stange zu arbeiten und sendet "hello". Als ob's das bringen 
könnte... Wäre was anderes, wenn er mit 4..8K großen Blöcken anrücken 
würde.

W.S.

von Bernd K. (prof7bit)


Lesenswert?

Rufus Τ. F. schrieb:
> Du kannst messen, wie lange die Ausführung der Funktion "CDC_Transmit"
> dauert

Das wird nichts bringen denn wahrscheinlich kopiert die einfach nur die 
paar Bytes in den nächsten freien TX Puffer des betreffenden Endpoints 
und setzt ein paar bits um den Puffer für den DMA des USB-Controllers 
als abholbereit zu markieren.

von Andy (Gast)


Lesenswert?

Was wäre denn sinnvoll schicken oder empfanden um eine beachtliche Zeit 
der Übertragung per USB messen zu können? ... Ich kenne mich nicht so 
gut mit dem USB CDC Protocol,

von Karl (Gast)


Lesenswert?

Etwas GROßES wäre angebracht. Irgendwas zwischen 10 und 100 MB an Daten 
müssen es mindestes sein um halbwegs verlässlich sagen zu können was 
genau Dein PC mit der aktuellen Auslastung im Durchschnitt kann.

Der STM32F4 schafft mit FS USB und original ST-Stack nach dem Fixen 
einiger Bugs knapp 1 MiB/s (was echt gut ist für FS USB).

Mit HS USB gehen ca 7,5 MiB/s, aber da limitiert der Standard-Treiber 
auf PC-Seite.

Messen Kannst Du mit irgendeinem selbstgeschriebenen Programm oder auch 
Wireshark.

Und jetzt sag bloß Du wolltest nicht den Durchsatz sondern die Latenz...

von Andy (Gast)


Lesenswert?

Karl schrieb:

> Mit HS USB gehen ca 7,5 MiB/s, aber da limitiert der Standard-Treiber
> auf PC-Seite.
>
> Messen Kannst Du mit irgendeinem selbstgeschriebenen Programm oder auch
> Wireshark.
>
> Und jetzt sag bloß Du wolltest nicht den Durchsatz sondern die Latenz...


Vielen Dank für die Antwort,

Ich habe gerade das Programm für HS USB, Hättest du eine Idee, wie ich 
zwischen 10 und 100 MB an Daten senden kann um die 7,5 MiB/s, messen zu 
können?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Bitte die https://www.mikrocontroller.net/user/conditions 
berücksichtigen!

Keine Teilname an einer Diskussion unter zwei verschiedenen Namen!

(Und es ist im übrigen sinnlos, die exakt gleiche Frage im Abstand von 
drei Stunden zu wiederholen, nur weil noch niemand in der Zwischenzeit 
geantwortet hat)

von Student (Gast)


Lesenswert?

Danke für eure Antworten, und Entschuldigung für die Störung   (Ich bin 
neu hier)

von Lalo (Gast)


Lesenswert?

Noch mal , vielen Dank an alle für eure nette Antworten.

Ich habe schon eine Lösung für das gefunden, und jetzt  habe ich die 
Geschwindigkeit gemessen und komme auf ca. 8,23MByte pro Sekunde.

Ich hätte zuerst alle über USB- Protokoll lesen müssen.

...

Ich möchte auch euch alle mich zu entschuldigen, weil ich hier auf der 
Webseite mit verschiedenen Namen die gleiche Frage gestellt habe, ich 
wollte nur Ruckmeldungen bekommen.

von Zero (Gast)


Lesenswert?

Ist für mich schon lange her jedoch bin ich mir sicher das du da mit 
deinen 8,xx MByte/s nur falsch liegen kannst..
Im Standard CDC (auch bei ST) sind für Daten ein Bulk IN und ein Bulk 
OUT inplementiert. Bulk entpunkte können ein mal je ms Daten senden bzw 
empfangen. Die Paketgröße beträgt 64 byte, wirst du sicher rechnen 
können wieviel KByte/s du da maximal erreichen kannst..

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Zero schrieb:
> Bulk entpunkte können ein mal je ms Daten senden bzw
> empfangen

Geht das an USB 2 oder mit einem USB-2 Hub nicht auch im 1/8 ms Raster?

von Gästchen (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Und daher kannst Du diese Bruttodatenrate auch nicht sinnvoll messen.

Außerdem hat die zusätzlich nichts mit der CDC-Übertragungsrate zu tun.

Man muss sich von dem Gedanken verabschieden, dass eine USB-CDC das eine 
irgenwie isochrone Geschichte wäre. Will heißen: Zeitverhalten und 
Übertraungsrate ist nicht vorhersagbar.

Das ist USB Bulk-Tranfer, wenn ich mich richtig erinnere, und damit per 
Definition nicht vorhersagbar. Denn da wird übertragen "wenn gerade mal 
Zeit frei ist". Was das für das Verhalten bedeutet, wenn man hinter 
einem Hub hängt (wie fast immer!), kann sich jeder denken - Abhängig vom 
Host und Hub.

Was ich aus eigenen Projekten weiß:
Große Datenmengen gehen üblicherweise realtiv "schnell". Also viel 
schneller als RS232, MBIT sind drin. Aber unkonstant.
Die Laufzeiten sind dagegen völlig unvorhersagbar. Manchmal geht es 
schnell, manchmal dauert es >100ms.

--> Eine CDC eignet sich für zeitkritische Übertragungen einfach nicht.
Für sowas macht man ein "richtiges" USB-Device.

von Karl (Gast)


Lesenswert?

Zero schrieb:
> Ist für mich schon lange her jedoch bin ich mir sicher das du da mit
> deinen 8,xx MByte/s nur falsch liegen kannst..
> Im Standard CDC (auch bei ST) sind für Daten ein Bulk IN und ein Bulk
> OUT inplementiert. Bulk entpunkte können ein mal je ms Daten senden bzw
> empfangen. Die Paketgröße beträgt 64 byte, wirst du sicher rechnen
> können wieviel KByte/s du da maximal erreichen kannst..

rolleyes
Bulk kann einmal pro Frame (1 ms) Daten übertragen und ein Paket ist 
auch max. 64 Bytes wenn man so will, aber wenn man die Übertragung nicht 
mit einem Paket < 64 Byte oder einem ZLP abbricht, kann man den ganzen 
Frame über Pakete übertragen.

uwebonnes schrieb:
> Geht das an USB 2 oder mit einem USB-2 Hub nicht auch im 1/8 ms Raster?
Ja. Microframe nennt sich das dann. Hat aber mit der obigen 
Fehlinterpretation nichts mehr zu tun.

Gästchen schrieb:
> ...
> --> Eine CDC eignet sich für zeitkritische Übertragungen einfach nicht.
> Für sowas macht man ein "richtiges" USB-Device.

Jain. Kommt wie immer auf die Anforderungen an. Es gibt haufenweise 
"professionelle" Messtechnik die auch gut funktioniert und dann doch 
einen FTDI drauf hat der CDC macht. Garantieren kann natürlich niemand 
nichts aber in der Regel klappt es sehr gut. Ein ausrechend großer 
Puffer auf Device-Seite muss natürlich sein. Atomkraftwerke aber bitte 
doch mit dem Parallelport steuern ;-)

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Karl schrieb:
> Atomkraftwerke aber bitte
> doch mit dem Parallelport steuern ;-)

Genau! Dazu gibt es doch den FT245 :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.