• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Dziwne zachowanie pamięci SRAM SPI.
#1
Witam, mam problem z pamięcią SRAM 23K640  (datasheet: http://ww1.microchip.com/downloads/en/De...22126E.pdf)
Mianowicie w trybie odczytu sekwencyjnego (czyli podajemy początkowy adres komórki i kolejne odczyty do kolejne adresy w pamięci). Działa wszystko tak jak powinno poza adresem 0x0000, który zawsze zwraca 0. Co dziwniejsze odczyt bajtu 0x0000 (w trybie byte mode) zwraca poprawną wartość. Mam tu przykład:
Ustawiłem wszystkie komórki na wartość 74, odczytałem bajt 0x0000 trybem byte mode a następnie rozpocząłem odczyt sekwencyjny od komórki 0xFFF0 a skończyłem na komórce 0x000F i oto efekt:
Kod:
begin
SRAM begin OK
Byte 0x0000: 74

65520. 74
65521. 74
65522. 74
65523. 74
65524. 74
65525. 74
65526. 74
65527. 74
65528. 74
65529. 74
65530. 74
65531. 74
65532. 74
65533. 74
65534. 74
65535. 74
0. 0      << czemu ta wartość wynosi 0!?
1. 74
2. 74
3. 74
4. 74
5. 74
6. 74
7. 74
8. 74
9. 74
10. 74
11. 74
12. 74
13. 74
14. 74
15. 74
Oto kod jaki napisałem:

Kod:
#include <SPI.h>

#define CS 10

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

byte current_register = 2;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  SPI.begin();
  delay(10);
  Serial.println("begin");
  if(SRAM_begin()) Serial.println("SRAM begin OK");
  else
  {
    Serial.println("SRAM begin failure");
    while(true);
  }
  setAllMem(74);

  Serial.print("Byte 0x0000: ");
  Serial.println(byteRead(0x0000));
  Serial.println("");
// byteWrite(0, 123);
  //byteWrite(1, 123);
  //byteWrite(2, 0);
//  byteWrite(5, 210);

  startSequentialRead(0xFFF0);
  delay(10);
  for(unsigned int i=0xFFF0; i!=0x0010; i++)
  {
    Serial.print(i);
    Serial.print(". ");
    Serial.println(readNextByte());
  }
  endSequential();
}

void loop() {
  // put your main code here, to run repeatedly:
}


void startSequentialRead(unsigned int addr)
{
  if (current_register != 67) writeStatusRegister(67);
  digitalWrite(CS, LOW);
  SPI.transfer(READ);
  SPI.transfer(addr >> 8);
  SPI.transfer(addr & 255);
}
byte readNextByte(){
  return(SPI.transfer(0));
}

void startSequentialWrite(unsigned int addr)
{
  if (current_register != 67) writeStatusRegister(67);
  digitalWrite(CS, LOW);
  SPI.transfer(WRITE);
  SPI.transfer(addr >> 8);
  SPI.transfer(addr & 255);
}
void writeNextByte(byte val){
  SPI.transfer(val);
}

void endSequential(){
  digitalWrite(CS, HIGH);
}

byte byteRead(unsigned int addr)
{
  if (current_register != 3) writeStatusRegister(3);
  digitalWrite(CS, LOW);
  SPI.transfer(READ);
  SPI.transfer(addr >> 8);
  SPI.transfer(addr & 255);
  byte ret = SPI.transfer(0);
  digitalWrite(CS, HIGH);
  return (ret);
}

void byteWrite(unsigned int addr, byte val)
{
  if (current_register != 3) writeStatusRegister(3);
  digitalWrite(CS, LOW);
  SPI.transfer(WRITE);
  SPI.transfer(addr >> 8);
  SPI.transfer(addr & 255);
  SPI.transfer(val);
  digitalWrite(CS, HIGH);
}

bool SRAM_begin()
{
  bool reg_val=0;
  if((readStatusRegister()&0b00111110)==2) reg_val=1;
  writeStatusRegister(3);
// delay(10);
  return(reg_val);
}

byte readStatusRegister()
{
  digitalWrite(CS, LOW);
  SPI.transfer(RDSR);
  byte ret = SPI.transfer(0);
  digitalWrite(CS, HIGH);
  return (ret);
}

void writeStatusRegister(byte val)
{
  digitalWrite(CS, LOW);
  SPI.transfer(WRSR);
  SPI.transfer(val);
  digitalWrite(CS, HIGH);
  current_register = 3;
  delayMicroseconds(50);
}

void setAllMem(byte val)
{
  startSequentialWrite(0);
  for(long i=0; i<0x10000; i++)
  {
    writeNextByte(val);
  }
  endSequential();
}

Z góry dziękuję za pomoc!
Pozdrawiam.
 
Odpowiedź
#2
Pewnie problem jest w tym, że nie ma następnej komórki po adresie 65535 a program nie przewiduje takiej sytuacji i podaje wartość "0".
 
Odpowiedź
#3
(15-04-2020, 08:06)Agregacik napisał(a): Pewnie problem jest w tym, że nie ma następnej komórki po adresie 65535 a program nie przewiduje takiej sytuacji i podaje wartość "0".
Ale w datasheet tej pamięci jest napisane coś takiego:
Cytat:Sequential Operation – is selected when bits 7 and 6 in the STATUS register are set to 01. Sequential operation allows the entire array to be written to and read from. The internal address counter is automatically incremented and page boundaries are ignored. When the internal address counter reaches the end of the array, the address counter will roll over to 0x0000
Więc po dojściu do 0xFFFF pamięć powinna ustawić wskaźnik na 0x0000. Ale problem w tym, że nawet gdy zaczniemy odczyt sekwencyjny od komórki 0x0000 to też wynosi ona zawsze 0.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości