Posunutí o jedno místo v paměti

mourison
Příspěvky: 18
Registrován: 07 led 2019, 21:15
Reputation: 0

Posunutí o jedno místo v paměti

Příspěvek od mourison » 16 úno 2021, 14:54

Zdravíčko, vždy při uložení do EEPROM se mi data posunou o jedno místo, tudíž se neuloží správně, koukám na to furt a nevím co přehlížím :D
Víc očí víc vidí, tak budu moc rád za jakoukoliv připomínku :).
Z mého pohledu to vypadá, že to vynechá jedno místo na začátku a zapíše to až do druhého a na to poslední pak nezůstane :)
Toto ukládám -> prosím o povšimnutí, že začíná 20 a končí FD

Kód: Vybrat vše

20202020205AFF00103037303730375A0501010059380000000069C100A598FD0501010059380000000069C100A597FD0401ED04FD3D14F628A7B80001003BFB0401ED04FD3D14F628A7B80001003AFB07026C02D901FDFF3004430C070024FC00008B0D1E0E0000470300000000ECFE05040081FE0000040000EC2C000055FD05040081FE0000040000EC2C000055FD0080808080000080008080FF000078FB0080808080000080008080FF000078FB0507000010544D42444C0100000065FE0507000010544D42444C0100000065FE323155333838383433353437530105FD323155333838383433353437530105FD4B5A375A30473433373037323001DCFC4B5A375A30473433373037323001DCFC000011136E0700000000000000001111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0101000000000000000000000000EAFF0107000000000000000000000000E3FF0000000000000000000000000000EAFF000002226C001C000311D1023C0416FE4445028897018700000000000000B6FD0000000000000000000000000000E7FF0000000000000000000000000000E6FF0000000000000000000000000000E5FF0000303641393036303332484A2057FD303030310000000000000000000022FF01020001010A81FE007AB300000027FD01020001010A81FE007AB300000027FD
a po vyčtení mi to zobrazí toto -> začíná F a pak až 20 tudíž je to o jedno místo posunuté -> a končí F, tudíž vynechalo písmeno D

Kód: Vybrat vše

F20202020205AFF00103037303730375A0501010059380000000069C100A598FD0501010059380000000069C100A597FD0401ED04FD3D14F628A7B80001003BFB0401ED04FD3D14F628A7B80001003AFB07026C02D901FDFF3004430C070024FC00008B0D1E0E0000470300000000ECFE05040081FE0000040000EC2C000055FD05040081FE0000040000EC2C000055FD0080808080000080008080FF000078FB0080808080000080008080FF000078FB0507000010544D42444C0100000065FE0507000010544D42444C0100000065FE323155333838383433353437530105FD323155333838383433353437530105FD4B5A375A30473433373037323001DCFC4B5A375A30473433373037323001DCFC000011136E0700000000000000001111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0101000000000000000000000000EAFF0107000000000000000000000000E3FF0000000000000000000000000000EAFF000002226C001C000311D1023C0416FE4445028897018700000000000000B6FD0000000000000000000000000000E7FF0000000000000000000000000000E6FF0000000000000000000000000000E5FF0000303641393036303332484A2057FD303030310000000000000000000022FF01020001010A81FE007AB300000027FD01020001010A81FE007AB300000027F
Tento kód mám

Kód: Vybrat vše

digitalWrite(posPIN, LOW);
      digitalWrite(negPIN, HIGH);
      delay(20);
      char dump[EEPROMSIZE] = "0";
      char readData[EEPROMSIZE * 2] = "0"; 
      Serial.readBytes(readData, EEPROMSIZE * 2); 
      for (int i = 0; i < EEPROMSIZE; i++)
      {
        dump[i] = intValueOfHexaKey(readData[i * 2 +1]) + 16 * intValueOfHexaKey(readData[i * 2]); 
        Serial.print(dump[i]); 
      }
      char ch[30];
      for (uint16_t i = 0; i < EEPROMSIZE; i++)
      {//how deep to write
        sprintf(ch,"%02X",writeByteAt(csPIN,i,dump[i]));
      }

      delay(500);
      digitalWrite(negPIN, LOW);
      digitalWrite(posPIN, HIGH);

