Hallo, ich arbeite gerade an einem Projekt mit dem STM32 - H103 Board von Olimex mit dem STM32F106RBT6 und Labview von NI. Und zwar möchte ich möglichst schnell Messdaten (ADC Sampels) per USB Schnittstelle in Labview darstellen. Auf der µC Seite benutze ich einen ADC Channel im kontinuierlichen Scan Modus mi DMA. Und für die USB Verbindung habe ich das Virtual - Com - Port Bsp. von escamotuer etwas verändert benutzt. In meiner Main Dauerschleife warte ich nun solange bis ein Signal gesampelt wurde und speichere das dann in meinem 64Byte Puffer, den ich senden möchte. Sobald 32 12bit Sampels vorhanden sind schreibe ich den vollen Puffer auf den Bus. main: while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); DatenSendenA64(ADCConvertedValue); zusatz c - file: void DatenSendenA64(uint16_t ADCValue){ ADCPuffer[j] = ADCValue >> 8; ADCPuffer[j+1] = ADCValue; j = j + 2; if(j >= 64){ j = 0; USB_SIL_Write(EP1_IN, ADCPuffer, bufferPos); SetEPTxValid(ENDP1); } } Mein Problem ist nun, dass die Werte in Labview zwar ankommen. Ich aber nicht genau weiß ob wirklich alle Werte ankommen. Wenn ich z.B. 10 mal 4096 Bytes hole, diese umwandle und dann als zusammenhängendes Signal darstellen möchte habe ich Lücken im Signal. Das sieht dann aus wie bei der Abbildung. Hat jemand eine Idee wovon diese Signallücken hervorgerufen werden? Danke im Voraus. Gruß Johannes
Wenn Du mit 1MSPS ADC wandelst und jedes Sample mit 2Bytes verschickst, dann kommen da 2MByte/s zusammen. Und das ist eindeutig zu viel, um das über USB (12MBit/s) zu übertragen. Dazu kommt noch der Overhead des VCP... Irgendwo im ST Forum wurde mal der maximal mögliche Durchsatz bei USB mit dem ST VCP diskutiert, ich erinnere mich jetzt nicht mehr, was letztendlich rauskam, aber ich würde mal schätzen, dass da nicht mehr als vielleicht ein paar 100KB/s möglich sind.
Ok, ja das ist auch ein Problem, mit dem ich mich beschäftigen muss. Aber die Lücken sind fehlende Pakete, die nicht in Labview ankommen. Diese Lücken treten immer zwischen zwei aufeinander folgenden Aufrufen der VISA - Read Funktion auf. Also ob ich jetzt 4096 Werte oder 40960 Werte auf einmal hole, es fehlen immer ca 15 Pakete á 64 Byte. Eine Idee woran das liegen könnte? Danke, Gruß Johannes
hmmm, pack doch mal einen botschaftszähler mit dazu (uint8++) und schau, ob immer an der gleichen stelle pakete verschwinden. evtl. läuft dir auch der Rx-buffer im com-port pc-seitig über ? windoofs und echtzeit...
Hallo Johannes, ich kenne mich zwar mit diesem speziellen USB Stack nicht aus, aber ich nehme mal an das es da auch irgendwas gibt wie IsEPTxReadyForNewData(), um abzufragen, ob der Endpunkt überhaupt für neue Daten bereit ist. Sowas ist wesentlich, wenn Du das Überschreiben von noch nicht gesendeten Daten vermeiden willst. Gruß Potter
> hmmm, pack doch mal einen botschaftszähler mit dazu (uint8++) und schau, > ob immer an der gleichen stelle pakete verschwinden. ja das habe ich schon gemacht. Also die Lücken treten immer an der gleichen Stelle auf. Und zwar dort, wo der Bruch zu einem neuen Read Aufruf ist. Wenn ich 40960 Werte lese, das entspriht 20480 Sampels, die ich anzeige. Dann ist der Bruch zwischen dem 20479 und dem 20480 Wert. und zwar immer so ca. 500Werte. Wenn ich natürlich zu schnell abtaste gehen mir auch zwischendurch Werte verloren, aber das habe ich unter Kontrolle. @Potter: An einen Stacküberlauf habe ich auch schon gedacht, aber ich weiß auch net wo ich das kontrollieren kann. Ich bin nun soweit, dass ich herausgefunde habe. Das auf der PC - Seite das max. an zu holenden Byte wohl 262144 Byte zu sein scheint. Ich kontrolliere die Transfers mit einem USB - Sniffer und dabei ist mir das aufgefallen, dass bis zur Grenze von 262144Byte nur ein Bulk - Transfer stattfindet. So Funktionen zum Status Check habe ich bislang noch nicht gefunden, aber wenn mir da jemand einen Tip geben könnte wäre das super. Momentan bin ich soweit, dass ich weiß, das jede ms der host meinen uC - USB - Endpoint nach Daten abfragt und bei USB 2.0 FS sind pro Frame(1ms) bis zu 19 Pakete á 64Byte theoretisch möglich. Praktisch kome ich so auf ein max von 830kB / s das würde im Schnitt 13Pakete pro Frame machen. Dann könnte ich bei einer Einstellung von 55,5Cycles und ADCCLK von 12MHz eine Abtastrate von 176470Hz erreichen. Das wären 705kB Daten (352941 Sampels bei 2 Signalen) und das möchte ich rüber bekommen. Mit Hilfe eines Delays, versuche ich den Aufruf der SIL_Write Funktion zu steuern. Also beispielsweise, das diese 15mal pro 1ms aufgerufen wird, um so meine Übertragungsrate zu regeln. Delay(250); //1176 = 200us USB_SIL_Write(EP1_IN, (uint8_t*) ADCConvertedValueTab, 64); SetEPTxValid(ENDP1); So erstmal einfach alles was ich gerade so im Kopf hatte aufgeschrieben! Wenn ihr noch Ideen habt, dann bitte posten. Vielen Danke, Johannes
Also, meiner Meinung nach solltest Du auf jeden Fall überprüfen, ob der EP auch neue Daten aufnehmen kann. GetEPTxStatus() könnte da vermutlich weiterhelfen. Oder Du löst das ganze über einen Callback, der sollte Dir anzeigen, wann die Daten versendet wurden. Allerdings bist Du bei USB immer dem Host ausgeliefert. Wenn der keine Transfers anfordert, dann kannst Du noch so viel und schnell Daten bereitstellen...
Wie der Code ganz oben aussieht, verwendest du keine Doppelbuffer. Das wäre bei deiner Anwendung sehr sinnvoll. Grundsätzlich würd ich erst mal bei ganz niedrigen Abtastraten anfangen,und das Verhalten genau zu studieren. Das Timing der Funktionen kann man mit setzen von Port-Pin's und messen mit Oszi sehr gut beurteilen. Grüsse
Ja das Timing überprüfen mittels Port Toggeln mache ich auch schon. Und auf die DoppelBuffer - Sache bin ich heute morgen auch gestoßen, habe aber noch keine Beiträge gefunden in denen das Anwendung findet und ohne Bsp. traue ich mich nicht daran. Also ich schreibe ja meine Werte mittels der USB_SIL_Write Funktion auf den Endpoint. So glaube ich. Wenn ich mir die Aufrufstruktur anschaue, bemerke ich, dass die Daten einfach nur in einen PMA (Paket Memory Acces) Bereich geschoben werden. Und wie sie von da aus weiter kommen konnte ich noch net nachvollziehen. Mir stellt sich die Frage, wie die Kommunikation wirklich funktionier. Ich kann mir noch nicht genau vorstellen, wie in einem Frame (1ms) n (z.B. 12Pakete) geschickt werden können, weil ich immer nur von einem 64Byte Buffer höre und der PMS - Bereich mir noch ein Rätsel ist. Danke
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
