¿Problema eléctrico con USB? El dispositivo de alta velocidad no funciona según el diseño propio

Descargo de responsabilidad, soy un tipo SW, así que no des nada por sentado, y agradecería explicaciones en términos sencillos :)

Tenemos un diseño personalizado basado en Freescale's i.mx233, y como referencia usamos una placa de Olimex llamada Olinuxino. En el Olinuxino, tienen un chip LAN-USB de funcionamiento dual que no es necesario para nuestro diseño (solo necesitamos 1 puerto USB para un dongle WiFi), por lo que pensamos que podemos quitarlo y conectar un dispositivo USB directamente a los procesadores Líneas D+ y D-.

Debido a un error de diseño por separado, el conector USB que seleccionamos no se puede usar en esta revisión de HW. Pensé que podría verificar el diseño simplemente cortando un cable de extensión USB y soldándolo en el lugar de los conectores, por lo que actualmente se ve así:

foto

Ahora, cuando conecto el módulo WiFi al conector, parece comenzar a enumerar correctamente y, al observar la señalización, también se ve decente (lo comparé con la placa de referencia y se ve muy parecido):

foto 2

Sin embargo, en el lado del software, el controlador de WiFi se queja de que está leyendo mal la ID del conjunto de chips y se niega a cargar:

[    2.390000] ieee80211 phy0: rt2x00usb_vendor_request: Error - Vendor Request 0x07 failed for offset 0x1000 with error -       
[    2.400000] ieee80211 phy0: rt2800_probe_rt: Error - Invalid RT chipset 0xc37b, rev 5108 detected
[    2.410000] ieee80211 phy0: rt2x00lib_probe_dev: Error - Failed to allocate device

La parte esquemática del puerto USB (original):

esquema wlan

Y el diseño real para esa parte también es simple (en la imagen solo la capa superior, he ocultado todas las demás capas para mayor claridad. Dibujé a mano el rastro de la señal D de la capa inferior, tenga en cuenta que en la imagen real de arriba se gira 180 grados):

rastros wlan de AP

Funciona exactamente el mismo paquete de software y el mismo dongle en nuestra placa de referencia, y el controlador se carga. Empecé a leer la Especificación USB2.0 , y en el capítulo 7, hablan sobre la señalización eléctrica, y esta parte me llamó la atención:

La operación de alta velocidad admite señalización a 480 Mb/s. Para lograr una señalización confiable a esta velocidad, el cable se termina en cada extremo con una resistencia de cada cable a tierra. El valor de esta resistencia (en cada cable) se establece nominalmente en la mitad de la impedancia diferencial especificada del cable, o 45 Ω. Este presenta una terminación diferencial de 90 Ω.

¿He estropeado la señalización ahora con mi puerto USB? ¿Qué differential impedancesignifica esto? Además, ¿ habría tenido exactamente el mismo problema también con el puerto original ya que estábamos planeando solo conectar las líneas 5V, GNDy al conector? ¿O se supone que esta resistencia está dentro de cada extremo de la conexión dentro del silicio? ¿Qué podría estar mal aquí?D+D-

¡Gracias por cualquier consejo!

Editar: diseño agregado e imagen esquemática para mayor claridad

Edición 2 : tiré mi cable de extensión recortado, doblé el conector USB original y pude colocarlo en el tablero en un ángulo un poco extraño.

También agregué los drivers necesarios al kernel para las memorias USB, y ya verifiqué que mi memoria USB HighSpeed ​​de 16GB funciona. Durante el arranque se detecta:

[    2.240000] usb 1-1: new high-speed USB device number 2 using ci_hdrc
[    2.430000] usb-storage 1-1:1.0: USB Mass Storage device detected
[    2.440000] scsi0 : usb-storage 1-1:1.0
[    3.460000] scsi 0:0:0:0: Direct-Access     UFD 2.0  Silicon-Power16G PMAP PQ: 0 ANSI: 4
[    3.500000] sd 0:0:0:0: [sda] 30283008 512-byte logical blocks: (15.5 GB/14.4 GiB)
[    3.520000] sd 0:0:0:0: [sda] Write Protect is off
<snip>

El flash en la placa es muy pequeño, pero en la unidad USB puedo copiar un archivo de 1 GB a otro directorio y la velocidad es de alrededor de 360 ​​KB/seg. La suma MD5 coincide y no veo ningún problema al usar la tarjeta de memoria.

Entonces, supongo que esto significa que ahora algo va mal solo con el dongle WiFi... es extraño... Si hubiera corrupción en las líneas DPy DM, ¿no vería también corrupción durante las transferencias de datos?

Edición final Si bien no hemos podido identificar el problema con 100% de certeza, al forzar el controlador a través del registro para que solo funcione en modo 1.1, todos los dispositivos USB funcionan sin problemas, incluido el módulo WLAN. En nuestro próximo diseño, hemos seguido estrictas reglas de enrutamiento diferencial y, con suerte, este será el final de nuestros problemas :)

