Forum: Mikrocontroller und Digitale Elektronik AT45 Flash Device ID auslesen


von Simon (Gast)


Lesenswert?

Hallo,

hab hier im Forum bisle Source gefunden den ich mal testen wollte.

Es geht mir um das auslesen der Device ID eines AT45 Flash Speichers.

Ich bekomme jedoch nur 1 Byte zurück (0b00001100), Die anderen Bytes 
sind 0.

1
// Reset
2
SET_RESET;
3
_delay_ms(100);
4
CLEAR_RESET;
5
_delay_ms(100);
6
7
8
SET_PIN_CS;
9
SPI_write(0x9f);  // Senden von 0x9f Opcode 
10
for(uint8_t i = 0 ; i < 6 ; i++){
11
  ID1 = SPI_read();
12
  myuart_putc(ID1);
13
}
14
CLEAR_PIN_CS;


Ausschnitte aus spi.h
1
#define  SPI_SET_DDR    DF_SPI_DDR = (1<<DF_SPI_CLK | 1<< DF_SPI_DO | 1<<DF_SPI_CS | 1<<DF_SPI_RESET)
2
#define  SET_PIN_CS    DF_SPI_PORT &= (~(1<<DF_SPI_CS))
3
#define  CLEAR_PIN_CS    DF_SPI_PORT |=   (1<<DF_SPI_CS)
4
5
#define  SET_RESET    DF_SPI_PORT &= (~(1<<DF_SPI_RESET))
6
#define  CLEAR_RESET    DF_SPI_PORT |=   (1<<DF_SPI_RESET)
7
8
#define  SPI_ENABLE    SPCR = (0<<SPIE | 1<<SPI2X | 1<<SPE | 1<<MSTR | 0<<SPR0 | 1<<CPOL | 1<<CPHA)
9
#define  SPI_DISABLE    SPCR = 0

spi.c:
1
// ----------------------------------------------------------------------------
2
void SPI_init(void)
3
{
4
SPI_SET_DDR;                    // Ausgänge setzen
5
SPI_ENABLE;                      // siehe spi_hard.h  
6
CLEAR_PIN_CS;                    // CS auf high
7
SET_RESET;                      // einen Reset ausführen
8
CLEAR_RESET;                    // danach mindestens 20ms warten
9
}              
10
11
// ----------------------------------------------------------------------------
12
// schreibt das übergebene Byte via SPI raus
13
void SPI_write(uint8_t data)
14
{
15
SPDR = data;
16
while (!(SPSR & (1<<SPIF)));             // bis zum Abschluss der Übertragung warten
17
18
}
19
20
// ----------------------------------------------------------------------------
21
// schreibt ein dummy-Byte raus und gibt das vom Slave geschriebene Byte zurück
22
uint8_t SPI_read(void)
23
{
24
SPDR = 0;                      // dummy schreiben, startet den Lesevorgang
25
while (!(SPSR & (1<<SPIF)));              // bis zum Abschluss der Übertragung warten
26
return (SPDR);
27
}

von Simon (Gast)


Lesenswert?

Ich glaube langsam hier stimmt was mit dem SPI nicht.

Wenn ich auf SPI2X abschalte, dann erhalte ich
anstelle von:

0b00001100

ein:

0b11110000  (0xF0)

zurück

von Simon (Gast)


Lesenswert?

Ok Ich habs... Die 10k Widerstände

zwischen µC und Flash gehören raus :-)

Dann liefert der 2MBit Flash auf einmal 1F23 zurück, Was genau dem 
entspricht was ich sehen wollte.

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
Noch kein Account? Hier anmelden.