Kód: Vybrat vše

uint8_t writeByteAt(uint8_t cs, uint16_t adr, char d)
{
  SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
  digitalWrite(cs, LOW);
  SPI.transfer(WREN); 
  digitalWrite(cs, HIGH);
  delay(10);
  digitalWrite(cs, LOW);
  uint8_t a = highByte(adr);
  a = a << 3;  
  a = a | WRITE;  
  SPI.transfer(a); 
  SPI.transfer(lowByte(adr)); 
  a = SPI.transfer(d);
  digitalWrite(cs, HIGH);
  delay(15);
  SPI.endTransaction();

  return a;
}

Kód: Vybrat vše

int8_t intValueOfHexaKey(char c)
{
  if ((c >= '0') && (c <= '9')) return c - '0';
  if ((c >= 'A') && (c <= 'F')) return c - 'A' + 10;
  return -1; 
}
Vím, je to trošku oříšek, ale budu moc vděčný za jakoukoliv pomoc, koukám na to 2h a nevídím co dělm špatně :D

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od ondraN » 16 úno 2021, 19:49

Já tam teda vidím problém v tom, že funkce writeByteAt() je použitá na zápis i čtení v jednom přenosu. V datasheetu není tahle funkce vůbec dokumentovaná a jen pámbůh ví, co při ní paměť vrací, ale čteš nejspíš předchozí hodnotu v SPI registru. Zkus zapisovat touhle funkcí a číst jinou, která submitne paměti adresu i kód pro čtení.

mourison
Příspěvky: 18
Registrován: 07 led 2019, 21:15
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od mourison » 17 úno 2021, 11:54

No ono já když udělal toto a rozdělil jsem to, tak výsledek je naprosto stejný, takže moc nevím už :/.

Kód: Vybrat vše

  {
      digitalWrite(posPIN, LOW);
      digitalWrite(negPIN, HIGH);
      delay(50);
      char dump[512];
      char readData[1024];
      Serial.readBytes(readData, 1024); 
      for (int i = 0; i < 512; i++)
      {
        dump[i] = intValueOfHexaKey(readData[i*2+1]) + 16 * intValueOfHexaKey(readData[i*2]);
        Serial.print(dump[i]); // toto je spíše pro debug
      }
      char ch[30];
      for (int i = 0; i < 512; i++)
      {
     
        sprintf(ch,"%02X",writeByteAt(csPIN,i,dump[i])); // tady zapisuji do paměti
      }

      delay(500);
      digitalWrite(negPIN, LOW);
      digitalWrite(posPIN, HIGH);
    }
Jinak pro výčet z paměti jako takové používám samozřejmě jinou funkci, kterou jsem zde pouze neuvedl.

Kód: Vybrat vše

  digitalWrite(posPIN, LOW);
      digitalWrite(negPIN, HIGH);
      delay(20);
      char ch[30];
      for (uint16_t i = 0; i < 512; i++)
      {//how deep to read
        sprintf(ch, "%02X", readByteAt(csPIN, i));  
        Serial.print(ch);
      }
      digitalWrite(negPIN, LOW);
      digitalWrite(posPIN, HIGH);

Kód: Vybrat vše

uint8_t readByteAt(uint8_t cs, uint16_t adr)
{
  SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE3));
  digitalWrite(cs, LOW);
  uint8_t b = highByte(adr);
  b = b << 3;  
  b = b | READ;  
  SPI.transfer(b); 
  SPI.transfer(lowByte(adr)); 
  b = SPI.transfer(0); 
  digitalWrite(cs, HIGH);
  SPI.endTransaction();
  return b;
}

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od ondraN » 17 úno 2021, 12:29

To fakt nevím, co tedy ta funkce zápisu vrací za hodnotu a k čemu ji máš :?:
Ještě jedna věc, pošleš před zápisem povolení k zápisu (WREN)? To tam taky nikde nevidím. Ověříš pak že istrukce prošla přečtením status registru (RDSR)? A proč zapisuješ v módu 0 a čteš v módu 3?

