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.