Supongo que las resistencias de terminación USB requeridas son internas para Freescale iMX233 IC, porque el esquema Olimex iMX233-OLinuXino-MICRO muestra la conexión directa desde MX233 al conector USB. Si puede encontrar la hoja de datos del dispositivo, deben tener un circuito de prueba de aplicación para confirmar.
En su prototipo (conexión de cable flexible), ¿es posible que D+ y D- se hayan intercambiado debido a un error de diseño? Parece que su cable tiene rojo = VBUS, blanco = D-, verde = D +, negro-GND, suponiendo que las almohadillas de diseño de PCB estén en el orden correcto. ¿Se enumeran otros dispositivos?
De hecho, también lo intenté. Pero luego el núcleo me da muchos errores de lectura (-71). Estoy bastante seguro de que las líneas de datos están bien ahora. Probé el teclado Logitech y parece ser reconocido por el núcleo (aunque no puedo escribir en él, esto podría ser un problema del controlador, no he verificado el teclado en olimex). El dispositivo debería enumerar bien ya que está comenzando a cargar el controlador correcto. ¿O cómo funciona exactamente el proceso de enumeración?
@MarkU Agregué diseños e imágenes esquemáticas al OP, espero que esto aclare más
En su diseño, D+ y D- tienen diferentes longitudes de rastreo y diferente inductancia (D- pasa por dos vías, D+ no tiene vías). Esto podría afectar la integridad de la señal USB. Normalmente instruyo al diseñador de diseño de CAD para enrutar D+ y D- uno al lado del otro, igual longitud de ruta, espaciado constante. Similar a las reglas de diseño para el enrutamiento de microstrip. ¿Puedes mover el conector USB-A al lado opuesto de la placa, para que D+ y D- puedan enrutarse directamente, con 1 vía cada uno?
@MarkU, es posible que tenga algo aquí: ¿cree que si intentara cortar el rastro de DM y tratar de soldar un pequeño cable de conexión a la almohadilla, podríamos ayudar a la situación (solo para verificar esta revisión)? o hacer la soldadura manual ¿Las articulaciones básicamente tienen el mismo efecto (o incluso peor) que esas 2 vías? En la próxima revisión definitivamente vamos a enrutar estas líneas una al lado de la otra
Si tiene un cable pequeño de 30 AWG (0,255 mm de diámetro) (también llamado cable de "envoltura de cable"), puede ser posible conectarlo directamente a los pines del IC... requeriría un técnico con mano firme, microscopio, calibre fino soldadura, fundente. Existe el riesgo de que la revisión adicional arruine la placa prototipo, por lo que podría ser más productivo centrarse en la simetría del enrutamiento USB en la próxima revisión de la placa.
MarkU, después de quitar el cable y doblar el conector original, ahora funciona la memoria flash USB de alta velocidad (agregué la edición 2 a la pregunta), pero todavía tengo problemas con el dongle WiFi... ¿Tiene alguna otra idea de lo que podría ser? mal por qué el WiFi no funcionaría?
¿Quizás el dongle WIFi es más sensible a la alimentación/conexión a tierra? Parece que has descartado todo excepto el diseño del tablero.

Respuestas (3)

Es una pregunta difícil de responder , ya que se trata más de una cuestión de depuración. Pero puedo aportar algunas ideas sobre lo que podría intentar.

Lo primero que pensé fue que sus conexiones flexibles (los cables sueltos de 1-2 cm que salen del cable y se conectan a su placa) podrían ser demasiado largas para una operación de 480 MBps. Ideas para probar:

  • Obligue a su host a ejecutarse como USB 1.1 (1,5 o 12 MBps). Tal vez pueda ejecutarlo a través de un concentrador alimentado por USB o algo para forzarlo a la velocidad más baja.
  • Use un conector USB real, péguelo al revés o algo así, y haga conexiones cortas muy ajustadas desde los pines del conector a la PCB.
  • Tal vez pueda encontrar una manera de reducir la longitud de las coletas del cable a 1/5 o algo así en ese orden.
  • Asegúrese de no estar probando con la sonda del osciloscopio conectada.
  • Tal vez pruebe con un cable USB muy corto y muy largo.
  • Tal vez intente cambiar la temperatura (más caliente hace que los bordes sean más lentos y más frío los hace más rápidos).

Una nota para algunos comentarios aquí: no se preocupe por la cantidad de vías y la coincidencia de longitud de esos rastros de PCB. Bien hecho, las vías y un poco de desajuste de longitud nunca han sido un problema para USB 2.0. Y esto es insignificante comparado con lo que haces con las coletas de cable.

