No se puede apagar / reiniciar SRAM 23LC1024

-2

Estoy tratando de restablecer una SRAM 23LC1024 externa (apágala y vuelve a encenderla) que se conectó a mi Arduino Mega 2560. Necesito hacerlo porque quiero crear un perfil de la SRAM en un intento de implementar PUF . Actualmente, soy capaz de leer y escribir en SRAM.

He intentado cortar el terreno conectado a la SRAM, deshabilitar el SPI, pero la memoria en la SRAM no vuelve al valor aleatorio (valor inicial de la SRAM si la restableces correctamente). Para desconectar o conectar el suelo con SRAM, usé MOSFET. Antes de cortar el suelo, escribo 1 en toda la memoria. Pero, después de esperar segundos (o minutos), el valor sigue siendo el mismo.

Otra forma en la que también he probado es cortando el Vcc y la conexión a tierra de la SRAM. Desafortunadamente, el valor también sigue siendo el mismo (no se restablece a un valor aleatorio).

Ahora, la única forma de restablecer la SRAM que conozco es restableciendo el propio Arduino. ¿Puede alguien ayudarme?

Debajo está mi código

#include <SPI.h>

//SRAM opcodes

#define RDSR        5
#define WRSR        1
#define READ        3
#define WRITE       2

byte cs_pin = 10; //cs_pin location of the two SRAMS

//uint32_t maxram = 131072; //number of bytes in 23LC1024 SRAM
uint32_t maxpage = 4096;  //number of pages in 23LC1024 SRAM
//uint32_t maxpage = 1024;  //number of pages in 23K256 SRAM

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-*/
//Page transfer Functions
//here we can read and write 32 bytes at each address

void Spi23LC1024Read32(uint32_t address, uint8_t cs_pin, uint8_t* buff)
{
  uint32_t i; 
  uint8_t read_page; 

  digitalWrite(cs_pin, LOW);  
  SPI.transfer(READ);
  SPI.transfer((uint8_t)(address >> 16));
  SPI.transfer((uint8_t)(address >> 8)); 
  SPI.transfer((uint8_t)address);

  for (i = 0; i < 32; i++)
  {
      read_page = SPI.transfer(0x00);
      buff[i] = read_page;
  }
  digitalWrite(cs_pin, HIGH);   
}

void Spi23LC1024Write32(uint32_t address, uint8_t buffer170, uint8_t cs_pin)
{
    uint32_t i;

    digitalWrite(cs_pin, LOW); 
    SPI.transfer(WRITE);
    SPI.transfer((uint8_t)(address >> 16));
    SPI.transfer((uint8_t)(address >> 8));
    SPI.transfer((uint8_t)address);

    for (i = 0; i < 32; i++)
    {
        SPI.transfer(buffer170);
    }
    digitalWrite(cs_pin, HIGH); 
}
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-*/

uint32_t i, j, n; 
uint32_t value; 
uint32_t num = 0; 
uint32_t total_send = 10; 
uint8_t buff[32];
uint32_t index = 0;
uint8_t total_buff[32*128];
int inByte;

int pin_hold = 11;
int pin_select = 10;
int pin_mosfet = 12;

void readSRAM(){
  SPI.begin();
  digitalWrite(pin_select, LOW);
  digitalWrite(pin_hold, HIGH);
  digitalWrite(pin_mosfet, HIGH);
  delay(100);

// read
  for (j = 0; j < maxpage/128; j++){
    index = 0;
    for (i = 0; i < 128; i++) 
    {
      Spi23LC1024Read32(j*128+i, cs_pin,buff);
      memcpy(&total_buff[index], buff, sizeof(buff));
      index += 32;
    }

    for (i = 0; i< index; i++){
      Serial.println(total_buff[i], HEX);
    }
  }

   digitalWrite(pin_select, HIGH);
  digitalWrite(pin_hold, HIGH);
  digitalWrite(pin_mosfet, LOW);

  SPI.end();
}

void writeSRAM(){
  SPI.begin();
  digitalWrite(pin_select, LOW);
  digitalWrite(pin_hold, HIGH);
  digitalWrite(pin_mosfet, HIGH);
  delay(100);

// write
  for (j = 0; j < maxpage/128; j++){
    index = 0;
    for (i = 0; i < 128; i++) 
    {
      Spi23LC1024Write32(j*128+i, (uint8_t) 0, cs_pin);
    }
  }

  digitalWrite(pin_select, HIGH);
  digitalWrite(pin_hold, HIGH);
  digitalWrite(pin_mosfet, LOW);

  SPI.end();
}

void set(){
  Serial.begin(115200);

  delay(100);

  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(pin_select, OUTPUT);
  pinMode(pin_hold, OUTPUT);
  pinMode(pin_mosfet, OUTPUT);
}

void setup(void) 
{
  set();

  readSRAM();

  writeSRAM();
}

void loop() 
{
}

El diagrama simplificado de mi circuito (sin MOSFET), para cortar el Vcc, simplemente desenchufe el pin de 5V:

    
pregunta asajim

1 respuesta

0

Para aumentar la capacidad de repetición estadística del estado de SRAM, debe hacer que las condiciones de encendido sean lo más idénticas posible. Su problema de retención de datos probablemente esté relacionado con la carga o el voltaje de retención del chip SRAM en las líneas de suministro cuando se apaga brevemente. En lugar de simplemente desconectar el suministro, use otro transistor para cortar el suministro a tierra cuando el dispositivo no está conectado.

También tenga en cuenta el comentario de PlasmaHH sobre la alimentación del chip a través de los diodos de protección incorporados en la SRAM. Asegúrese de que todas las entradas al dispositivo se conecten a tierra durante la fase de apagado.

    
respondido por el RoyC

Lea otras preguntas en las etiquetas