En primer lugar, las macros cbi / sbi (PORT, PIN) están en desuso. Yo aconsejo usar
PORT &= ~(1<<PIN); //Clear
PORT |= (1<<PIN); //Set
La hoja de datos AT90USB128 indica que:
Si PORTxn está escrito como lógico cuando el pin está configurado como un pin de entrada, la resistencia pull-up es
activado. Para apagar el resistor pull-up, se debe escribir PORTxn con lógica cero o el pin debe
Se configurará como un pin de salida. Los pines del puerto están en triple estado cuando la condición de reinicio se activa.
incluso si no hay relojes en ejecución.
Por lo tanto, si los pines están configurados como entradas, su comando deshabilitará los pull-ups internos.
Habiendo dicho eso, su configuración probablemente no funcionará a menos que sus dispositivos de 3.3V sean tolerantes a 5V. Recomendaría usar un simple cambio de nivel bidireccional, que se explica en la popular nota de NXP / Philips encontrada aquí . Solo requiere un FET N-ch y dos resistencias de pull-up por línea de bus.
Alternativamente, si tiene acceso a la fuente de alimentación de 3.3V, puede usar esto para alimentar la MCU cortando la conexión entre VBUS y UVCC / AVCC / VCC (hoja de datos Fig. 21-5).