Algunos errores generales típicos para verificar incluyen:

  • Reloj. Verifique que la frecuencia del reloj y la fluctuación estén dentro de las especificaciones, incluidos los PLL.
  • Fuerza. Verifique (con un osciloscopio BW de 1-2 GHz) que su ondulación Vcc esté dentro de las especificaciones, etc.

Además, no descartaría el software todavía. Busque diferencias, como en los datos de configuración, etc.

Y no se enorgullezca de pedir ayuda a un experto en hardware :-)

Actualización: nota sobre la medición de la ondulación de Vcc:

Tomado de mi respuesta a esta pregunta: ¿Cómo verifico que mi riel de alimentación de 3.3v cumpla con los requisitos para un SoC Ember EM357?

El mejor documento que conozco que describe cómo realizar esta medición es este: http://www.electrical-integrity.com/Quietpower_files/Quietpower-21.pdf

En resumen: use un cable coaxial soldado directamente a su placa. Ejecute el cable coaxial 50R en su osciloscopio configurado con una impedancia de entrada de 50R. Seleccione acoplamiento AC. Un ancho de banda que sea adecuado (mínimo 500 MHz). Y persistencia infinita.

Si realiza la medición con una sonda de alta impedancia con una "cola de cerdo" larga para tierra, es posible que tenga un ruido adicional no relacionado con el ruido Vcc recogido. En caso de duda, siempre realice el experimento nulo: toque la punta de la sonda con el punto de tierra, de modo que tanto la punta como la tierra de la sonda toquen el mismo punto en el tablero. Si no obtiene una línea plana, el acoplamiento inductivo capta algo en el bucle formado por la sonda y el cable de tierra.

Entonces, ¿tienes demasiado ruido? Suponga que la hoja de datos de este dispositivo requiere 3.3V +/-5% para el suministro de Vcc. Eso significa que tiene +/- 165 mV como límite. Supongamos que tiene una precisión del 2 % de su regulador de CC de 3,3 V. Y supongamos que tiene una caída de distribución del 0-1% en las conexiones entre el regulador y el dispositivo (cables, conectores, trazas, filtros, etc.). Eso deja un 2 % para el ruido/ondulación de CA o +/-66 mV (132 mVpp).

Hola Rolf, gracias por tu consejo. De hecho, ahora he doblado un conector USB real y he agregado otra edición que explica que la memoria USB ahora funciona. ¿Puede darme consejos sobre cómo puedo medir la ondulación de Vcc? Actualmente estamos alimentando la placa con un cargador de teléfono celular normal, y el USB también recibe 5 V directamente (pero el voltaje nunca cae por debajo de 4,9 V cuando lo verifiqué con el osciloscopio)
Genial que te vendría bien mi consejo. Agregué una nota sobre cómo hacer la medición de ondulación de Vcc.

Puede intentar conectar el blindaje del cable USB a la conexión a tierra del USB y ver si eso mejora la situación. El USB de alta velocidad es delicado con cosas como la impedancia del cable.

Gracias por la sugerencia. Intenté esto, pero desafortunadamente no parece haber ningún efecto en la señalización.

Hola. Con respecto a tu pregunta "¿Qué significa esta impedancia diferencial?" La impedancia diferencial de la línea es en realidad la resistencia del circuito impreso hasta el conector, dado que el USB es diferencial, será una impedancia diferencial. Entonces, una impedancia de una sola pista de, por ejemplo, D + será de 45 ohmios y la impedancia combinada de D + y D- será de 90 ohmios, ahora muy rápido, no puede medir esto con un simple voltímetro digital (DMV) por lo que probablemente no lo hará podrá verificar esto a menos que tenga un TDR en algún lugar cerca de usted. Con respecto a su problema, no es probable que sea causado por un desajuste de impedancia, una primera mirada le indica que no parece ser muy malo.

Si tiene preguntas sobre pruebas y problemas eléctricos, siempre puede consultar http://www.testusb.com/, este es un sitio web que escribimos algunos de mis colegas y yo.

¿Podría compartir una captura de pantalla de su esquema? Así que podemos echar un vistazo más profundo aquí.

Gracias por tu explicación. También he añadido las fotos a la publicación original, espero que te puedan ayudar.
¿Podría ser que hayas cambiado las líneas D+ y D-? Mirando la imagen de la primicia, veo que su señal está invertida a la otra y dice que su conector está girado 180 °. D- es verde y D+ es blanco ahora mirando el diagrama del conector, D- debe estar cerca de VCC y D+ cerca de GND mirando la conexión de la placa, esto es lo contrario. Podría ser que esté confundiendo algo aquí, ¡pero vale la pena verificarlo dos veces!
Jan, debes haber tenido razón con esto. Ahora quité el cable de extensión pirateado y doblé un conector real en un ángulo extraño, pero ahora la memoria USB funciona en HighSpeed. Sin embargo, todavía tengo el mismo problema con el dongle WiFi.