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
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
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
Hallo Werner, kennst Du das zu grundeliegende Generator Polynom? Gruß Detlev
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.