¿Quién envía los campos USB SYNC/EOP, host o dispositivo?

Actualmente estoy estudiando la especificación USB y tengo una pregunta sobre quién envía los campos SYNC y EOP en un paquete. Una transacción GET_DESCRIPTOR típica (digamos) consta de paquetes SETUP y DATA0 enviados desde el host y un paquete ACK devuelto desde el dispositivo. Mis preguntas son:

1) ¿Tengo razón al entender que el dispositivo envía los campos SYNC y EOP para su propio paquete ACK (en lugar de que los envíe el host)?

2) si es así, ¿eso significa que también puede haber una demora hasta que el dispositivo responda? (Creo que recuerdo haber visto algo en este sentido en la especificación).

3) ¿Eso también significa que el reloj del dispositivo puede no permanecer necesariamente sincronizado con el reloj del host durante este retraso, y que para leer el paquete de respuesta tendré que volver a sincronizar el host al recibir el campo SYNC del dispositivo, por ejemplo, por sobremuestreo?

Respuestas (1)

Su comprensión es correcta. Los paquetes USB van en ambos sentidos, por lo que SYNC, PID, DATA, CRC y EOP están formados por quien envía el paquete en particular. Y sí, un dispositivo (a la velocidad de señalización de HS) debe responder en tiempos de 192 bits (400 ns) a las solicitudes estándar. [el anfitrión, sin embargo, esperará 1700 ns antes de declarar el tiempo de espera, para adaptarse a otros retrasos de propagación a lo largo del enlace]. Y sí, el reloj del dispositivo normalmente es asíncrono con el reloj del host. Pero ambos relojes deben estar dentro de los 500 ppm de la frecuencia nominal para una comunicación exitosa a velocidad HS y 2000 ppm para enlaces FS/LS. Y sí, cada receptor USB tiene sobremuestreo y usa el campo SYNC recibido para encontrar el borde derecho del reloj y muestrear los datos entrantes correctamente.

Hablando de lo que debe hacerse, todas estas operaciones utilizan algoritmos de hardware bien establecidos, que generalmente se implementan en un bloque de hardware llamado "USB PHY". Realiza todas estas funciones de recuperación de datos de reloj (CDR) en la recepción, decodificación NRZI y verificación de errores, y SYNC prependiente, codificación NRZI y conexión EOP en la transmisión. A menos que esté diseñando alguna nueva tecnología revolucionaria de implementación PHY, normalmente no debería preocuparse por CDR, SYNC, EOP, etc., USB PHY hace todo esto por usted.

Gracias @Ale, agradezco la aclaración/confirmación. Y sí, estoy jugando con la implementación de un SIE en un FPGA, por lo que todo esto es relevante. De acuerdo con mis bancos de prueba, mi NRZI/relleno de bits/CRC, etc. funcionan correctamente, solo quería asegurarme de no perder el tiempo implementando el lado de lectura del protocolo debido a un malentendido de la especificación.