Hi Leute, ich hab mit dem angehängten Code ein paar Probleme, und zwar bekomme wenn ich das Statusregister auslese immer den Wert "0x7D" -> 0b0111 1110 ausgegeben. Das stimmt allerdings nicht mit dem Datenblatt des Flash Speichers überein. Darin steht, dass mindestens Bit4 = 0 sein muss. Daraus folgere ich, dass es wohl ein Timing-Problem ist, nur leider hab ich gerade kein Oszilloskop zur Hand um mal nach zumessen. Die Verbindungen zum Speicher hab ich jetzt 8mal gecheckt (/CS und /RS liegen auf High. Ich steh aufm Schlauch und find den Fehler nicht :(! Vielen Dank für eure Hilfe Gruß Matze
Mathias H. schrieb: > (/CS und /RS > liegen auf High. Die Funktion von /CS aus dem Datenblatt des AT45... ist Dir aber schon bekannt, oder? Die /CS Funktion in Deinem Code ist auskommentiert... !
/CS liegt per Widerstand direkt an VCC, sprich 3,3V. d.h. der Speicher ist dauerhaft selektiert. Deshalb ist das auskommentier.
Habe das Datenblatt des Speichers nur überflogen. Aber: 1.) /CS ist low-aktiv 2.) /CS ist flanken- und nicht zustands-getriggert -> low-high Übergang ist als "Abschluß" notwendig!
habe die Schaltung und das Programm geändert, jetzt bekomme ich "0xF3" ->11110011 richtig wäre es, wenn die Nullen eins nach links geschoben wären... Bit 3 und 4 sollen lt Datenblatt 0 sein (benutze jetzt den AT45DB08)
1 | unsigned char Read_Status(void) // lesen von ADDR1 |
2 | {
|
3 | unsigned char retval; // Rückgabewert; |
4 | PORT_CSB_OUT |= PIN_CSB; // select EEPROM, CS = 0; |
5 | write_SPI(0x00); |
6 | write_SPI(STATUS_REGISTER_READ); |
7 | |
8 | while (!(IRQ_REG & RX_IFG)); |
9 | PORT_CSB_OUT &= ~PIN_CSB; // deselect EEPROM, CS = 1; |
10 | wait_ms(10); |
11 | retval = RX_BUFFER; |
12 | return retval; |
13 | }
|
Mathias H. schrieb: >(benutze jetzt den AT45DB08) In meinem Datenblatt steht STATUS_REGISTER_READ = D7h > unsigned char Read_Status(void) // lesen von ADDR1 > { > unsigned char retval; // Rückgabewert; > PORT_CSB_OUT |= PIN_CSB; // select EEPROM, CS = 0; > write_SPI(0x00); > write_SPI(STATUS_REGISTER_READ); > > while (!(IRQ_REG & RX_IFG)); > PORT_CSB_OUT &= ~PIN_CSB; // deselect EEPROM, CS = 1; > wait_ms(10); > retval = RX_BUFFER; > return retval; > } muss doch wohl erst
1 | write_SPI(STATUS_REGISTER_READ); |
2 | while (!(IRQ_REG & RX_IFG)); |
und dann
1 | write_SPI(0x00); |
sein, oder? Und anstatt der 10ms wait kannst Du doch auch mit
1 | while (!(IRQ_REG & RX_IFG)); |
warten, bis die Daten eingelesen sind!
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.