Ich arbeite an einem V-USB-Projekt, das mit einem ATmega328p als Tastatur angezeigt wird. Der USB-Teil funktioniert gut (es ist nicht mein erstes V-USB-Projekt), aber nachdem ich den V-USB-Stapel mit gestartet habe, schlagen usbInit()
alle Aufrufe der SD-Kartenbibliothek fehl. Wenn ich vorher die gleichen Funktionen aufrufe usbInit()
, funktioniert alles einwandfrei.
Ich verwende einen Arduino-Klon namens Diavolino, aber ohne das Arduino / Wiring Framework. Ich habe den USB an Digital I / O 2 und 3 angeschlossen und die SD-Karte an 10-13 (eingebaute SPI-Leitungen).
Ich durchsuchte die SD-Kartenbibliothek und fand keine Anzeichen dafür, wenn ich andere Interrupts oder Register als verwendete SPxx
. Ich würde zwar auch grep
den V-USB Code, aber er berührt nicht einmal die SPxx
Register.
Das erste Anzeichen für das Problem war, dass das Gerät getrennt wurde, als es auf die SD-Karte zugreifen sollte. Dann habe ich alle SD-Kartenhandhabungsschleifen abgelegt usbPoll()
und wdt_reset()
aufgerufen und festgestellt, dass die Karte beim Schreiben nach dem Senden der letzten zwei Bytes (CRC-16) für immer auf die Bestätigung von der Karte wartet.
Die von mir verwendete SD-Kartenbibliothek stammt sd_raw
von Roland Riegel.
Antworten:
Ich hatte ein solches Problem mit USART und löste es, indem ich die Watchdog-Einstellungen änderte. Wie Sie wissen, verwendet V-USB einen Wachhund. Wenn Sie in einem Vorgang zusätzliche Zeit investieren, wird der Wachhund aktiviert. Versuchen Sie, den Wachhund zu deaktivieren, und wenn Sie sehen, dass alles gut läuft, können Sie die Wachhundzeit ändern oder den Störcode (in Ihrem Fall die SD-Kartencodes) in kleinere Teile aufteilen und den Wachhund dazwischen "zurücksetzen". Vergessen Sie jedoch nicht, Ihren Watchdog nach dem Debuggen wieder zu aktivieren, da die Verwendung von V-USB ohne diesen nicht empfohlen wird.
quelle