Módulo USB MSP430 y detección de velocidad en baudios

Estoy trabajando en un proyecto que usa el módulo USB integrado en el MSP430F5529, específicamente usando la placa de desarrollo MSP-EXP430F5529LP de TI. Estoy usando la API USB provista en MSPWare.

El host habla con mi dispositivo a través de MODBUS y estoy guardando la velocidad de transmisión actual en NVM. Generalmente, para cambiar la tasa de baudios, escribo un valor en un registro MODBUS. El dispositivo lee este valor y configura sus UART en consecuencia, de modo que pueda actuar como un puente entre USB y un dispositivo TTL.

El problema es que no todas las implementaciones MODBUS usarán este registro MODBUS como una configuración de velocidad en baudios, por lo que escribir en esa dirección puede no tener la intención de cambiar la velocidad en baudios. Por lo tanto, este método tiene que desaparecer.

Tenía la esperanza de poder detectar la velocidad en baudios que se utiliza para comunicarse a través de la señal USB. El primer pensamiento fue usar un temporizador para medir el ancho del bit de inicio y usarlo para calcular la velocidad en baudios. El problema con esto es que 1) Necesito enviar un byte ficticio completo a través de USB a mi dispositivo para detectar la velocidad en baudios, antes de iniciar la comunicación normal. El otro problema es que, por la forma en que se construye la API USB MSP430, no parece que tenga acceso a los bits individuales a medida que ingresan, sino que el mensaje se almacena en un búfer que luego se proporciona una vez que se completa el mensaje. No podría cronometrar el bit de inicio en este evento.

No creo que haya una manera de simplemente "saber" cuál es la velocidad en baudios del host sin enviar datos, ya que esa información (que yo sepa) no se comunica a través del bus. Por favor corrígeme si estoy equivocado.

¿Cómo se podría determinar la velocidad en baudios de una conexión USB, preferiblemente sin enviar primero un byte ficticio? No estoy completamente convencido de que esto sea posible, parece estar pidiendo lo imposible, pero pensé que alguien aquí podría darme una respuesta definitiva.

He revisado los documentos de TI que describen el módulo USB, la API y su aplicación y aún no he encontrado una solución a este problema.

Respuestas (1)

La velocidad en baudios de la conexión USB no tiene relación con la velocidad en baudios del lado UART de un convertidor USB a UART. Independientemente de la velocidad en baudios solicitada por la aplicación, los datos enviados por la aplicación se empaquetarán y se enviarán a través de la conexión USB a cualquier velocidad para la que esté configurado el enlace USB (según las capacidades de velocidad del host y el dispositivo). Depende del dispositivo establecer la tasa de baudios de su interfaz UART a la solicitada por la aplicación. La tasa de baudios solicitada debe ingresar como uno de los mensajes SET de configuración enviados por el host.

Esta nota de aplicación es para una plataforma diferente, pero tiene información sobre cómo se hace esto: https://www.xmos.com/developer/download/private/AN00124:-USB-CDC-Class-as-Virtual-Serial-Port (2.0.2rc1).pdf

Tendrá que buscar en la documentación de su API para ver cómo (o si) se exponen estos datos de configuración. Si no está expuesto, es posible que deba buscar en las bibliotecas para encontrar un lugar donde pueda interceptar ese mensaje SET y actuar en consecuencia.

Muchas gracias por la respuesta. Esto confirma principalmente mi sospecha, excepto por la parte sobre el host que envía la información de velocidad en baudios solicitada. Eso suena exactamente como lo que estoy buscando, aunque no pensé que fuera posible. Utilicé parte de la terminología del enlace que proporcionó para refinar mis búsquedas (es posible que haya estado usando términos de búsqueda deficientes) y es posible que haya encontrado una posible solución. Dicho esto, su respuesta proporciona información fantástica y definitivamente me señala una dirección útil. ¡Muchas gracias!
Para los interesados, para solucionar esto hice lo siguiente: Agregué usbEventHandling.cuna variable global llamada baudrate. En el USBCDC_handleSetLineCoding()controlador, que tiene lBaudratecomo parámetro, simplemente configuro mi archivo global baudrate = lBaudrate. Luego, en la parte inferior del archivo, agregué un método de acceso, uint32_t UsbCdcGetBaudRate(void)que simplemente devuelve baudrate. Dentro de mi main.carchivo, todo lo que necesito hacer es establecer una variable = UsbCdcGetBaudRate(). Solo como nota, necesitaba agregar un archivo, usbEventHandling.hque contiene solo el prototipo de función paraUsbCdcGetBaudRate()