Forum: Mikrocontroller und Digitale Elektronik SAMC20: DMAC->CRC != srec_cat −crc32-l-e


von Simon G. (sigro)


Lesenswert?

Hallo,
bei der Berechnung des CRC-Wertes mittels srec_cat und der CRC-Einheit 
des SAMC Controllers bekomme ich leider keine gleichen Werte.
1
srec_cat "$(OutputDirectory)\$(OutputFileName).hex" -intel -crop 0 0x3FFFC -fill 0xFF 0 0x3FFFC −crc32-l-e 0x3FFFC -o "$(OutputFileName)_crc.hex" -intel -line-length=44
1
#define NVM_MEMORY ((volatile uint16_t *)FLASH_ADDR)
2
3
uint32_t crc32_val;
4
uint16_t tmp_data = NVM_MEMORY[(NVMCTRL_FLASH_SIZE-sizeof(crc32_val))/2];
5
crc32_val = tmp_data;
6
tmp_data = NVM_MEMORY[(NVMCTRL_FLASH_SIZE-sizeof(crc32_val)+2)/2];
7
crc32_val |= ((uint32_t)tmp_data<<16) & 0xFFFF0000;
8
9
10
DMAC->CRCCTRL.reg = DMAC_CRCCTRL_CRCSRC_IO | DMAC_CRCCTRL_CRCPOLY_CRC32 | DMAC_CRCCTRL_CRCBEATSIZE_HWORD;
11
DMAC->CTRL.bit.CRCENABLE = 1;
12
13
uint32_t flash_index = 0;
14
while (1)
15
{
16
  uint16_t tmp = NVM_MEMORY[flash_index];
17
  DMAC->CRCDATAIN.reg = tmp;
18
  while(!DMAC->CRCSTATUS.bit.CRCBUSY);
19
  DMAC->CRCSTATUS.bit.CRCBUSY = 1;
20
  flash_index++;
21
  if (flash_index >= ((NVMCTRL_FLASH_SIZE - sizeof(crc32_val))/2))
22
  {
23
    crc = DMAC->CRCCHKSUM.reg;
24
    if (crc != crc32_val)
25
    {
26
      fehler(TEST_FLASH_FAIL);
27
    }
28
29
    DMAC->CTRL.bit.CRCENABLE = 0;
30
    DMAC->CRCDATAIN.reg = DMAC_CRCDATAIN_RESETVALUE;
31
    DMAC->CRCCHKSUM.reg = DMAC_CRCCHKSUM_RESETVALUE;
32
    DMAC->CTRL.bit.CRCENABLE = 1;
33
    flash_index = 0;
34
  }
35
36
}
Kann mir eventuell jemand einen Tipp geben, was ich falsch mache?

Herzlichen Dank,
Simon

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Simon G. schrieb:
> bekomme ich leider keine gleichen Werte.
Sondern welche z.B.?
Welchen Wert erwartest du und welchen bekommst du?

Die von dir eingelesene crc32_val ist korrekt?

Muss die gespeicherte crc32_val auf den "hintersten" Flash-Bytes 
tatsächlich mit in die Berechnung der crc einfließen? Tut sie das auch 
bei der srec_cat Kommandozeile?

von Simon G. (sigro)


Lesenswert?

Lothar M. schrieb:
> Simon G. schrieb:
>> bekomme ich leider keine gleichen Werte.
> Sondern welche z.B.?
> Welchen Wert erwartest du und welchen bekommst du?
1
.hex: 10FFF000 F...F 563EC74F 63
2
crc32_val: 0x4fc73e56
3
crc:       0x68f46c17
Ich erwarte die gleichen Werte; Positionsfehler könnte ich noch 
verstehen, aber Werte die keinerlei Ähnlichkeit haben nicht.

> Die von dir eingelesene crc32_val ist korrekt?
Sie entspricht dem Wert im .hex File.


> Muss die gespeicherte crc32_val auf den "hintersten" Flash-Bytes
> tatsächlich mit in die Berechnung der crc einfließen? Tut sie das auch
> bei der srec_cat Kommandozeile?
Ich würde schon gerne den gesamten Flash überprüfen. Damit muss ich die 
Programmgröße nicht berücksichtigen.
Ich habe als Parameter für srec_cat die Länge, hoffentlich richtig, 
angegeben. Ich habe einen SAMC20E18A der eine Flash-Größe von 0x40000 
hat.
4 Bit für den CRC Wert abgezogen sollte 0x3FFFC ergeben.

Herzlichen Dank,
Simon

von Simon G. (sigro)


Lesenswert?

Ich habe den Fehler gefunden.
Es war der Startwert.
srec_cat nutzt standardmäßig −CCITT. ("The CCITT calculation is 
performed. The initial seed is all one bits. This is the default.")
1
srec_cat "$(OutputDirectory)\$(OutputFileName).hex" -intel -crop 0 0x3FFFC -fill 0xFF 0 0x3FFFC -crc32-l-e 0x3FFFC -XMODEM -o "$(OutputFileName)_crc.hex" -intel -line-length=44
ist der Aufruf entsprechend meines Codes.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.