Ich arbeite an einem Projekt, das das im MSP430F5529 integrierte USB-Modul verwendet, insbesondere unter Verwendung des Entwicklungsboards MSP-EXP430F5529LP von TI. Ich verwende die in MSPWare bereitgestellte USB-API.
Der Host spricht über MODBUS mit meinem Gerät, und ich speichere die aktuelle Baudrate in NVM. Um die Baudrate zu ändern, schreibe ich im Allgemeinen einen Wert in ein MODBUS-Register. Das Gerät liest diesen Wert und konfiguriert seine UARTs entsprechend, sodass es als Brücke zwischen USB und einem TTL-Gerät fungieren kann.
Das Problem besteht darin, dass nicht alle MODBUS-Implementierungen dieses MODBUS-Register als Baudratenkonfiguration verwenden, sodass das Schreiben an diese Adresse möglicherweise nicht dazu bestimmt ist, die Baudrate zu ändern. Daher muss diese Methode weg.
Ich hatte gehofft, ich könnte die Baudrate erkennen, die für die Kommunikation über das USB-Signal verwendet wird. Der erste Gedanke war, einen Timer zu verwenden, um die Breite des Startbits zu messen und daraus die Baudrate zu berechnen. Das Problem dabei ist, dass 1) ich ein ganzes Dummy-Byte über USB an mein Gerät senden muss, um die Baudrate zu erkennen, bevor ich mit der normalen Kommunikation beginne. Das andere Problem ist, dass die Art und Weise, wie die MSP430-USB-API aufgebaut ist, ich anscheinend keinen Zugriff auf die einzelnen Bits habe, wenn sie eingehen, sondern die Nachricht in einem Puffer gespeichert wird, der dann bereitgestellt wird, nachdem die Nachricht abgeschlossen ist. Ich wäre nicht in der Lage, das Startbit in diesem Ereignis zu timen.
Ich glaube nicht, dass es eine Möglichkeit gibt, einfach die Baudrate des Hosts zu "wissen", ohne Daten zu senden, da diese Informationen (meines Wissens nach) nicht über den Bus übermittelt werden. Bitte korrigiere mich wenn ich falsch liege.
Wie könnte man die Baudrate einer USB-Verbindung ermitteln, am besten ohne vorher ein Dummy-Byte zu senden? Ich bin nicht ganz davon überzeugt, dass dies überhaupt möglich ist, es scheint das Unmögliche zu verlangen, aber ich dachte, jemand hier könnte mir eine eindeutige Antwort geben.
Ich habe die TI-Dokumente durchgesehen, die das USB-Modul, die API und ihre Anwendung beschreiben, und habe noch keine Lösung für dieses Problem gefunden.
Die Baudrate der USB-Verbindung hat keine Beziehung zur Baudrate der UART-Seite eines USB-zu-UART-Konverters. Unabhängig von der von der Anwendung angeforderten Baudrate werden die von der Anwendung gesendeten Daten paketiert und über die USB-Verbindung mit der Geschwindigkeit gesendet, für die die USB-Verbindung konfiguriert ist (je nach Geschwindigkeitsfähigkeit des Hosts und des Geräts). Es ist Sache des Geräts, die Baudrate seiner UART-Schnittstelle auf die von der Anwendung angeforderte einzustellen. Die angeforderte Baudrate sollte als eine der vom Host gesendeten Konfigurations-SET-Nachrichten eingehen.
Diese Appnote ist für eine andere Plattform, enthält aber einige Informationen dazu: https://www.xmos.com/developer/download/private/AN00124:-USB-CDC-Class-as-Virtual-Serial-Port (2.0.2rc1).pdf
Sie müssen in der Dokumentation Ihrer API nachsehen, wie (oder ob) diese Konfigurationsdaten verfügbar gemacht werden. Wenn es nicht verfügbar ist, müssen Sie möglicherweise die Bibliotheken durchsuchen, um einen Ort zu finden, an dem Sie diese SET-Nachricht abfangen und entsprechend reagieren können.
DerStrom8
DerStrom8
usbEventHandling.c
fügte ich eine globale Variable namens hinzubaudrate
. ImUSBCDC_handleSetLineCoding()
Handler, derlBaudrate
als Parameter hat, setze ich einfach meine globalebaudrate = lBaudrate
. Dann habe ich am Ende der Datei eine Accessor-Methode hinzugefügt,uint32_t UsbCdcGetBaudRate(void)
die einfachbaudrate
. In meinermain.c
Datei muss ich nur eine Variable = setzenUsbCdcGetBaudRate()
. Nur als Hinweis musste ich eine Datei hinzufügen,usbEventHandling.h
die nur den Funktionsprototypen für enthältUsbCdcGetBaudRate()