SPI Verbindung zu EEPROM funktioniert nicht (25AA640A)

Gast #7030217
Hallo miteinander

Ich habe mir kürzlich ein Analog Discovery 2 Oszilloskop / 
Logic-Analyzer gekauft und wollte damit die SPI Funktion mit einem 
25AA640A Serial EEPROM von Microchip testen.

Als ersten Test wollte ich einfach das Statusregister des Chips auslesen 
(e. auch "read_status_register.png" aus dem Datenblatt 
(https://ww1.microchip.com/downloads/en/DeviceDoc/25AA640A-25LC640A-64K-SPI-Bus-Serial-EEPROM-20001830G.pdf).

Die Bilder "spi_logic_analyzer_0.png" und "spi_logic_analyzer_1.png" 
sind Aufzeichnungen des Logic-Analyzers Outputs welche zum Chip gesendet 
wurden.

Wie man allerdings sieht, erhalte ich keine Antwort auf der MISO 
Leitung.

Die beiden Leitungen ¬WP (Write-Protect) und ¬HOLD ziehe ich auf 5V hoch 
wie im Datenblatt angemerkt.

Die Schaltung ist auf einem breadboard zusammengesteckt und ich dachte 
mir da gäbe es evtl. Kontaktprobleme, habe daher einige Signale auch 
direkt an den Pins des ICs gemessen (also Sonde direkt ans Bein), ist in 
"spi_mosi_clk_scope.png" gezeigt).

Mir ist es zuvor schon misslungen, mit einem SPI Potentiometer zu 
kommunizieren (MCP42100).

Ich weiss daher nicht, ob ich etwas generelles an SPI nicht verstehe 
oder wo der Fehler liegen könnte?
Tom schrieb:
> Mir ist es zuvor schon misslungen, mit einem SPI Potentiometer zu
> kommunizieren (MCP42100).
>
> Ich weiss daher nicht, ob ich etwas generelles an SPI nicht verstehe
> oder wo der Fehler liegen könnte?

In einem deiner Bilder bleibs CS auf LOW, das geht bisweilen schief. 
Mach es wie im Datenblatt. Zum Begin der Übertragung auf LOW, am Ende 
auf HIGH setzen.

Mit welcher CPU willst du das Dinge denn auslesen? Wenn es ein AVR ist, 
MUSS das Pin SS auf Ausgang konfiguriert sein, siehe Datenblatt "SS pin 
functionality"
Gast
Falk B. schrieb:
> Tom schrieb:
>> Mir ist es zuvor schon misslungen, mit einem SPI Potentiometer zu
>> kommunizieren (MCP42100).
>>
>> Ich weiss daher nicht, ob ich etwas generelles an SPI nicht verstehe
>> oder wo der Fehler liegen könnte?
>
> In einem deiner Bilder bleibs CS auf LOW, das geht bisweilen schief.
> Mach es wie im Datenblatt. Zum Begin der Übertragung auf LOW, am Ende
> auf HIGH setzen.
>
> Mit welcher CPU willst du das Dinge denn auslesen? Wenn es ein AVR ist,
> MUSS das Pin SS auf Ausgang konfiguriert sein, siehe Datenblatt "SS pin
> functionality"

Hallo und vielen Dank für die Antwort.

Die CPU wäre schlussendlich ein TMS320F28388D, allerdings benutze ich 
momentan gar keine CPU, die Signale werden vom Analog Discovery 2 
erzeugt.

Mir geht es eigtl. nur darum, dass ich SPI und I2C Chips und deren 
Instruktionen kurz mit einem einfachen Setup testen kann bevor ich den 
entsprechenden C Code auf dem Mikrocontroller meiner Wahl implementiere. 
Ich denke, das könnte beim Prototyping hilfreich sein.

Das Analog-Discovery 2 hat die Möglichkeit, ein Javascript Programm 
auszuführen welches eine Ansteuerung mittels SPI und I2C erlaubt. Der 
folgende Code z.B. erzeugt die obig gezeigten Signale:
1
//pull ¬CS line low
2
Start();
3
//read status register
4
Write(8,[0x05,0xFF]);
5
//pull ¬CS line high
6
Stop();

Das die ¬CS Leitung manuell mit der 'Start()' und 'Stop()' Funktion hoch 
bzw. runtergezogen werden muss entsteht zwischen der Flanke des ¬CS 
Signals und dem SPI CLK meistens eine Verzögerung von etwa 1ms wie in 
"spi_logic_analyzer_0.png" gezeigt. (Die ¬CS Leitung wird auch in 
'spi_logic_analyzer_1.png" von hoch auf tief gezogen, allerdings sieht 
man das bei der Timebase nicht).
Gast
OT2048 schrieb:
> Ist eventuell der Inhalt des Status-Registers = 0x00?

Tatsächlich handelt es sich hierbei um die richtige Antwort, vielen 
Dank!

Wenn ich zunächst mittels
1
//pull ¬CS line low
2
Start();
3
//read status register
4
Write(8,0x06);
5
//pull ¬CS line high
6
Stop();

Das WEL Bit setze messe ich nachher den korrekten Wert, s. angehängtes 
Bild.
Angehängte Dateien:
Gast
Sorry, der Code zum setzen des Write-Enable Bits ist falsch kommentiert, 
das folgende Skript funktioniert:
1
//pull ¬CS line low
2
Start();
3
//set the write enable bit to high
4
Write(8,0x06);
5
//pull ¬CS line high
6
Stop();
7

8
//pull ¬CS line low
9
Start();
10
//read status register
11
Write(8,[0x05,0xFF]);
12
//pull ¬CS line high
13
Stop();

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.