mourison
Příspěvky: 18
Registrován: 07 led 2019, 21:15
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od mourison » 17 úno 2021, 14:41

Aha no já u zkoušel kde co,protože nad tím bloumám snad 3 dny.
Toto je vlatně celý kód tak jak je, pro přehlednost ho dám komplet. + do přílohy datasheet.

Kód: Vybrat vše

#include <SPI.h>
#define csPIN 10 
#define posPIN 9 
#define negPIN 8 


#define WREN  6
#define WRDI  4
#define RDSR  5
#define WRSR  1
#define READ  3
#define WRITE 2
#define EEPROMSIZE 512


int8_t intValueOfHexaKey(char c)
{
  if ((c >= '0') && (c <= '9')) return c - '0';
  if ((c >= 'A') && (c <= 'F')) return c - 'A' + 10;
  return -1; 
}


uint8_t readByteAt(uint8_t cs, uint16_t adr)
{
  SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
  digitalWrite(cs, LOW);
  uint8_t b = highByte(adr);
  b = b << 3;  
  b = b | READ;  
  SPI.transfer(b); 
  SPI.transfer(lowByte(adr)); 
  b = SPI.transfer(0); 
  digitalWrite(cs, HIGH);
  SPI.endTransaction();
  return b;
}
//end



uint8_t writeByteAt(uint8_t cs, uint16_t adr, char d)
{
  SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
  digitalWrite(cs, LOW);
  SPI.transfer(WREN); 
  digitalWrite(cs, HIGH);
  delay(10);
  digitalWrite(cs, LOW);
  uint8_t a = highByte(adr);
  a = a << 3;  
  a = a | WRITE;  
  SPI.transfer(a); 
  SPI.transfer(lowByte(adr)); 
  a = SPI.transfer(d);
  digitalWrite(cs, HIGH);
  delay(15);
  SPI.endTransaction();

  return a;
}
//end

//setup 
void setup()
{
  Serial.begin(9600);
  digitalWrite(csPIN, HIGH);
  pinMode(csPIN, OUTPUT);
  pinMode(posPIN, OUTPUT);
  digitalWrite(posPIN, HIGH);
  pinMode(negPIN, OUTPUT);
  digitalWrite(negPIN, LOW);
  SPI.begin();
  
  Serial.setTimeout(7000);
}

//main loop
void loop()
{
  if (Serial.available() > 0)
  {
    char command = Serial.read();
    
    if (command == '1')
    {
      digitalWrite(posPIN, LOW);
      digitalWrite(negPIN, HIGH);
      delay(20);
      char ch[30];
      for (uint16_t i = 0; i < EEPROMSIZE; i++)
      {
        sprintf(ch, "%02X", readByteAt(csPIN, i));  
        Serial.print(ch);
      }
      digitalWrite(negPIN, LOW);
      digitalWrite(posPIN, HIGH);
    }
    else if (command == '2')
    {
      digitalWrite(posPIN, LOW);
      digitalWrite(negPIN, HIGH);
      delay(50);
      char dump[EEPROMSIZE];
      char readData[EEPROMSIZE * 2];
      Serial.readBytes(readData, EEPROMSIZE * 2); 
      for (int i = 0; i < EEPROMSIZE; i++)
      {
        dump[i] = intValueOfHexaKey(readData[i*2+1]) + 16 * intValueOfHexaKey(readData[i*2]);
        Serial.print(dump[i]);
      }
      char ch[30];
      for (int i = 0; i < EEPROMSIZE; i++)
      {
        
        sprintf(ch,"%02X",writeByteAt(csPIN,i,dump[i]));
      }

      delay(500);
      digitalWrite(negPIN, LOW);
      digitalWrite(posPIN, HIGH);
    }
  }
  delay(10);
}
Přílohy
950040 datasheet.pdf
(817.61 KiB) Staženo 144 x

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od ondraN » 17 úno 2021, 18:46

Na začátku jsi dával dvě řady dat. Kde, přesně,je která v kódu získaná a jak.

