La forma correcta de implementar hardware USB es seguir TODAS las recomendaciones del fabricante. Si un desarrollador de hardware no tiene experiencia con implementaciones de USB, la mejor manera es observar los esquemas y el diseño de las placas / kits de desarrollo.
En este caso particular, la implementación tiene varias deficiencias. En primer lugar, se debe tener en cuenta que se trata de un dispositivo de velocidad completa, y los efectos de la línea de transmisión (y, por lo tanto, la terminación de la fuente) desempeñan un papel secundario. Sin embargo, para "jugar bien", el fabricante usa resistores de la serie 22R, aparentemente para compensar la deficiencia del controlador eléctrico común a la IP de implementación de FS PHY barata. Este esquema es de la placa de desarrollo Olimex:
TodoslosesquemasdeaplicaciónquehevistoparaSTM32Fxxusan22R.
Unacosaesclara:22RpullupenD+enelsegundoesquemaesABSOLUTAMENTEinapropiado.
Ensegundolugar,siesteesundiseñosoloparadispositivos,debehaberdoscosas:
VBUSdelconectorTipoBdebeiraalgúnpindeE/Scomo"OTG_FS_VBUS" para que el sistema pueda detectar la presencia de VBUS en el cable conectado, y
-
El condensador VBUS debe ser más de 1 uF pero menos de 10 uF.
Otro detalle es que el circuito de protección contra ESD debe tener una polarización de 3.3V, no de + 5V.
Sin embargo, estos son detalles menores que no son críticos para el funcionamiento del dispositivo y la estabilidad de la interfaz.
Dada la vaga descripción de los problemas de "desconexión frecuente" con "ciertos hosts" pero no con otros, me atrevería a suponer que el problema es que el reloj de la interfaz USB está fuera del alcance. Diferentes hosts USB pueden tener diferentes tolerancias a la desviación de frecuencia de USB, y esta es la causa más común que se pasa por alto la inestabilidad de la interfaz.
Para asegurarse, debe ejecutar la prueba de diagrama de ojo en su puerto USB de la placa STM32F. Hay documentos sobre cómo realizar esta prueba, dependiendo del equipo que tenga. Google para {medida de diagrama de ojo usb}.
Las especificaciones USB exigen una desviación máxima de la velocidad de datos de 12 Mbps en + -2000 ppm. Algunos hosts pueden tolerar + -5000 ppm, unos 2200ppm. Es muy probable que el oscilador de cristal del sistema no esté sintonizado correctamente y que el reloj de la interfaz esté bastante apagado. El comportamiento típico es que todo puede estar bien en el proceso de enumeración donde los paquetes USB son cortos, pero los paquetes de datos más largos perderán la sincronización y la corrupción de los datos seguirá.
En general, cuando alguna interfaz se comporta de manera inestable, lo primero es asegurarse de que las amplitudes y frecuencias de la señal estén dentro de las especificaciones de la interfaz. La "ingeniería aleatoria", como la sustitución de resistencias o el empuje de pull-ups locos, generalmente no sirve de nada.