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 | void AT45DB_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.
|
13 | */
|
14 | |
15 | SPI_MasterInit(&spiMasterC, &SPIC, &PORTC, FALSE, SPI_MODE_0_gc, FALSE, FALSE, SPI_PRESCALER_DIV128_gc); /* Initialize SPI */ |
16 | |
17 | MISO_IN; |
18 | SET_MISO_PULLED; |
19 | |
20 | CLEAR_CS; |
21 | |
22 | /* Skip any pending bits */
|
23 | for(uint8_t i = 0; i < 20; i++) |
24 | SPI_MasterTransceiveByte(&spiMasterC, 0x00); |
25 | |
26 | wdt_reset(); |
27 | |
28 | _delay_us(25); |
29 | SET_CS; |
30 | _delay_us(5); |
31 | |
32 | sei(); |
33 | }
|
Hat jmd. eine Idee, was da falsch läuft? Takt ist übrigends 32Mhz intern. UART läuft damit.
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
:
Bearbeitet durch User
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.