Python Dow CRC mit crcmod (I2C und RPi)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Der_Michl82
User
Beiträge: 4
Registriert: Sonntag 2. Februar 2014, 20:42

Hallo zusammen,

ich bastel momentan an meinem Raspberry Pi und spreche mit I2C eine Schrittmotorkarte an. Da ich momentan über ein Steckboard arbeite und eine längere I2C Leitung verwende, fange ich mir noch recht viele Busstörungen ein. Die Schrittmotorkarte kommt aus dem Roboternetzbereich und unterstützt CRC-8 (Dallas/Maxim - Polynom 8C). Natürlich auf Bascom mit abgestimmt.
Um die Busstörungen zu erkennen (Behebung und Fehlersuche dort später) will ich den CRC nun auswerten. Nun habe ich schon viel hin und her gerechnet und probiert und weiß einfach nicht mehr weiter. Bascom hat eine crc8 Funktion, um das ganze zu berechnen. Diese Funktion wollte ich "mal schnell" in Python abbilden. Mittlerweile habe ich schon 2 Tage damit verblasen und komme nun nicht mehr weiter. Bascom und die Webseite http://www.datastat.com/sysadminjournal/maximcrc.cgi liefern mir andere Werte als ich von Hand berechnet habe, bzw. mir die crcmod Bib liefert.
Bascom und die Seite liefern mir als Ergebnisse für die Werte
Dez: 55, 1, 200, 0, 0 ,0
oder in Hex: 0x37, 0x01, 0xC8, 0x0, 0x0, 0x0
den CRC Wert 128 in Dezimal, bzw. 80 in Hex zurück.

crcmod selbst unterstützt laut eigener Homepage auch den Maxim.
Leider klappt das in meinen Tests nicht.

Code: Alles auswählen

import crcmod.predefined

sample1=('3701c800000')
sample2=('0x3701c800000')
sample3=('0x37, 0x1, 0xc8, 0x0, 0x0, 0x0')
sample4=('0x37, 0x01, 0xc8, 0x00, 0x00, 0x00')
print "Print Sample1 ", sample1
print "Print Sample2 ", sample2
print "Print Sample3 ", sample3
print "Print Sample4 ", sample4
crc8_func = crcmod.predefined.mkPredefinedCrcFun('crc-8-maxim')
print "Print CRC Sample1 ", crc8_func(sample1)
print "Print CRC Sample2 ", crc8_func(sample2)
print "Print CRC Sample3 ", crc8_func(sample3)
print "Print CRC Sample4 ", crc8_func(sample4)
das Ergebnis:

Code: Alles auswählen

Print Sample1  3701c800000
Print Sample2  0x3701c800000
Print Sample3  0x37, 0x1, 0xc8, 0x0, 0x0, 0x0
Print Sample4  0x37, 0x01, 0xc8, 0x00, 0x00, 0x00
Print CRC Sample1  22
Print CRC Sample2  234
Print CRC Sample3  233
Print CRC Sample4  56
Nun verstehe ich langsam nichts mehr => Nehme ich nur einen Wert (z.B. Dez 201, Hex C9) und lasse ihn durch die Homepage oder Bascom laufen, erhalte ich Dez 86, bzw. Hex 56.
Berechne ich das ganze von Hand nach Beispiel Wiki oder berechne ich das mit crcmod, bekomme ich jeweils einen anderen Wert.

