Vai al contenuto
PLC Forum


RAM 23k256


Lorenzo Ruscitti

Messaggi consigliati

Lorenzo Ruscitti
#include <SPI.h>

//SRAM Status Register opcodes
#define BYTE_MODE B00000000                    // 0     dec
#define PAGE_MODE B10000000                    // 128   dec
#define SEQUENTIAL_MODE B01000000              // 64    dec

//SRAM Status Register opcodes disabling HOLD pin
#define BYTE_MODE_NO_HW_HOLD B00000001         // 1     dec
#define PAGE_MODE_NO_HW_HOLD B10000001         // 129   dec
#define SEQUENTIAL_MODE_NO_HW_HOLD B01000001   // 65    dec

//SRAM opcodes
#define READ_STATUS_REGISTER B00000101         // 5     dec
#define WRITE_STATUS_REGISTER B00000001        // 1     dec
#define READ B00000011                         // 3     dec
#define WRITE B00000010                        // 2     dec

#define ZERO ((uint8_t) 0x00)                  // 0     dec
#define MAX_VALUE ((uint8_t) 0xFF)             // 255   dec
#define MAX_ADDR ((uint16_t) 0x7FFF)           // 32767 dec
#define MAX_PAGE ((uint8_t) 0x0400)            // 1024  dec
#define MAX_WORD_PER_PAGE ((uint8_t) 0x20)     // 32    dec

#define SET_SS_LOW() (PORTB &= ~(1<<PORTB2)) //set SPI_SS low
#define SET_SS_HIGH() (PORTB |= (1<<PORTB2)) //set SPI_SS high

uint8_t SpiRAMReadStatusRegister() {
  uint8_t read_status;
 
  //SET_SS_LOW();
  digitalWrite(53, LOW);
  SPI.transfer(READ_STATUS_REGISTER);
  read_status = SPI.transfer(0xFF);
  //SET_SS_HIGH();
  digitalWrite(53, HIGH);
 
  return read_status;
}


void SpiRAMWriteStatusRegister(uint8_t command) {

  digitalWrite(53, LOW);
  //SET_SS_LOW();
  SPI.transfer(WRITE_STATUS_REGISTER);
  SPI.transfer(command);
  //SET_SS_HIGH();
  digitalWrite(53, HIGH);
 
}

byte SpiRAMReadByte(uint16_t address) {

  Serial.println("*********** FASE DI LETTURA ***************");
 
  byte read_byte;

  digitalWrite(53, LOW);
 
  SPI.transfer(READ);
  SPI.transfer((char) (address >> 8));
  SPI.transfer((char) address);
  read_byte = SPI.transfer(0xFF);

  Serial.print("INDIRIZZO DI LETTURA = ");
  Serial.println(address, DEC);

  delay(200);
 
  Serial.print("VALORE LETTO = ");
  Serial.println(read_byte, DEC);
 
  digitalWrite(53, HIGH);

 
 
  return read_byte;
}



void SpiRAMWriteByte(uint16_t address, byte data_byte) {

  Serial.println("*********** FASE DI SCRITTURA ***************");
 
  digitalWrite(53, LOW);
 
  SPI.transfer(WRITE);
  SPI.transfer((char) (address >> 8));
  SPI.transfer((char) address);
  SPI.transfer(data_byte);

  Serial.print("INDIRIZZO DI SCRITTURA = ");
  Serial.println(address, DEC);

  delay(200);
 
  Serial.print("DATO SCRITTO = ");
  Serial.println(data_byte, DEC);
 
  digitalWrite(53, HIGH);
}

byte x = 1;

void setup() {
 
  Serial.begin(9600);
  SPI.begin();

  pinMode(53, OUTPUT); // pin CS
 
  SpiRAMWriteStatusRegister(BYTE_MODE);
 
  if(SpiRAMReadStatusRegister() != BYTE_MODE) {
    Serial.println("Errory while setting status register (byte operative mode)!");
  }
  else {
    Serial.println("Byte operative mode correctly set!");
  }
 
}




void loop() {
 
  SpiRAMWriteByte(0, x);

  delay(2000);
 
  if(SpiRAMReadByte(0) <= 10) {

    delay(8000);
   
    x = x + 1;

  }
  else {

    Serial.println("FINITO");
  }


 
  //delay(10);

 

Ciao a tutti e buona pasqua

volevo chiedervi una domanda riguardante la memoria RAM 23k256.

Ho scritto il codice che vi ho inserito.
L'ho scritto in quel modo perché volevo verificare se avessi potuto sovrascrivere il valore di una locazione fissa della RAM e poi incrementarlo fino a quando avevo interesse, ovviamente incrementarlo fino ad un numero massimo che possa essere espresso con 8 bit. Dico quest'ultima cosa poiché io uso la scrittura e lettura di un byte.

Quello che vi chiedo è perché nella immagini 1 e 2 in allegato ottengo quei risultati cerchiati in rosso.

Fino alla scrittura del quarto valore tutto ok poi scrivo il valore 5 ma leggo il valore 6, poi scrivo il valore 9 ma legge il 10, e qui sarebbe dovuta comparire la scritta finito, invece compare quando scrivo il 10 e legge il 12.

Mi potete aiutare ?

Vi ringrazio.

 

1.png

2.png

Link al commento
Condividi su altri siti


Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...