Estoy intentando diseñar un dispositivo USB de baja velocidad basado en ATmega16a. Ese chip no tiene ninguna interfaz USB, pero es posible usar bit banging e incluso hay bibliotecas ya hechas para hacerlo, como V-USB. Así que la parte de programación es bastante clara.
Lo que no está claro es cómo conectar físicamente AVR a USB. El problema es que el USB da + 5V, pero usa niveles de 3.3V en las líneas de datos D + y D- (que no siempre son diferenciales). El V-USB sugiere dos soluciones: ejecutar un AVR completo a 3.3 V (con dos diodos de sujeción en la línea de 3 V) o hacer un convertidor de nivel pésimo conectando dos diodos Zener de 3.6 V para sujetar el voltaje del AVR.
El USB de baja velocidad funciona a 1.5MHz, por lo que ATmega16A debería funcionar a 12 MHz. De acuerdo con la hoja de datos, no está calificado para funcionar de manera confiable a esa frecuencia cuando se alimenta desde 3.3V, así que tuve que ejecutarlo directamente desde 5V y la primera opción (con diodos de sujeción) no está disponible para mí.
He implementado esto en una placa de pruebas con zeners, así que el circuito de prueba funciona. Pero creo que esta no es una solución muy robusta, porque los datos de USB a AVR podrían estar en el margen de nivel de AVR 1. Pienso en usar un convertidor de nivel bidireccional, como txb0104.
Esta es mi pregunta: ¿funcionará el convertidor de nivel para líneas de datos USB? Quiero descubrir cómo analizar los parámetros de temporización en la hoja de datos para asegurar que no afecte demasiado la temporización de la señal USB.