Wie kann V-USB das eingebaute SPI eines ATmega328p vermasseln?

14

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 grepden V-USB Code, aber er berührt nicht einmal die SPxxRegister.

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_rawvon Roland Riegel.

dnet
quelle
2
Ich verstehe, dass V-USB sehr CPU-intensiv ist und wahrscheinlich inakzeptable Verzögerungen bei den SPI-Routinen mit sich bringt. Normalerweise sind SPI-Vorgänge nicht zeitabhängig, Schreib- und Löschvorgänge auf SPI FLASH jedoch definitiv.
Dave Tweed
Das Problem ist, dass selbst Leseoperationen die meiste Zeit nicht funktionierten, und wie ich gelesen habe, werden SPI-Kommunikationen unabhängig voneinander ausgeführt, sobald die Daten- und Steuerregister durch den laufenden Code festgelegt werden.
Dienstag,
@ DaveTweed - zeitkritisch in Bezug auf das Warten auf die Karte ja, aber in Bezug darauf, dass die Karte nicht auf Ihr Programm warten kann?
Chris Stratton
2
Wahrscheinlich warten Sie auf etwas, das entweder nicht passieren kann oder nicht erkannt werden kann. Beispielsweise könnte der E / A-Pin neu konfiguriert worden sein und kein Eingang mehr sein, oder es könnten falsche Daten / Takte an die Karte gesendet worden sein, um sie in einen unerwünschten Zustand zu versetzen. Stellen Sie außerdem sicher, dass der Mechanismus, mit dem die SD-Bibliothek die erforderlichen Verzögerungen ausführt, nicht unterbrochen oder beschleunigt wurde.
Chris Stratton
3
Möglicherweise haben Sie auch Lärm- oder Stromversorgungsprobleme. Überprüfen Sie Ihre Schienen mit einem Zielfernrohr und überprüfen Sie die SD-Leitungen mit einem Logikanalysator, um zu sehen, was los ist.
Jim Paris

Antworten:

1

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.

Aug.
quelle
Beachten Sie, dass in der Frage erwähnt wird, dass wdt_reset () -Aufrufe in den SD-Code eingefügt wurden. obwohl es natürlich möglich ist, dass dies nicht überall gemacht wurde.
Chris Stratton
1
Ja, aber es lohnt sich wirklich, den Code zum Deaktivieren des Wachhundes auszuprobieren. Manchmal, besonders wenn die zurückgegebenen Daten in einer Interruptroutine verarbeitet werden, bleibt der Code dort hängen und der Watchdog wird aktiviert, bevor er zurückgesetzt wird
August