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: