Forum: Mikrocontroller und Digitale Elektronik MS5611 - CRC Berechnung


von Carsten M. (ccp1con)


Lesenswert?

Hallo Leute,

Es hat doch bestimmt jemand einen MS5611 Drucksensor im Einsatz?

Ich bekomme die CRC Prüfung der Koeffizienten partout nicht hin.

Von der Adresse 7 (0xAE) lese ich 0x1C18 aus dem PROM.
Laut Datenblatt sollen dort 4 bit CRC enthalten sein.
Wenn ich mir das Codebeispiel anschaue, setzt sich das letzte Byte aus 4 
Nullen und eben dem 4 CRC bits zusammen.
Nur passt da weder 0x1C noch 0x18 in das Muster!

Kann mir jemand dabei helfen?
Wäre schön - Danke.

von kaplic (Gast)


Lesenswert?

Hier das Datenblatt: 
http://www.meas-spec.com/downloads/MS5611-01BA03.pdf
Auf Seite 12 steht: Guckst du in application note AN520!

Hier brauchst du nicht mal selbst programmieren, sondern nur kopieren!
AN520: 
http://www.meas-spec.com/downloads/C-Code_Example_for_MS56xx,_MS57xx_%28except_analog_sensor%29_and_MS58xx_Series_Pressure_Sensors.pdf

Gruß

von Carsten M. (ccp1con)


Lesenswert?

Hm danke Kaplic,

aber natürlich habe ich beide Dokumente schon studiert!
Und schnödes Kopieren ist erstens nicht mein Stil und entfällt, weil ich 
die CRC engine des Mikros benutzen will.

Also die Frage war, ob mir jemand sagen kann, welcher Wert sein Sensor 
auf der Adresse 7 "serial code and CRC" gespeichert hat?

Danke

von Carsten M. (ccp1con)


Lesenswert?

Oder vielleicht kann mir jemand sagen, welchem CRC Polynom folgender 
Algorithmus entspicht:

ich dachte es ist x^1 +1

1
     for (cnt = 0; cnt < 16; cnt++)     // operation is performed on bytes
2
     { // choose LSB or MSB
3
4
          if (cnt%2==1) n_rem ^= (unsigned short) ((n_prom[cnt>>1]) & 0x00FF);
5
          else n_rem ^= (unsigned short) (n_prom[cnt>>1]>>8);
6
7
          for (n_bit = 8; n_bit > 0; n_bit--)
8
          {
9
               if (n_rem & (0x8000))
10
               {
11
                    n_rem = (n_rem << 1) ^ 0x3000;
12
               }
13
               else
14
               {
15
                    n_rem = (n_rem << 1);
16
               }
17
          }
18
     }
19
     n_rem= (0x000F & (n_rem >> 12));   // final 4-bit reminder is CRC code

von ala42 (Gast)


Lesenswert?

Welcher Wert bei anderen Chips auf Adresse 7 steht, ist doch egal und 
hilft Dir nicht weiter. Die CRC mit der Engine des Micros zu berechnen, 
wenn Du die schon mit dem Beispielcode nicht hinbekommst, wird das 
Problem auch nicht lösen. Da die CRC auch nur einmalig berechnet wird, 
macht das auch keinen Sinn.
Nimm mal meinen Code von 
https://github.com/AeroQuad/AeroQuad/blob/development/Libraries/AQ_BarometricSensor/BarometricSensor_MS5611.h 
um zu sehen, dass der MS5611 ok ist, danach kannst Du das ja immer noch 
anders machen.

von Carsten M. (ccp1con)


Lesenswert?

CRC ist ok, wenn ich den Beispielcode laufen lasse.

Das mit der CRC engine vom Mikro ist mehr so als Übung gedacht.
Hat keinen nennenswerten Vorteil, ich weiß.
Der code sieht halt eleganter aus (es wären nur 5 Zeilen).

Mich irritiert halt der Aufbau des LSB auf Adresse 7.

Es heißt: die letzten 4 bit sind der CRC code und bei der Berechnung ist 
das letzte Byte null zu setzten.
Wie zum Teufel kommt dann 0x18 zustande (0b0001 1000)?

Wieso ist das vierte bit gesetzt (0x10)?
Aber sicherlich läuft das unter der Kategorie - don't care.

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.