15-04-2020, 03:28
(Ten post był ostatnio modyfikowany: 15-04-2020, 03:30 przez ElektronPL.)
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:
Oto kod jaki napisałem:
Z góry dziękuję za pomoc!
Pozdrawiam.
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
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.