Forum: Mikrocontroller und Digitale Elektronik MR25H10 per SPI will nicht


von fuenfe (Gast)


Lesenswert?

Hi,

hat jemand Erfahrung mit genannten MRAM von Everspin. Ich bekomme keine 
sinnvollen Daten über SPI ausgelesen.

/CS und /WP ist parmanent an High.
WEL-Bit im Status-Register des MRAM wird als erstes gesetzt mit dem 
Steuercode 0x06 Hex

Beim Auslesen des Status oder einer Speicheradresse bekomme ich nur 
Daten die keinen Sinn ergeben.

SPI-Bus sieht auf dem Logik Analysator gut aus.

Hat jemand eine Idee??

von Nico (nico123)


Lesenswert?

Wenn CS permanent auf High liegt, dann ist klar warum der Speicher nicht 
mit dir redet! CS bedeutet ChipSelect und ist low aktiv.

von fuenfe (Gast)


Lesenswert?

Fehler von mir. Ich meine /HOLD und /WP ist permanent auf High.

/CS wird für die Dauer der Übertragung natürlich auf Low gezogen. Ich 
bekomme ja auch Daten rein nur nicht die Richtigen. Der MRAM sendet 
Daten die nicht nachzuvollziehen sind.

von Nico (nico123)


Lesenswert?

Hältst Du denn das Protokoll des Speichers ein?
Zeig doch mal deine Schreib- und Lese-Routine!

von fuenfe (Gast)


Lesenswert?

Init
1
CLEAR_BIT(SPI_PORT_OUT,SPI_CS_MRAM_1);
2
_delay_us(4);   
3
FASTSPI_TX(MRAM_WREN); // Write Enable
4
SET_BIT(SPI_PORT_OUT,SPI_CS_MRAM_1);
5
_delay_us(4);

read status
1
CLEAR_BIT(SPI_PORT_OUT,SPI_CS_MRAM_1);
2
_delay_us(4);  
3
uint8_t temp;
4
FASTSPI_TX(MRAM_RDSR);
5
FASTSPI_RX(temp);
6
uart_putc(temp);    
7
SET_BIT(SPI_PORT_OUT,SPI_CS_MRAM_1);

schreiben
1
void MRAM_1_write(uint32_t add, uint8_t *data, uint16_t len)
2
{
3
  add &= 0x00FFFFFF; // max 24 Bit Address
4
  
5
//  uart_puts("\nMRAM write");
6
  
7
  CLEAR_BIT(SPI_PORT_OUT,SPI_CS_MRAM_1);
8
  
9
  FASTSPI_TX(MRAM_WRITE);
10
  FASTSPI_TX((uint8_t)(add >> 16));
11
  FASTSPI_TX((uint8_t)(add >> 8));
12
  FASTSPI_TX((uint8_t)(add >> 0));
13
  
14
  for (uint16_t i = 0; i < len; i++)
15
  {
16
    FASTSPI_TX(data[i]);
17
  }  
18
  
19
  SET_BIT(SPI_PORT_OUT,SPI_CS_MRAM_1);
20
}

lesen
1
void MRAM_1_read(uint32_t add, uint8_t *data, uint16_t len)
2
{
3
  add &= 0x00FFFFFF; // max 16 Bit Address
4
  
5
//  uart_puts("\nMRAM write");
6
  
7
  CLEAR_BIT(SPI_PORT_OUT,SPI_CS_MRAM_1);
8
  
9
  FASTSPI_TX(MRAM_READ);
10
  FASTSPI_TX((uint8_t)(add >> 16));
11
  FASTSPI_TX((uint8_t)(add >> 8));
12
  FASTSPI_TX((uint8_t)(add >> 0));
13
  
14
  for (uint16_t i = 0; i < len; i++)
15
  {
16
    FASTSPI_RX(data[i]);
17
  }
18
  
19
  SET_BIT(SPI_PORT_OUT,SPI_CS_MRAM_1);
20
}
1
#define FASTSPI_WAIT() while(!(SPSR & (1 << SPIF)))
2
3
#define FASTSPI_TX(x) \
4
    do { \
5
        SPDR = x; \
6
        FASTSPI_WAIT(); \
7
    } while (0)
8
9
#define FASTSPI_RX(x) \
10
    do { \
11
        SPDR = 0; \
12
        FASTSPI_WAIT(); \
13
        x = SPDR; \
14
    } while (0)
15
16
#define FASTSPI_RX_o(x) \
17
    do { \
18
        x = SPDR; \
19
    } while (0)

von Ich (Gast)


Lesenswert?

Ein Screenshot vom Logic Analyzer wo die ganze Sequenz drauf ist wäre 
auch interessant (mit SPI Decoder am besten).

Wie schnell ist deine SPI Clock und hälst du alle Timings des Chips laut 
Datenblatt ein?

von fuenfe (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe einen neuen MR25H10 jetzt funktioniert alles. Der alte Speicher 
war wohl defekt.

Den Screenshot vom Logic Analyzer habe ich trotzdem mal beigefügt, 
vielleicht hilft es jemanden anderem weiter.

Danke für eure Hilfe

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.