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 grep
el código V-USB, pero ni siquiera toca los SPxx
registros.
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_raw
de 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