Forum: Mikrocontroller und Digitale Elektronik SENT Protokoll CRC Berechnung


von Werner (Gast)


Lesenswert?

Moin,

ich versuche gerade die CRC für das SENT Protokoll in C zu berechnen. 
Die Vorgaben sind:

- 4 Bit CRC
- Polynom 0x1D
- Startwert 0x05

Ich habe schon versucht einige Codebeispiele zu modifizieren, aber es 
kommen immer völlig andere Ergbnisse raus. Hat das schon mal jemand 
gemacht?

Werner
von Detlev Neumann (Gast)


Lesenswert?

Hallo

Schau mal Hier https://www.nxp.com/docs/en/application-note/AN4219.pdf
Kapitel 2.1.4

Beschreibt das vorgehen ich würde das so Prograammieren
1
const unsigned char tab_crc4[16] = {   
2
0, 3, 6, 5,   
3
12, 15, 10, 9,   
4
11, 8, 13, 14,   
5
7, 4, 1, 2 };   
6
   
7
unsigned char crc4(unsigned char buf[])   
8
{   
9
    char k=0, crc=0;   
10
   
11
    for(k=0;buf[k]!=NULL;k++)   
12
    {   
13
        crc^=buf[k]>>4;       //PARTE ALTA   
14
        crc=tab_crc4[crc];   
15
        crc^=buf[k]&0xF;    //PARTE BAIXA   
16
        crc=tab_crc4[crc];   
17
    }   
18
   
19
    return crc;

Gruß
Detlev
von Werner (Gast)


Lesenswert?

Hallo Detlev,

Danke schon mal für die Hilfe, damit klappt es aber leider auch nicht. 
Hier habe ich noch ein paar gemessene Rohdaten:

char data[] = {0x00, 0x05, 0x03, 0x0A, 0x08, 0x01, 0x0A, 0x0C};
char data[] = {0x00, 0x05 , 0x03 , 0x0B , 0x0B , 0x0E , 0x0A , 0x02};
char data[] = {0x04, 0x05 , 0x03 , 0x0B , 0x0E , 0x01 , 0x0A , 0x07};
char data[] = {0x00 , 0x05 , 0x03 , 0x0A , 0x01 , 0x08 , 0x0A , 0x06};
char data[] = {0x00 , 0x05 , 0x03 , 0x0A , 0x08 , 0x02 , 0x0A , 0x0A};

Das erste Nibble ist jeweils der Status, das letzte Nibble ist jeweils 
die gelesene CRC.

Werner
von Detlev Neumann (Gast)


Lesenswert?

Hallo Werner,

kennst Du das zu grundeliegende Generator Polynom?

Gruß

Detlev
von Detlev Neumann (Gast)


Lesenswert?

Denn 0x1D Klingt Kurz

:-)
von Detlev Neumann (Gast)


Lesenswert?

Polynom mit 0x1D kenne ich nur von einer CRC-8

SAE J2710 habe nochmals in die Spec geschaut und das
SENT Protocol hat das Polynom

Sorry dann kann ich auch nicht weiterhelfen
von Detlev Neumann (Gast)


Lesenswert?

Oder Versuche mal das Eventuell Klappt es
1
 
2
int generate_crc(unsigned int data[], int arr_length)
3
 {
4
    
5
 const int gpoly = 0x1D;  // generator polynomial 
6
 int crc = 0x05; // initial value of checksum
7
 printf(“\nAddress\tValue\n”);  // print data values and calculate CRC
8
9
 for (int index = 0; index <= arr_length-1; index++) 
10
    {
11
     printf(“0x%1X\t0x%04X\n”, index, data[index]);
12
     for (int bitnr = 7; bitnr >= 0; bitnr--) 
13
        {
14
         crc <<= 1;
15
         crc = (int) ((data[index] & (1u<<bitnr))>>bitnr);
16
         if (crc & 0x10) crc ^= gpoly;
17
        }
18
    }
19
 printf(“\nCalculated Checksum: 0x%02X\n”, crc);  
20
     // print calculated checksum
21
 return crc;
22
 }

Versprechen kann ich dir aber nichts
von Philipp (Gast)


Lesenswert?

Hallo Werner,
ist diese Thema schon gelöst?
Gruß, Philipp
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.