Hallo Leute,
ich habe eine ATXmega32e5 mit AT45DB161 (SPI Flash) verbunden.
Das ganze läuft leider nicht gut. SPI auf PORTC.
Ich habe mir die Sachen angeguckt, die Daten werden vom XMega korrekt
gesendet (SPI Modus 3), allerdings zieht der Slave (Flash-IC) den MISO
permanent auf 0, sodass keine Daten ankommen.
Als Bibliothek habe ich die von Atmel genommen, und im Netz habe ich
eine AT45 lib gefunden. Ich verstehe nicht ganz, warum der Slave nicht
reagiert.
Mach mal erst mal den Pullup auf dem Miso Pin an. Das DF zieht nur nach
Masse, wenn es über /CS selektiert ist. Und warum nimmst Du nicht
SPI-Mode 0? Ansonsten liegt der Fehler wie immer in Zeile 42.
Der Pullup ist an. Der zieht den auch nach unten, wenn er nicht
selektiert ist.
Warum sollte ich Mode 0 nehmen? Ist doch egal, oder?
Beim Flash, SO an MISO, SI an MOSI.
Wie ist das eigentlich bei dem Flash mit den Pages, habe ich das richtig
verstanden dass jede Page 256 Byte hat? Habe den AT45DB161D
@ Marius Dege (2009marius15)
>Warum sollte ich Mode 0 nehmen?
Weil der sinnvoller ist?
> Ist doch egal, oder?
Nö, denn einige Flash-Kommandos sind abhängig vom SPI-Mode (warum auch
immer).
>Beim Flash, SO an MISO, SI an MOSI.
Richtig.
>Wie ist das eigentlich bei dem Flash mit den Pages, habe ich das richtig>verstanden dass jede Page 256 Byte hat? Habe den AT45DB161D
In meinem Datenblatt steht was von 528 Bytes/Page, kann aber auch
EINMALIG auf 512 geändert werden.
Marius D. schrieb:> Der zieht den auch nach unten, wenn er nicht> selektiert ist.
Dann stimmt da etwas nicht. Der Miso-Pin am DF darf erst den Tristate
verlassen, wenn der Baustein selektiert ist. Hast Du das DF falsch
eingelötet oder Brücken drin?
@Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
>> Der zieht den auch nach unten, wenn er nicht>> selektiert ist.>Dann stimmt da etwas nicht. Der Miso-Pin am DF darf erst den Tristate>verlassen, wenn der Baustein selektiert ist.
Stimmt. Das kann man auch gut messen, indem man einen Spannungsteiler
10k+10k von VCC/GND an das Pin schaltet. Bei Tristate hat man dann VCC/2
auf dem Signal.
Hallo Leute,
ich habe mir das nochmal genauer angeguckt, und folgendes festgestellt.
Nach dem Initialisieren ist der MISO permanent auf 0V. Wenn ich die
Initialisierung weglasse, habe ich 3,3V.
Wenn ich nach der Initialisierung das Flash-IC resette, dann habe ich
dort ca. 2V ab und zu (Impulse von ca. 5µs). Dort scheint es aber, als
wenn der Controller gegen das Flash treibt. Ich gebe deswegen mal die
Funktionen mit.
1
voidAT45DB_init(void)
2
{
3
cli();
4
5
DDR_CTRL;
6
FLASH_ON;
7
8
/*
9
Mode 0: SCLK idles low. Data is setup on falling edge of SCLK. Data is sampled on rising edge of SCLK.
10
Mode 1: SCLK idles low. Data is setup on rising edge of SCLK. Data is sampled on falling edge of SCLK.
11
Mode 2: SCLK idles high. Data is setup on rising edge of SCLK. Data is sampled on falling edge of SCLK.
12
Mode 3: SCLK idles high. Data is setup on falling edge of SCLK. Data is sampled on rising edge of SCLK.
Hallo nochmals,
ich habe es hinbekommen, ich habe nun ein Signal auf dem MISO, jedoch
ist dieses als "High" ca. 2V, ich verstehe nicht, warum ich kein
richtiges Signal bekomme. Das was gesendet wird bei Anfrage 0xD7 ist
0xAC, womit ich auch nichts anfangen kann, unabhängig davon das der µC
das als LOW Signal erkennt.
@ Marius Dege (2009marius15)
>ich habe es hinbekommen, ich habe nun ein Signal auf dem MISO, jedoch>ist dieses als "High" ca. 2V, ich verstehe nicht, warum ich kein>richtiges Signal bekomme.
Dann zieht jemand anders das Pin auf LOW. Entweder ist dein MISO Pin
nicht auf Eingang gestellt oder du hast eine Lötbrücke auf eine anderes
Ausgangspin, das LOW treibt. ODer der VCC-Anschluß deines FLASH ist
nicht angeschlossen ;-)
Siehe Fehlersuche.
Zu SPI_MasterInit:
du schreibst zwar z. B. "SPI_MODE_0_gc", aber für den INT-Level nutzt du
nicht "SPI_INTLVL_OFF_gc". Das wäre zumindest schöner...
In der SPI_MasterInit wird MISO auf Input gesetzt, dein MISO_IN, welches
da drunter steht, würde ich entfernen.
Folgende Macros finde ich nicht, bitte ebenfalls posten:
SET_MISO_PULLED
MISO_IN
CLEAR_CS
SET_CS
DDR_CTRL
FLASH_ON
Und, falls vorhanden, das .lss File anhängen, damit man mal nachschauen
kann, ob die Whileschleife in deinem "SPI_MasterTransceiveByte" noch da
ist.
Unwahrscheinlich* zwar, aber sicher ist sicher.
*dass die weg ist
Hallo Leute,
danke für eure Antwort. Lötbrücke ist nicht der Fall.
Ich verstehe die XMega32e5 gar nicht mehr, ich habe das ganze mal
genauer Untersucht, und hier einen neuen Thread geöffnet (quasi
verschoben).
Beitrag "ATXmega32e5 SPI und Timer eliminieren sich gegenseitig?"
Das ganze scheint entweder ein XMEGA32e5 Problem zu sein, oder eine
Konfiguration. Ich verstehe es einfach nicht.