SENT Protokoll CRC Berechnung

Gast #5283760
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
Gast #5283868
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
Gast #5283957
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
Gast #5289615
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
Gast #5289631
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.