SPI Verbindung zu EEPROM funktioniert nicht (25AA640A)

Gast #7030217
Lesenswert?

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?
#7030229
Lesenswert?

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 #7030248
Lesenswert?

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 #7030302
Lesenswert?

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 #7030306
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren