Prove pratiche con FRAM FM26456b

Ciao a tutti

Vorrei condividere le mie esperienze con la memoria ferroeletrica FM25256B; costo 6,88€ da RS.
Ero curioso di fare delle prove con sudetta RAM. L' ho ordianta un mese fa e ieri mi é arrivata. Ho dovuta saldarla su una schedina adattatrice DIP perché è nel involucro SOIC e purtroppo non é disponibile in formato DIP.

La FRAM é una memoria in mezzo tra RAM e EEPROM.
Viene con un interfaccia SPI e la programmazione é uguale come usate nell EEPROM seriali. La differenza é che la scrittura non necesita di pause, ma puó essere fatta a piena velocitá per tutta la memoria e che le operazioni di scrittura non sono limitate.
Una volta tolto la tensione i dati restano nella memoria.
La FM25256B é organizzata come 32768 x8 bit ed é pincompatibile agli EEPROM ISP

Ho usata sia il collegamento che il codice esempio descritto in: http://www.arduino.cc/en/Tutorial/SPIEEPROM.
Ho modificato il codice per separare la scrittura dalla lettura e visualizzazione dei dati. Ho tolto pause necessare per il EEPROM.
La scrittura avviene sequenziale in un unico comando di scrittura per tutti 32kByte in 109 msecondi.
Nel finesettimana faró delle foto e le pubblicheró qua (mi serve un po di luce e durante la settimana esco e rincaso quando non c'é tanta luce).
Sketch di scrittura:

#define DATAOUT 11//MOSI
#define DATAIN  12//MISO 
#define SPICLOCK  13//sck
#define SLAVESELECT 10//ss

//opcodes
#define WREN  6
#define WRDI  4
#define RDSR  5
#define WRSR  1
#define READ  3
#define WRITE 2

byte eeprom_output_data;
byte eeprom_input_data=0;
byte clr;
unsigned int address=0;
byte daten=0; 

char spi_transfer(volatile char data)
{
  SPDR = data;                    // Start the transmission
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  };
  return SPDR;                    // return the received byte
}

void setup()
{
  Serial.begin(9600);
  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(SLAVESELECT,OUTPUT);
  digitalWrite(SLAVESELECT,HIGH); //disable device
  // SPCR = 01010000
  //interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
  //sample on leading edge of clk,system clock/4 rate (fastest)
  SPCR = (1<<SPE)|(1<<MSTR);
  clr=SPSR;
  clr=SPDR;
  delay(10);    
  digitalWrite(SLAVESELECT,LOW);
  spi_transfer(WREN); //write enable
  digitalWrite(SLAVESELECT,HIGH);
  delay(10);  
  Serial.print("starttime: ");
  Serial.println(micros());
  digitalWrite(SLAVESELECT,LOW);      // write 32kByte in sequence
  spi_transfer(WRITE);                //write instruction
  address=0;
  spi_transfer((char)(address>>8));   //send MSByte address first
  spi_transfer((char)(address));      //send LSByte address
  // write 32KByte
  for (unsigned int I=0;I<32768;I++)
  {
    spi_transfer(I/256); //write data byte
  }  
  digitalWrite(SLAVESELECT,HIGH); //release chip  
  Serial.print("endtime: ");
  Serial.println(micros()); Serial.println();
  Serial.println("FRAM Write finish");
}

void loop()
{
  delay(5000); //pause for readability
}

Sketch di lettura e visualizazione:

#define DATAOUT 11//MOSI
#define DATAIN  12//MISO 
#define SPICLOCK  13//sck
#define SLAVESELECT 10//ss

//opcodes
#define WREN  6
#define WRDI  4
#define RDSR  5
#define WRSR  1
#define READ  3
#define WRITE 2

byte eeprom_output_data;
byte eeprom_input_data=0;
byte clr;
unsigned int address=0;

char spi_transfer(volatile char data)
{
  SPDR = data;                    // Start the transmission
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  };
  return SPDR;                    // return the received byte
}

byte read_eeprom(int EEPROM_address)
{
  //READ EEPROM
  int data;
  digitalWrite(SLAVESELECT,LOW);
  spi_transfer(READ);                        //transmit read opcode
  spi_transfer((char)(EEPROM_address>>8));   //send MSByte address first
  spi_transfer((char)(EEPROM_address));      //send LSByte address
  data = spi_transfer(0xFF);                 //get data byte
  digitalWrite(SLAVESELECT,HIGH);            //release chip, signal end transfer
  return data;
}

void setup()
{
  Serial.begin(9600);
  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(SLAVESELECT,OUTPUT);
  digitalWrite(SLAVESELECT,HIGH);         //disable device
  // SPCR = 01010000
  //interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
  //sample on leading edge of clk,system clock/4 rate (fastest)
  SPCR = (1<<SPE)|(1<<MSTR);
  clr=SPSR;
  clr=SPDR;
  delay(10);  
}

void loop()
{
  Serial.print('\n',BYTE);
  for (unsigned int I=0;I<32768;I++)
  {
    eeprom_output_data = read_eeprom(I);
  Serial.print(eeprom_output_data,DEC);
  address++;
  if (address == 64)
  {Serial.print('\n',BYTE);
  address = 0;
  }
}  
delay(5000); //pause for readability
}