Ich frage mich nur, was ich übersehe... :(

Gruß

Michael
BlackJack

@Der_Michl82: Ich denke mal Du übersiehst das die Zeichenketten nicht die Bytewerte enthalten die Du prüfen willst sondern verschiedene *Darstellungen* als (Hex)Ziffern der tatsächlichen Werte. All Deine vier Samples sind deutlich länger als 6 Bytes. Das tatsächliche Sample müsste eher so aussehen:

Code: Alles auswählen

In [31]: sample = '\x37\x01\xc8\0\0\0'

In [32]: sample
Out[32]: '7\x01\xc8\x00\x00\x00'

In [33]: len(sample)
Out[33]: 6
Der_Michl82
User
Beiträge: 4
Registriert: Sonntag 2. Februar 2014, 20:42

Hi,

einfach mal jemanden Fragen, der sich damit auskennt... :(

Code: Alles auswählen

import crcmod.predefined

sample1='\x37\x01\xc8\0\0\0'
sample2='\xC9'
crc8_func = crcmod.predefined.mkPredefinedCrcFun('crc-8-maxim')
print "Print CRC Sample1     ", crc8_func(sample1)
print "Print CRC Sample1 HEX ", hex(crc8_func(sample1))
print "Print CRC Sample2 ", crc8_func(sample2)
print "Print CRC Sample2 HEX ", hex(crc8_func(sample2))
und die Ausgabe:

Code: Alles auswählen

Print CRC Sample1      128
Print CRC Sample1 HEX  0x80
Print CRC Sample2  86
Print CRC Sample2 HEX  0x56
Shame on me...

DANKE !!!!

Gruß

Michael
Benutzeravatar
mobby
User
Beiträge: 76
Registriert: Donnerstag 17. April 2014, 09:43

Hallo Leute,

ich stehe vor einem ähnlichen Problem wie Der_Michl82, denn auch ich versuche mit dem crcmod-Modul ein CRC-Wert zu berechnen. Allerdings glaube ich, dass es mir vielleicht noch etwas am Verständnis liegt. Auf jeden Fall der Übergang zwischen Theorie und Praxis.

Ich arbeite mit der Hardware 1-Wire DS18B20-Temperatursensor. Aus dem Application Letter 27 von Maxim kann ich den Aufbau des CRCs entnehmen. Jetzt scheitert es allerdings an der praktischen Umsetzung. Ich arbeite auch mit folgendem Code:

Code: Alles auswählen

import crcmod.predefined


sample=''

crc8_func = crcmod.predefined.mkPredefinedCrcFun('crc-8-maxim')
print "Print CRC Sample    ", crc8_func(sample)
print "Print CRC Sample HEX   ", hex(crc8_func(sample))
Nur wie muss ich meine 64-Bitfolge richtig eingeben, damit der CRC-Wert berechnet wird?

Mein Verständnis bisher:

Der Sensor baut eine 64-Bitfolge aufbauend aus "family code" (8-bits), "serial number" (48-bits) und, da es mit crc-8 arbeitet, 8-bits 0er. Dann teilt der Chip auf der Hardware diese 64-Bitfolge durch das Generatorpolynom, welches bei „crc-8-maxim“ mit „0x131“ angegeben ist. Das Ergebnis muss ja ein 8-bits langer CRC-Wert sein. Dieser wird wieder an „f. code“ + „s. number“ gehängt und an den Empfänger auf der Busleitung geschickt. Dieser Empfänger (ich) erhält die 64-Bitfolge und teilt sie wieder durch das Generatorpolynom. Das Ergebnis muss ja dann „0x00“ bzw. „00“ sein, dass alles korrekt übertragen wird.

Nur jetzt scheitert es daran dieses theoretische, hoffentlich richtige, Wissen anzuwenden. Weil egal auf welche erdenkliche Weise ich die Werte prüfe, kommt nur Mist raus. Wenn ich z.B. den 64-Bit ROM-Code aus dem Application Letter 27-Beispiel verwende. (A2 00 00 00 01 B8 1C 02), dann muss da ja theoretisch, wie auch im Letter beschriben) „00“ rauskommen, tut es aber nicht .
Und meine Annahme wie der 64-Bit ROM-Code aufgebaut ist, sollte ja auch hoffentlich stimmen.

A2 = CRC-Value nachdem die Hardware geteilt hat.
00 00 00 01 B8 1C = serial number
02 = family code

Ich hoffe, dass mir jemand auf die Sprünge helfen kann.

Gruß
mobby
Antworten