Estoy trabajando en un proyecto V-USB que aparece como un teclado usando un ATmega328p. La parte USB funciona muy bien (no es mi primer proyecto V-USB), pero después de comenzar con la pila V-USB usbInit(), todas las llamadas a la biblioteca de tarjetas SD fallan. Si llamo a las mismas funciones antes usbInit(), todo funciona perfectamente.
Yo uso un clon de Arduino llamado Diavolino, pero sin el marco de Arduino / cableado. Tengo el USB conectado a E / S digital 2 y 3, y la tarjeta SD a 10-13 (líneas SPI incorporadas).
Miré a través de la biblioteca de tarjetas SD y no encontré ninguna señal usando interrupciones o registros que no sean SPxx. También pensé en grepel código V-USB, pero ni siquiera toca los SPxxregistros.
La primera señal del problema fue cuando el dispositivo se desconectó cuando se suponía que debía acceder a la tarjeta SD. Luego puse usbPoll()y llamé wdt_reset()a todos los bucles de manejo de la tarjeta SD, y descubrí que en caso de escritura, la tarjeta espera para siempre el reconocimiento de la tarjeta después de haber enviado los dos últimos bytes (CRC-16).
La biblioteca de tarjetas SD que uso es sd_rawde Roland Riegel.

Respuestas:
Tuve un problema como ese con USART y lo resolví cambiando la configuración del perro guardián. Como sabe, V-USB utiliza un perro guardián y si dedica más tiempo a una operación, el perro guardián se activa. Intente desactivar el perro guardián y si ve que todo va bien, puede cambiar la hora del perro guardián o puede dividir el código interferente (los códigos de la tarjeta SD en su caso) en partes más pequeñas y "Restablecer" el perro guardián entre ellos. Pero no olvide volver a activar su perro guardián después de la depuración, ya que no se recomienda usar V-USB sin eso.
fuente