mourison
Příspěvky: 18
Registrován: 07 led 2019, 21:15
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od mourison » 17 úno 2021, 19:33

Tak první řada je vyčtená přímo z EEPROM, je to HEX. Je vyčtená správně protože data v ní jsou OK, vše sedí.
Po odeslání "1" do serial monitoru mi to vypíše ten HEX do serial monitoru.

Kód: Vybrat vše

20202020205AFF00103037303730375A0501010059380000000069C100A598FD0501010059380000000069C100A597FD0401ED04FD3D14F628A7B80001003BFB0401ED04FD3D14F628A7B80001003AFB07026C02D901FDFF3004430C070024FC00008B0D1E0E0000470300000000ECFE05040081FE0000040000EC2C000055FD05040081FE0000040000EC2C000055FD0080808080000080008080FF000078FB0080808080000080008080FF000078FB0507000010544D42444C0100000065FE0507000010544D42444C0100000065FE323155333838383433353437530105FD323155333838383433353437530105FD4B5A375A30473433373037323001DCFC4B5A375A30473433373037323001DCFC000011136E0700000000000000001111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0101000000000000000000000000EAFF0107000000000000000000000000E3FF0000000000000000000000000000EAFF000002226C001C000311D1023C0416FE4445028897018700000000000000B6FD0000000000000000000000000000E7FF0000000000000000000000000000E6FF0000000000000000000000000000E5FF0000303641393036303332484A2057FD303030310000000000000000000022FF01020001010A81FE007AB300000027FD01020001010A81FE007AB300000027FD
Tak a po odeslání "2" do serial monitoru vložím HEX uplně stejný znovu a on se zapíše, ale zapíše se mi špatně o jedno místo nejspíše.
Po opětovném vyčtení už nevypadá jako ORIGINÁL prvně vyčtený. viz. níže.

Kód: Vybrat vše

F20202020205AFF00103037303730375A0501010059380000000069C100A598FD0501010059380000000069C100A597FD0401ED04FD3D14F628A7B80001003BFB0401ED04FD3D14F628A7B80001003AFB07026C02D901FDFF3004430C070024FC00008B0D1E0E0000470300000000ECFE05040081FE0000040000EC2C000055FD05040081FE0000040000EC2C000055FD0080808080000080008080FF000078FB0080808080000080008080FF000078FB0507000010544D42444C0100000065FE0507000010544D42444C0100000065FE323155333838383433353437530105FD323155333838383433353437530105FD4B5A375A30473433373037323001DCFC4B5A375A30473433373037323001DCFC000011136E0700000000000000001111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0101000000000000000000000000EAFF0107000000000000000000000000E3FF0000000000000000000000000000EAFF000002226C001C000311D1023C0416FE4445028897018700000000000000B6FD0000000000000000000000000000E7FF0000000000000000000000000000E6FF0000000000000000000000000000E5FF0000303641393036303332484A2057FD303030310000000000000000000022FF01020001010A81FE007AB300000027FD01020001010A81FE007AB300000027F
Je zde vidět, že před 2020 je F a nakonci není písmeno D. Vypadá to, jako by se o jedno místo nezapsal.

mourison
Příspěvky: 18
Registrován: 07 led 2019, 21:15
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od mourison » 17 úno 2021, 19:35

Jo v kódu je loop, který čeká na příkaz 1 nebo 2, podle toho co chci, jestli vyčíst nebo zapsat.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od ondraN » 17 úno 2021, 20:51

Takže data jsou zapsaná správně a ověřená v jiné čtečce, ale špatně přečtená v té smyčce pro "1"?

mourison
Příspěvky: 18
Registrován: 07 led 2019, 21:15
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od mourison » 17 úno 2021, 21:47

Když zapíšu data, zapíšou se špatně - > nejspíše o jedno místo.
Vyčítání funguje v pořádku -> HEX, který jsem vyčetl prvně je v pořádku, protože obsahuje VIN auta , Checksums, IMMO atd. a to vše mi po kontrole sedí. :/
HEX, který jsem vyčel po zápisu nesedí o jedno místo, protože byl špatně zapsán :/ neznámo proč :/

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 10 hostů