Forum: Mikrocontroller und Digitale Elektronik FRAM via SPI


von Torsten A. (torsten_a)


Angehängte Dateien:

Lesenswert?

Hallo,

ich möchte mit einen atmega2560 einen F-RAM (FM25H20 mit 2Mb Serial 3V) 
via SPI betreiben. Bisher sind meine Versuche nicht gerade von Erfolg 
gekrönt.

Der Atmega wird mit einen externen 8 MHz Quarz betrieben.

Der FRAM FM25H20 unterstützt: Very Fast Serial Peripheral Interface - 
SPI
• Up to 40 MHz Frequency
• Direct Hardware Replacement for Serial Flash
• SPI Mode 0 & 3 (CPOL, CPHA=0,0 & 1,1)

[http://www.ramtron.com/files/datasheets/FM25H20_ds.pdf]

-kurze Pinbelegung am Atmega:

PB3(MISO),
PB2(MOSI),
PB1(SCK),
PB6(/CS) vom FRAM (low active)



Meine SPI Initialisierung lautet:
1
/********************************************************************************************
2
*               FRAM_SPI_INIT_START FUNCTION
3
*
4
* Description : This function initialize the SPI communication.
5
*               data rate 4 MHz (Double SPI Speed)
6
* Arguments   : None
7
* Returns     : None
8
* Note        : Internal Function
9
*********************************************************************************************/
10
//SPI2X SPR1 SPR0 (SPR[2:0])
11
//SPR[2:0]       Divisor     Frequency ( E=8 MHz )
12
//000              2           4.0 MHz
13
void fram_spi_init_start(void)
14
{  
15
  // MISO=input, etc.=output
16
  DDRB &= ~(1 << PB3);
17
  DDRB |= (1 << PB2) | (1 << PB1) | (1 << PB6);
18
  
19
  
20
  // PB3(MISO), PB2(MOSI), PB1(SCK), PB6(/CS)
21
  PORTB |= (1 << PB6); // CS=1, waiting for SPI start    
22
  PORTB &= ~((1 << PB3) | (1 << PB2) | (1 << PB1)); 
23
  
24
  
25
  /* set SPI Control Register */
26
  /* SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 */
27
  /*    0     1    0     1    0     0   0      0   */
28
  SPCR = 0x00;
29
  SPCR = (1<<SPE) | (1<<MSTR); // SPI enable / Mode 0 / fosc/2 
30
  
31
  /* set SPI Status Register */
32
  /* SPIF | WCOL | - | - | - | - | - | SPI2X */
33
  SPSR = 0x01;                // SPI2X = 1 = Double SPI Speed Bit (fosc/2)
34
}



Mit der nachfolgenden Funktion sollen Daten geschrieben oder gelesen 
werden:
1
/********************************************************************************************
2
*               FRAM_SPI_IO_BYTE FUNCTION
3
*
4
* Description : This function writes/reads one byte into/from FRAM.
5
* Arguments   : 16 bit address, 8 bit data, data direction (wr=1; rd=0)
6
* Returns     : 8 bit data
7
* Note        : Internal Function
8
*********************************************************************************************/
9
unsigned char fram_spi_io_byte(unsigned int addr, unsigned char data_out, unsigned char data_direction)
10
{
11
  unsigned char data = 0;    
12
13
  /* SPI MODE I/F initialization */
14
  fram_spi_init(data_direction);
15
16
  /* set address */
17
  fram_spi_set_addr(addr);
18
  
19
  if(data_direction)
20
  {
21
    SPDR = data_out;  // write data
22
  } else
23
  {
24
    SPDR = 0x00;    // dummy value for shift register
25
  }
26
  while((SPSR&0x80)==0x00);
27
   
28
  if(!(data_direction))
29
  {
30
    data = SPDR;     // read data
31
  } 
32
33
  /* terminate spi data transfer */
34
  fram_spi_end();  
35
36
  if(data_direction)
37
  {
38
    return 1;
39
  } else
40
  {
41
    return data;
42
  }  
43
}

hier noch die Funktionen: fram_spi_init() + fram_spi_set_addr() + 
fram_spi_end()
1
/********************************************************************************************
2
*               FRAM_SPI_INIT FUNCTION
3
*
4
* Description : This function initialize the SPI communication.
5
* Arguments   : data direction (write=1; read=0)
6
* Returns     : None
7
* Note        : Internal Function
8
*********************************************************************************************/
9
void fram_spi_init(unsigned char data_direction)
10
{  
11
  PORTB &= ~((1 << PB3) | (1 << PB2) | (1 << PB1) | (1 << PB6)); // CS=0, SPI start
12
  
13
  if(data_direction)
14
  {
15
    SPDR = 0x02;    // write (Op-code Command Write Memory Data 0000 0010b)
16
  } else
17
  {
18
    SPDR = 0x03;    // read (Op-code Command Read Memory Data 0000 0011b)
19
  }  
20
  while((SPSR&0x80)==0x00);
21
}
22
23
24
/********************************************************************************************
25
*               FRAM_SPI_SET_ADDR FUNCTION
26
*
27
* Description : This function sets the address of the FRAM registers.
28
* Arguments   : 16 bit address
29
* Returns     : None
30
* Note        : Internal Function
31
*********************************************************************************************/
32
void fram_spi_set_addr(unsigned int addr)
33
{  
34
  SPDR = 0x00;
35
  while((SPSR&0x80)==0x00);
36
  
37
  SPDR = (unsigned char)((addr & 0xFF00) >> 8);
38
  while((SPSR&0x80)==0x00);
39
  
40
  SPDR = (unsigned char)(addr & 0x00FF);
41
  while((SPSR&0x80)==0x00);
42
}
43
44
45
/********************************************************************************************
46
*               FRAM_SPI_END FUNCTION
47
*
48
* Description : This function terminate the spi data transfer.
49
* Arguments   : None
50
* Returns     : None
51
* Note        : Internal Function
52
*********************************************************************************************/
53
void fram_spi_end(void)
54
{
55
  PORTB |= (1 << PB6);
56
  PORTB &= ~((1 << PB3) | (1 << PB2) | (1 << PB1)); // SPI end  
57
}


Mit diesen Code-Zeilen kann ich an Adresse 0 und 1 Daten auslesen --> 
also muss bei meinen anfänglichen Versuchen ein "Code-Geschnipsel" 
erfolgreich gewesen sein. Demnach würde jetzt das Schreiben nicht mehr 
funktionieren.

Hat Jemand eine Idee was hier falsch ist oder vergessen wurde? Hat 
jemand Erfahrungen mit diesen FRAM - vielleicht habe ich im Datenblatt 
irgendwas überlesen???

Gruß Torsten

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
WREN - Set Write Enable Latch
2
The FM25H20 will power up with writes disabled. 
3
The WREN command must be issued prior to any write operation.
Such mal nach dem Kommando im Datenblatt. Das kann ich in deinem Code 
nicht finden...

von Torsten A. (torsten_a)


Lesenswert?

Guter Hinweis!

ich habe jetzt folgende Funktion nach fram_spi_init_start() eingebunden:

1
/********************************************************************************************
2
*               FRAM_SPI_WRITE_ENA FUNCTION
3
*
4
* Description : This function sets Write Enable Latch
5
* Arguments   : none
6
* Returns     : none
7
* Note        : Internal Function
8
*********************************************************************************************/
9
void fram_spi_write_ena()
10
{    
11
12
  /* SPI MODE I/F initialization */
13
  PORTB &= ~((1 << PB3) | (1 << PB2) | (1 << PB1) | (1 << PB6)); // CS=0, SPI start
14
  
15
  SPDR = 0x06; // set write ena (Op-code Command: Set Write Enable Latch 0000 0110b)              
16
  while((SPSR&0x80)==0x00);
17
  
18
  /* terminate spi data transfer */
19
  fram_spi_end();  
20
}

brachte aber keine Veränderung :(

von Frank K. (fchk)


Lesenswert?

Du musst das WREN vor jedem(!) Schreibzugriff senden. Das Flag wird nach 
einem Schreibzugriff automatisch zurückgesetzt. Das machen alle 
SPI-EEPROMS und Flashes so.

fchk

von Torsten A. (torsten_a)


Lesenswert?

Vor jedem Schreiben schicke ich jetzt das WREN commando....
1
/********************************************************************************************
2
*               FRAM_SPI_IO_BYTE FUNCTION
3
*
4
* Description : This function writes/reads one byte into/from FRAM.
5
* Arguments   : 16 bit address, 8 bit data, data direction (wr=1; rd=0)
6
* Returns     :  8 bit data
7
* Note        : Internal Function
8
*********************************************************************************************/
9
unsigned char fram_spi_io_byte(unsigned int addr, unsigned char data_out, unsigned char data_direction)
10
{
11
  unsigned char data = 0;    
12
13
14
  if(data_direction)
15
  {
16
    fram_spi_write_ena();
17
  }
18
  
19
  /* SPI MODE I/F initialization */
20
  fram_spi_init(data_direction);
21
22
  /* set address */
23
  fram_spi_set_addr(addr);
24
  
25
  if(data_direction)
26
  {
27
    SPDR = data_out;        // write data
28
  } else
29
  {
30
    SPDR = 0x00;    // dummy value for shift register
31
  }
32
  while((SPSR&0x80)==0x00);
33
   
34
  if(!(data_direction))
35
  {
36
    data = SPDR;     // read data
37
  } 
38
39
  /* terminate spi data transfer */
40
  fram_spi_end();  
41
42
  if(data_direction)
43
  {
44
    return 1;
45
  } else
46
  {
47
    return data;
48
  }  
49
}

ohne Erfolg......

von Torsten A. (torsten_a)


Lesenswert?

werde wohl weiter herumexperimentieren müssen....

von (prx) A. K. (prx)


Lesenswert?

Probier mal Mode 3. Ich war bei einem AVR, der ein Atmel Dataflash, ein 
FRAM und ein ENC28J60 an seinem SPI hängen hat, über SPI-Probleme 
gestolpert. Zwar konnten alle offiziell den SPI Mode 0, aber eines davon 
bewies eine etwas andere Ansicht dazu, indem die Bits dabei um eine 
Position verrutschten. Ich weiss nur grad nicht mehr, welches der 3 
SPI-Devices das war.

von Torsten A. (torsten_a)


Lesenswert?

habe jetzt auch SPI-Mode 3 ausprobiert:
1
SPCR = (1<<SPE) | (1<<MSTR) | (1<<CPOL) | (1<<CPHA); // SPI Mode 3


das Auslesen scheint zu funktionieren - aber nicht das Schreiben....

Habe leider keine Ahnung mit welchen Code-Zeilen bzw. mit welcher 
Prozedur das Schreiben funktioniert hat. Wahrscheinlich hat da das 
Auslesen nicht funktioniert und deshalb wurde der Code von mir 
verworfen.

Ich werde mal die Frequenz verringern......

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Frank K. schrieb:
> Du musst das WREN vor jedem(!) Schreibzugriff senden.
Das ist ein weit verbreiteter Irrtum. Hierzu das Datenblatt:
1
Sending the WREN op-code causes the internal Write 
2
Enable Latch to be set. A flag bit in the Status 
3
Register, called WEL, indicates the state of the latch. 
4
WEL=1 indicates that writes are permitted.
Fazit: einmal gesetzt bleibt das Write Enable gesetzt, bis die Spannung 
weg geht oder ein WRDI - Write Disable gesendet wird.

A. K. schrieb:
> Probier mal Mode 3.
Ich würde jetzt auch mal das Bit-Timing nochmal genau anschauen. Nicht 
alle SPI-Devices Schieben auf der einen und Latchen auf der anderen 
Flanke...
Insbesondere würde ich mich auf solche expliziten Angaben (CPOL, 
CPHA=0,0 & 1,1) nicht verlassen. Nicht alle Hersteller haben diese Bits 
gleich implementiert. Da hilft nur das Vergleichen der Timing-Diagramme 
der beiden betroffenen Komponenten (uC und FRAM)...

EDIT:
> Ich werde mal die Frequenz verringern......
Das wird nicht nötig sein, denn 4MHz << 40MHz.
Wenn es aber eine Änderung bringt, dann zurück zum Bittiming...

von Arc N. (arc)


Lesenswert?

Ein paar Punkte:
- das Verändern der Pin-Zustände (SCK, MISO, MOSI) zusammen mit CS 
sollte man grundsätzlich vermeiden d.h. erst /CS auf High dann die Ports 
initialisieren, dann SPI initialisieren, dann irgendwann die 
Kommunikation mit dem externen Baustein.
- beim Lesen wird ein Byte zuviel gelesen bzw. das erste wird verworfen
1
SPITransceive(uint8_t value) {
2
    SPDR = value;
3
    while((SPSR&0x80)==0x00);
4
    return SPDR;
5
}
6
7
void FRAMSelect(void) {
8
   ...
9
}
10
11
void FRAMDeselect(void) {
12
   ...
13
}
14
15
// dann können die anderen Befehle einfach zusammengesetzt werden
16
void FRAMWREN(void) {
17
   FRAMSelect();
18
   SPITransceive(6);
19
   FRAMDeselect();
20
}
21
22
void FRAMRead(uint_8* destP, uint16_t addr, uint16_t count) {
23
    uint16_t i;
24
25
    if (!destP) return;
26
    
27
    FRAMSelect();
28
    // command
29
    SPITransceive(3);
30
    // address
31
    SPITransceive(0);
32
    SPITransceive((addr >> 8) & 0xff);
33
    SPITransceive(addr & 0xff);
34
    // data
35
    for (i = 0; i < count; i++) {
36
        *destP++ = SPITransceive(0);
37
    }
38
39
    FRAMDeselect();
40
}
41
42
void FRAMWrite(uint8_t* srcP, uint16_t addr, uint16_t count) {
43
    uint16_t i;
44
45
    if (!srcP) return;
46
47
    FRAMWREN();
48
    
49
    FRAMSelect();
50
    // command
51
    SPITransceive(2);
52
    // address
53
    SPITransceive(0);
54
    SPITransceive((addr >> 8) & 0xff);
55
    SPITransceive(addr & 0xff);
56
    // data
57
    for (i = 0; i < count; i++) {
58
        SPITransceive(*srcP++);
59
    }
60
61
    FRAMDeselect();
62
}
63
// nichts getestet, sollte aber passen

von Frank K. (fchk)


Lesenswert?

Lothar Miller schrieb:
> Frank K. schrieb:
>> Du musst das WREN vor jedem(!) Schreibzugriff senden.
> Das ist ein weit verbreiteter Irrtum. Hierzu das Datenblatt:
>
1
> Sending the WREN op-code causes the internal Write
2
> Enable Latch to be set. A flag bit in the Status
3
> Register, called WEL, indicates the state of the latch.
4
> WEL=1 indicates that writes are permitted.
5
>
> Fazit: einmal gesetzt bleibt das Write Enable gesetzt, bis die Spannung
> weg geht oder ein WRDI - Write Disable gesendet wird.

Ich lese aber auch:
1
Write Operation
2
All writes to the memory array begin with a WREN
3
op-code. The next op-code is the WRITE instruction.
4
This op-code is followed by a three-byte address
5
value, which specifies the 18-bit address of the first
6
data byte of the write operation.

fchk

von Torsten A. (torsten_a)


Lesenswert?

Frank K. schrieb:
> Write Operation
> All writes to the memory array begin with a WREN
> op-code. The next op-code is the WRITE instruction.
> This op-code is followed by a three-byte address
> value, which specifies the 18-bit address of the first
> data byte of the write operation.

werde ich gleich ausprobieren.....habe danach die Start-addresse nicht 
gesendet

von Torsten A. (torsten_a)


Lesenswert?

Arc Net schrieb:
> Ein paar Punkte:
> - das Verändern der Pin-Zustände (SCK, MISO, MOSI) zusammen mit CS
> sollte man grundsätzlich vermeiden d.h. erst /CS auf High dann die Ports
> initialisieren, dann SPI initialisieren, dann irgendwann die
> Kommunikation mit dem externen Baustein.
> - beim Lesen wird ein Byte zuviel gelesen bzw. das erste wird verworfen


Ich habe jetzt mal diesen Code ausprobiert und erhalte das Gleiche 
Ergebnis - ich kann an Addr 0 und 1 die Werte auslesen aber nicht 
schreiben. Trotzdem Danke!!!
1
unsigned char SPITransceive(unsigned char value) {
2
    SPDR = value;
3
    while((SPSR&0x80)==0x00);
4
    return SPDR;
5
}
6
7
void FRAMSelect(void) {
8
    PORTB &= ~(1 << PB6); 
9
}
10
11
void FRAMDeselect(void) {
12
    PORTB |= (1 << PB6); 
13
}
14
15
// dann können die anderen Befehle einfach zusammengesetzt werden
16
void FRAMWREN(void) {
17
   FRAMSelect();
18
   SPITransceive(6);
19
   FRAMDeselect();
20
}
21
22
unsigned char FRAMRead(unsigned int addr) {
23
    unsigned char data;
24
    
25
    FRAMSelect();
26
    // command
27
    SPITransceive(3);
28
    // address
29
    SPITransceive(0);
30
    SPITransceive((addr >> 8) & 0xff);
31
    SPITransceive(addr & 0xff);
32
    // data
33
    data = SPITransceive(0);
34
35
    FRAMDeselect();
36
}
37
38
void FRAMWrite(unsigned int addr, unsigned char data) {
39
40
    //FRAMWREN();
41
    
42
    FRAMSelect();
43
    // command
44
    SPITransceive(2);
45
    // address
46
    SPITransceive(0);
47
    SPITransceive((addr >> 8) & 0xff);
48
    SPITransceive(addr & 0xff);
49
    // data
50
    SPITransceive(data);
51
52
    FRAMDeselect();
53
}

von ♪Geist (Gast)


Lesenswert?

>werde wohl weiter herumexperimentieren müssen....
Wie wäre es lieber mit nachdenken?

>void fram_spi_init(unsigned char data_direction)
>{
>  PORTB &= ~((1 << PB3) | (1 << PB2) | (1 << PB1) | (1 << PB6));
Warum löschst du PB3, wenn es MISO ist?  Wozu überhaupt die Zeile? Du 
nutzt doch Hardware SPI, also lass die Pins in Ruhe das machen, was die 
Hardware machen muss.

>Write Operation
>All writes to the memory array begin with a WREN
>op-code.
Das ist falsch. Ein Mal setzen reicht.

von Arc N. (arc)


Lesenswert?

Frank K. schrieb:
> Lothar Miller schrieb:
>> Frank K. schrieb:
>>> Du musst das WREN vor jedem(!) Schreibzugriff senden.
>> Das ist ein weit verbreiteter Irrtum. Hierzu das Datenblatt:
>> Fazit: einmal gesetzt bleibt das Write Enable gesetzt, bis die Spannung
>> weg geht oder ein WRDI - Write Disable gesendet wird.
>
> Ich lese aber auch:

> fchk

oder den gesamten Abschnitt lesen (scnr)

"WREN - Set Write Enable Latch
Sending the WREN op-code causes the internal Write
Enable Latch to be set. A flag bit in the Status
Register, called WEL, indicates the state of the latch.
WEL=1 indicates that writes are permitted.
Attempting to write the WEL bit in the Status
Register has no effect on the state of this bit – only
the WREN op-code can set this bit.

The WEL bit will be automatically cleared on the rising edge of /S
following a WRDI, a WRSR, or a WRITE operation.
This prevents further writes to the Status Register or
the F-RAM array without another WREN command.
Figure 5 below illustrates the WREN command bus
configuration."

Kurz gesagt: Alle Write-Befehle nach einem WREN setzen den Schreibschutz 
wieder, alle Read-Befehle lassen ihn unangetastet.
Ähnliches gilt z.B. für M25P, M25PX, SST25 (da muss nach dem Power-On 
auch der Schreibschutz für die Blöcke aufgehoben werden), AT25, 25AA/LC

von Torsten A. (torsten_a)


Lesenswert?

Frank K. schrieb:
> Write Operation
> All writes to the memory array begin with a WREN
> op-code. The next op-code is the WRITE instruction.
> This op-code is followed by a three-byte address
> value, which specifies the 18-bit address of the first
> data byte of the write operation.

geht immer noch nicht

von Frank K. (fchk)


Lesenswert?

1
void FRAMWrite(unsigned int addr, unsigned char data) {
2
3
    FRAMSelect();
4
    //FRAMWREN();
5
    SPITransceive(6);
6
    FRAMDeselect();
7
    FRAMSelect();
8
    // command
9
    SPITransceive(2);
10
    // address
11
    SPITransceive(0);
12
    SPITransceive((addr >> 8) & 0xff);
13
    SPITransceive(addr & 0xff);
14
    // data
15
    SPITransceive(data);
16
    FRAMDeselect();

von Torsten A. (torsten_a)


Lesenswert?

Frank K. schrieb:
> void FRAMWrite(unsigned int addr, unsigned char data) {
>
>     FRAMSelect();
>     //FRAMWREN();
>     SPITransceive(6);
>     FRAMDeselect();
>     FRAMSelect();
>     // command
>     SPITransceive(2);
>     // address
>     SPITransceive(0);
>     SPITransceive((addr >> 8) & 0xff);
>     SPITransceive(addr & 0xff);
>     // data
>     SPITransceive(data);
>     FRAMDeselect();


ist das gleiche in grün....

von Andreas (Gast)


Lesenswert?

Hast du schon mal das Statusregister ausgelesen, ob WEL auch gesetzt 
ist?
Der Chip hat auch eine Schreibschutzfunktion (BP0, BP1)...

von Torsten A. (torsten_a)


Lesenswert?

Danke für Eure Hilfe!! Ich melde mich wenn ich das Rätsel gelöst 
habe.....

von (prx) A. K. (prx)


Lesenswert?

Mal nachgesehen - das FRAM läuft in Mode 0, es ist das Dataflash was 
partout Mode 3 wollte.
1
#define FM_WREN  0x06  // set write enable latch
2
#define FM_WRDI  0x04  // write disable
3
#define FM_RDSR  0x05  // read status register
4
#define FM_WRSR  0x01  // write status register
5
#define FM_READ  0x03  // read memory data
6
#define FM_WRITE 0x02  // write memory data
7
8
#define SPI_MODE 0
9
10
#define select()   FRAM_SEL_PORT &= ~(1<<FRAM_SEL_BIT)
11
#define deselect() FRAM_SEL_PORT |=  (1<<FRAM_SEL_BIT)
12
13
void
14
spi_init(uint8_t mode)
15
{
16
    SPI_DDR |= 1<<SPI_MOSI_BIT | 1<<SPI_SCK_BIT;
17
    SPCR = 1<<SPE | 0<<DORD | 1<<MSTR | 0<<SPR1|0<<SPR0 | mode<<CPHA;
18
    SPSR = 1<<SPI2X;
19
}
20
21
uint8_t
22
spi(uint8_t data)
23
{
24
    SPDR = data;
25
    while (!(SPSR & 1<<SPIF))
26
        ;
27
    return SPDR;
28
}
29
30
void
31
fram_init(void)
32
{
33
    FRAM_SEL_PORT |= 1<<FRAM_SEL_BIT;
34
    FRAM_SEL_DDR  |= 1<<FRAM_SEL_BIT;
35
}
36
37
void
38
fram_read(unsigned addr, uint8_t *data, unsigned size)
39
{
40
    spi_init(SPI_MODE);
41
    
42
    select();
43
    spi(FM_READ);
44
    spi(addr >> 8);
45
    spi(addr);
46
    while (size--)
47
        *data++ = spi(0);
48
    deselect();
49
}
50
51
void
52
fram_write(unsigned addr, uint8_t *data1, unsigned size1, uint8_t *data2, unsigned size2)
53
{
54
    spi_init(SPI_MODE);
55
    
56
    select();
57
    spi(FM_WREN);
58
    deselect();
59
    
60
    select();
61
    spi(FM_WRITE);
62
    spi(addr >> 8);
63
    spi(addr);
64
    for (; size1; --size1)
65
        spi(*data1++);
66
    for (; size2; --size2)
67
        spi(*data2++);
68
    deselect();
69
}

von Torsten A. (torsten_a)


Lesenswert?

Andreas schrieb:
> Hast du schon mal das Statusregister ausgelesen, ob WEL auch gesetzt
> ist?
> Der Chip hat auch eine Schreibschutzfunktion (BP0, BP1)...

Habe vergessen Deine Frage zu beantworten...

Das Status Register hat immer den Inhalt 1100 0000b auch wenn ich es 
nach einem Schreibversuch auslese, sogar nach dem power-up!??


----------------------------------------
Table 2. Status Register
Bit    7  6 5 4  3   2   1  0
Name WPEN 1 0 0 BP1 BP0 WEL 0

von Torsten A. (torsten_a)


Lesenswert?

Nach dem Senden des OP-Code "Set Write Enable Latch" steht das Status 
Register auf 1100 0010b.

von Frank B. (f-baer)


Lesenswert?

Torsten Albrecht schrieb:
> ----------------------------------------
> Table 2. Status Register
> Bit    7  6 5 4  3   2   1  0
> Name WPEN 1 0 0 BP1 BP0 WEL 0

WPEN = Write Protect Enable

Im Statusregister ist Bit7 gesetzt. Noch Fragen? Erstmal solltest du den 
FRAM aus dem Write Protect rausholen, danach kannst du auch schreiben.

von Torsten A. (torsten_a)


Lesenswert?

Frank Bär schrieb:
> WPEN = Write Protect Enable
>
> Im Statusregister ist Bit7 gesetzt. Noch Fragen? Erstmal solltest du den
> FRAM aus dem Write Protect rausholen, danach kannst du auch schreiben.

Habe mich falsch ausgedrückt, nachdem ich einmalig den OP-Code WREN 
gesendet habe, steht im Register 1100 0010. siehe Tabelle

Table 4. Write Protection
WEL WPEN /W Protected Blocks Unprotected Blocks Status Register
1   1    1      Protected       Unprotected      Unprotected

demnach sollte das Schreiben möglich sein! Geht aber nicht!!!

von Torsten A. (torsten_a)


Lesenswert?

habe noch eine application note gefunden

http://www.ramtron.com/files/application_notes/AN304.pdf

im Beispiel wird vor jedem Schreibvorgang der OP-CODE WREN gesendet!

Das hatte ich ja auch schon ausprobiert - ohne Erfolg!?

von Torsten A. (torsten_a)


Lesenswert?

Werde mir wohl mal die Signale anschauen müssen.

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.