Intermittierender SPI-Bus

Ich versuche, einen PIC18F4520 über das SPI-Protokoll an einen 25LC640 anzuschließen. Ich verwende die eingebaute MSSP-Hardware des PIC. Der PIC18F4520 ist der einzige Master am Bus. Ich lese 16 Byte Daten 32 Mal pro Sekunde aus dem EEPROM. Ich habe die folgenden Punkte doppelt überprüft:

  1. TRIS-Register für SDI, SDO, SCK und CS
  2. Baudrate ~ 1 MHz
  3. SPI-Modus 0,0

Ich habe die Signale auf einem Oszilloskop überprüft und alles sieht gut aus. Ich habe versucht, eine BusBee zu verwenden, um die Daten aus dem EEPROM zu protokollieren, und in 99% der Fälle ist es korrekt. Hin und wieder gibt es eine Reihe von Anfragen, bei denen die MOSI (SDO)-Leitung nicht die richtige EEPROM-Leseanweisung zu enthalten scheint, was dazu führt, dass die Daten, die in das Mikro getaktet werden, ungültig sind. Dies geschieht, obwohl ich jedes Mal dieselbe Leseanweisung in den SSPBUF schreibe. Was kann bei einem SPI-Bus noch schief gehen?

Hast du ein Oszilloskop, um das analoge Signal anzuzeigen? Selbst wenn Sie kein teures digitales/analoges MSO für die Protokollierung haben, um das Paket zu erfassen, das den Fehler enthielt, können Ihnen (und denjenigen, die zu helfen versuchen) einige "Einzelproben"-Läufe viel sagen.
Ich habe das Oszilloskop im Einzelprobenmodus ausgeführt, aber alle Proben, die ich aufnehme, sehen gut aus. Der Fehler tritt so selten auf und für eine so kurze Dauer konnte ich ihn nicht nur auf dem Busanalysator erfassen, der die analogen Spannungen oder Impulsbreiten nicht anzeigt.

Antworten (3)

In der Vergangenheit habe ich festgestellt, dass einige der PIC-Datenblätter die SPI-CPOL- und CPHA-Register nicht korrekt anzeigen. Es gab einige Probleme, dass beim Betrachten der Ausgabe auf einem Oszilloskop zwei der vier Kombinationen anders als erwartet waren . Überprüfen Sie also noch einmal, ob Sie tatsächlich die erwartete Wellenform aus Ihrem PIC erhalten und ob die Wellenform mit dem übereinstimmt, was auf dem EEPROM benötigt wird.

Ich bin auch auf einige A/D-Wandler gestoßen, die zeitweise funktionierten, als ich falsche SPI-Einstellungen auf einem HC12 hatte, mich dazu brachten, es herauszufinden, war eines meiner ersten Projekte als professioneller Ingenieur, schließlich habe ich es geschafft. Aber ich schweife ab. Daher ist es möglich, dass bei Verwendung des SPI-Busses zeitweise Probleme auftreten, wenn CPOL/CPHA falsch eingestellt ist. Da es sich schließlich um ein Schieberegister handelt, kann das letzte Bit eines Zeichens vom ersten des nächsten Zeichens gelesen werden. Diese Art von Problem wird möglicherweise auch nicht sofort bemerkt.

Stellen Sie also sicher, dass Sie die richtigen Einstellungen an einem Oszilloskop haben, und verlassen Sie sich nicht darauf, nur die Register des PIC einzustellen.

Ich bin mir nicht sicher, ob es der PIC18F4520 oder der 25LC640 war, der im SPI-Modus 00 nicht richtig funktioniert hat, aber beide funktionieren im Modus 11.

Wenn Sie einen Schaltplan haben, posten Sie ihn, auch alle Informationen darüber, wie Sie die Signalleitungen behandeln. Bei 1-MHz-Übertragungsleitungseffekten können Effekte ins Spiel kommen. Sie haben erwähnt, dass Sie das Signal erfasst haben und alles gut aussah, aber haben Sie die Anstiegs- / Abfallzeiten, Reflexionen und das Klingeln überprüft? Sind Ihre Signalleitungen terminiert und impedanzgesteuert? Wie lang sind sie?

Andere zufällige Dinge könnten sein:

  • Fehler im Code, erstellen Sie ein minimales Programm, das nichts anderes tut, als zum Testen aus dem EEPROM zu lesen
  • Überprüfen Sie vor Beginn der Übertragung, ob die CS-Einrichtung und die Haltezeiten korrekt sind
  • Schreibst du auch ins EEPROM? Wenn ja, überprüfen Sie das Statusregister, um sicherzustellen, dass der Schreibvorgang abgeschlossen ist, bevor Sie einen Leseversuch unternehmen?
  • Verwenden Sie die Slew-Rate-Steuerung im MSSP? Überprüfen Sie in jedem Fall, ob Ihre minimalen / maximalen Anstiegs- / Abfallzeiten innerhalb der EEPROMS-Grenzen liegen.
Ich habe die Anstiegs- und Abfallzeiten überprüft, sie liegen weit unter dem Datenblattmaximum von 2 us. Es scheint keine Reflexionen oder Klingeln auf dem Signal zu geben.
Ich dachte, die Slew-Rate-Steuerung gilt nur für I2C. Ich taste die Daten in der Mitte der Ausgabezeit ab (SMP=0).
CS-Setup- und Haltezeiten betragen ~ 10 us Datenblatt besagt, dass die Mindestzeit 500 ns beträgt. Gibt es ein Problem mit einer zu langen CS-Setup- oder Haltezeit?
Sollte bei längerer Nutzung von CS kein Problem sein. Wenn die Signalintegrität in Ordnung ist, würde ich nach einem Fehler im uC-Code suchen und einen minimalistischen Testfall erstellen.

Ich hatte ähnliche zeitweilige Fehler und fand heraus, dass es ein Fehler im Code war. Es hatte nichts mit SPI zu tun, aber von Zeit zu Zeit wurde der Chip zurückgesetzt und dies führte dazu, dass Müll in den On-Chip-Speicher geschrieben wurde. Stellen Sie sicher, dass Ihr Code stabil ist. Eine Möglichkeit, dies zu tun, wäre beim Zurücksetzen, dass Sie eine Taste drücken müssen, damit es nicht automatisch neu gestartet wird.

Guter Gedanke! Ich habe eine Meldung, die ich beim Start auf RS-232 drucke. Das Programm scheint nicht zurückgesetzt zu werden.
Oder lassen Sie beim Einschalten ein Licht aufleuchten, damit es für Sie offensichtlich ist.
ist der Watchdog-Timer übergelaufen und hat den Chip zurückgesetzt?