problem mit crc und pgm_read_byte nach flashen bootloader

Gast #1679418
Lesenswert?

ich will eine bootloader app schreiben. nach dem flashen soll der flash 
speicher mittles einer crc getestet werden.

hardware: mkII, atmega88, debugbywire
software: avrstudio, winavr

- nach dem schreiben des Flash mittels boot_page_write funktioniert ABER

nach dem flashen kann zeigt AVR Studio den Flash leer also, 0xFF an. 
Nach einem RESET (blauer Pfeil zum Springen zum Programmstart) zeigt 
AVRStudio den richtigen Inhalt an.

- wenn ich die CRC am Programmstart ausführe bekomme ich die richtige 
Checksummer,

- nach dem Flashen gibt pgm_read_byte immer nur 0xff zurück, nach einem 
reset werden jedoch die richtigen werte gelesen

- wird die firmware vom bootloader gestartet läuft sie,

Der Flash ist also programmiert, kann aber nicht nach dem programmieren 
nicht ausgelesen werden. ?!?

Irgendjemand eine Idee?



//---------------------------------------------------------------------- 
-------
// Berechnung der CRC
//---------------------------------------------------------------------- 
-------
//unsigned int CAL_CRC16 (unsigned int CRC, unsigned short c, unsigned 
int mask)
unsigned int CAL_CRC16()
{
volatile unsigned char c,i;
volatile unsigned int addr;
volatile unsigned int CRC;
const unsigned int mask = 0xA001;

    CRC = 0;

  for (addr=0;addr<(64*96);addr++)
    {

    c=pgm_read_byte(addr);

       for (i=0; i<8; i++)
        {
        if ((CRC ^ c)&1)
         {
          CRC=(CRC>>1)^mask;
         }
        else

        CRC>>=1;

        c>>=1;

        }

         }

return (CRC);

}

//write one Flash page
void write_one_page(unsigned int FlashAddr, unsigned char *buf)
{
  unsigned char bufptr, pagptr;
  boot_page_erase(FlashAddr);                  //erase one Flash page
  boot_spm_busy_wait();
  for(pagptr = 0; pagptr < SPM_PAGESIZE; pagptr += 2) //fill data to 
Flash buffer
  {
    boot_page_fill(pagptr, buf[pagptr] | (buf[pagptr + 1] << 8));
  }
  boot_page_write(FlashAddr);                  //write buffer to one 
Flash page
  boot_spm_busy_wait();                        //wait Flash page write 
finish
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren