MSP430 USB-Modul und Baudratenerkennung

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.

Antworten (1)

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.

Vielen Dank für die Antwort. Dies bestätigt größtenteils meinen Verdacht, mit Ausnahme des Teils über den Host, der angeforderte Baudrateninformationen sendet. Das klingt genau nach dem, wonach ich suche, obwohl ich es nicht für möglich gehalten hätte. Ich habe einen Teil der Terminologie aus dem von Ihnen bereitgestellten Link verwendet, um meine Suche zu verfeinern (möglicherweise habe ich schlechte Suchbegriffe verwendet), und ich habe möglicherweise eine mögliche Lösung gefunden. Davon abgesehen liefert Ihre Antwort fantastische Informationen und weist mich definitiv in eine nützliche Richtung. Vielen Dank!
Für diejenigen, die daran interessiert sind, habe ich Folgendes getan, um dies zu lösen: In usbEventHandling.cfügte ich eine globale Variable namens hinzu baudrate. Im USBCDC_handleSetLineCoding()Handler, der lBaudrateals Parameter hat, setze ich einfach meine globale baudrate = lBaudrate. Dann habe ich am Ende der Datei eine Accessor-Methode hinzugefügt, uint32_t UsbCdcGetBaudRate(void)die einfach baudrate. In meiner main.cDatei muss ich nur eine Variable = setzen UsbCdcGetBaudRate(). Nur als Hinweis musste ich eine Datei hinzufügen, usbEventHandling.hdie nur den Funktionsprototypen für enthältUsbCdcGetBaudRate()