Flash-Speicher SPI MISO-Leitung reagiert nicht, verwendet PIC

Ich verbinde eine Flash-Speicherkomponente ( M25P16 ) über SPI mit einem PIC-Mikrocontroller ( PIC18F14K22 ). Ich kann jedoch überhaupt keine Daten auf der Slave-Ausgangsleitung sehen (buchstäblich nichts, als ob der Chip nicht einmal in der Schaltung wäre).

Anbei ist ein Logikanalysator-Trace und ein Schaltplan. Der logische Snapshot versucht, die Geräte-ID mit dem Befehl 0x9E zu lesen, gefolgt von einigen leeren Taktzyklen, um die Daten zu lesen. Wie Sie sehen können, ist die SO-Leitung tot.

Ich glaube, ich habe die Taktpolarität und -phase richtig eingestellt (Daten werden von PIC an der steigenden Flanke des Takts ausgegeben, und der Takt ist im Leerlauf niedrig / aktiv hoch. Außerdem wird mein Chipauswahlstift hoch gehalten (über Pull -up) während des Starts und dann für die Transaktion niedrig gefahren.Die Taktgeschwindigkeit beträgt 500 kHz, weit unter der maximalen Geschwindigkeit.Schreibschutz- und Halteleitungen sind an Vcc gebunden, was 3,3 V beträgt.Ich habe Pulldown-Widerstände für die Daten- und Taktleitungen um sie im Leerlauf niedrig vorzuspannen, obwohl ich versucht habe, die MISO-Leitung auch schweben zu lassen, ohne Erfolg.

Irgendwelche Ideen? Danke!

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

logische Spur

Wie ist der Status Ihres CKE-Bits in SSPSTAT und Ihres CKP-Bits in SSPCON1? Kurze Antwort, probieren Sie verschiedene Kombinationen zum Setzen und Löschen dieser Bits aus. SPI ist ein sehr einfach zu implementierendes Protokoll, und die meisten Probleme gehen auf diese beiden Bits zurück.
Danke @MattYoung. Sie sind SSPSTATbits.CKE = 1 und SSPCON1bits.CKP = 0; Dadurch wird der Takt im Leerlauf niedrig und das Verhalten bei steigender Flanke ausgegeben. Ich habe versucht, alle vier Optionen ohne Glück durchzugehen.

Antworten (2)

Soweit ich das beurteilen kann, machst du alles richtig.

Wenn das hier auf meiner Werkbank läge, würde ich als nächstes Folgendes tun:

Bei Produktionseinheiten würde ich den Widerstand auf MISO zu einem Pull-up und nicht zu einem Pull-down machen. Seite 37 des Datenblatts garantiert nur 100 uA bei "MISO out high", aber mehr als das 10-fache des Stroms bei "MISO out low". Die 1,6 mA auf "MISO out low" reichen aus, um eine hocheffiziente LED mit einem geeigneten Pull-up-Widerstand auf +3,3 V (schwach) zu beleuchten. Ich finde, das Hinzufügen von LEDs zu jedem fragwürdigen Signal hilft mir, Probleme schneller zu finden. Die 100 uA auf "MISO out high" bedeuten, dass der Flash-Chip nicht mit einem Pulldown von 33 KOhm oder weniger arbeiten sollte.

Auf meiner Testvorrichtung (aber nicht auf Produktionseinheiten) würde ich den Widerstand auf MISO vorübergehend ändern, um MISO schwach auf etwa 1,5 V zu ziehen - das hilft bei der Unterscheidung zwischen hoch (nahe 3,3 V), niedrig (nahe 0 V) ​​und Tristate (nahe 1,5 V).

Ich würde den Test erneut ausführen und sicherstellen, dass das einzige , was mit MISO verbunden ist, die O'scope- (oder Logikanalysator-) Sonde und dieser Vorspannungswiderstand - nicht einmal der angeschlossene PIC - ist, um die Möglichkeit auszuschließen, dass der PIC irgendwie ist versehentliches Fahren von MISO auf GND.

Ich würde ein benutzerdefiniertes Testprogramm auf dem PIC erstellen, das nichts anderes tut, als den Flash-Chip auszuwählen, eine READ IDENTIFICATION zu versuchen und 20 Bytes zu lesen, dann den Flash-Chip abzuwählen und dann für immer zu wiederholen. (Es sieht so aus, als hätten Sie das vielleicht schon getan).

Es ist theoretisch möglich, dass ein PIC-Chip gerade so beschädigt wird, dass er Signale liefert, die für den Logikanalysator kaum stark genug sind, um "0" von "1" zu unterscheiden, aber nicht stark genug für den Flash-Chip, um sie zu unterscheiden.

Ich könnte also die Spannungen überprüfen, indem ich (a) das benutzerdefinierte Testprogramm so anpasse, dass es den CLK mit 1 Hz ausführt, sodass ich jede Zeile auf dem Flash-Chip mit einem Voltmeter überprüfen kann, oder (b) das Testprogramm mit einem typischeren Wert ausführe Geschwindigkeit - 500 KHz oder 10 MHz sollten gut funktionieren - und jeden Pin mit einem tatsächlichen Oszilloskop (nicht nur einem Logikanalysator) überprüfen.

Es ist ziemlich einfach, einen Flash-Chip zu zerstören, so dass er bei visueller Inspektion gut aussieht, aber so beschädigt ist, dass er jetzt niemals funktioniert (immer Tri-State oder immer 0 ausgibt).

Tauschen Sie vielleicht den Flash-Chip gegen einen "identischen" M25P16-Chip auf etwas wie dem JeeLink aus und sehen Sie, ob das Problem dem Flash-Chip folgt oder beim PIC-Chip bleibt.

Bauen Sie vielleicht die gesamte Schaltung mit neuen Drähten, einem neuen PIC-Chip und einem neuen Flash-Chip neu auf und tauschen Sie die Chips aus, um zu sehen, ob das Problem dem PIC-Chip, dem Flash-Chip oder den Prototyp-Drähten folgt.

Ja, und während Sie mit den Pull-Widerständen spielen, sollten Sie überprüfen, ob das Umschalten zwischen einem Pulldown und einem Pullup tatsächlich den Zustand der MISO-Leitung ändert, dh, dass sie nicht mit Masse kurzgeschlossen ist oder von einer falsch konfigurierten MCU als Ausgang angesteuert wird.
Die von Ihnen erwähnten 100 µA sind keine Einschränkung - sie sind die Testbedingung. Die Spezifikation garantiert also, dass die Ausgangsspannung nicht mehr als 0,2 V unter Vcc abfällt, wenn die Last am Ausgang 100 µA beträgt. Die Last kann jedoch höher sein - Sie haben dann nur einen höheren Spannungsabfall (der bei gegebenen CMOS-Logikpegeln 1 V betragen könnte). Leider gibt die Spezifikation keine Grenzen...

Wenn der obige Schaltplan Ihre vollständige Schaltung ist: Fügen Sie dem EEPROM (zwischen Vcc und GND) einen Entkopplungskondensator (100 nF) und möglicherweise auch einen dem PIC hinzu.

Die Pulldown-/Pullup-Widerstände können entfernt werden, obwohl sie das angezeigte Verhalten nicht beeinflussen sollten.

Die seriellen Daten, die Sie an das EEPROM senden, sehen gut aus, verglichen mit den Angaben im M25P16-Datenblatt (auf Seite 9). Ich denke also, es ist kein SPI-Problem, sondern etwas auf der Seite des EEPROM.

Einverstanden, sie könnten entfernt werden. Ich hatte sie ursprünglich nicht, habe sie aber hinzugefügt, um die Logikspur zu "bereinigen".