Hallo Leute,
ich wollte mich mal hier über die Datenblätter von Infineon auslassen.
Zum einem um zu sehen, ob ich damit alleine bin oder nicht. Zum anderem
kann es ja sein, dass ich mich einfach nur doof anstelle und so kann ich
vielleicht Hilfe bekommen.
Konkret möchte ich mein Problem am User's Manual der XC2200-Familie mal
erläutern.
Auf den Seiten 20-79 bis 20-81 werden die Register MOCTRnH und
MOCTRnL erklärt, mit denen man die Message Objekte des Can-Moduls
einstellen kann.
Man kann dort z.B. definieren, ob es Sende- oder Empfangsobejtke sind,
ob sie valide sind und natürlich deren Statusbits. Mit dem Register
MOCTRnH kann man diese Flags laut Tabelle setzen und mit MOCTRnL
zurücksetzen.
Soweit so gut. (Das funktioniert auch. CAN läuft soweit ganz gut.)
Nun sieht man auch, dass diese Register nur geschrieben werden können
durch das Zeichen w für write unter jedem Bit. (OK, ich hole jetzt
sehr weit aus!)
Deshalb wollte ich nachlesen, wie man den Status NEWDAT abfragen kann.
Dazu steht im Datenblatt:
1 | The Message Object Control Register contains control bits for the CAN transfer and the
|
2 | message object link pointer. Each control bit has a corresponding bit in the CTRL field.
|
3 | A control bit is set by writing 1 to the corresponding bit in CTRL. It is cleared by writing
|
4 | 1 to the control bit directly. Any other combination leaves the control bit unchanged. ...
|
Von mir frei übersetzt heißt das soviel wie:
1 | Das Message Object Controll Register enthält die Steuerbits zur CAN-Übertragung und den Linkpointer zu den Message-Objekten.
|
2 | Ein Steuerbit wird gesetzt, wenn man das entsprechende Bit in das *CRTL* setzt. (Wohl eher *CTRH* oder?)
|
3 | Es wird gelöscht, wenn man direkt eine 1 hinein schreibt. (Was? Ahhh! Dann heißt das darüber also nicht _set_ sondern _reset_.)
|
4 | Alles andere lässt das Bit unverändert.
|
Da ist es wirklich schwer den wahren Sinn zu verstehen. Meint Ihr nicht?
Aber gut. Jetzt sind dass die Set- und Reset-Register. Vermutlich gibt
es ein separates Register, dass die Daten zum auslesen vorhält
**Dummstell**.
Wenn man mal schaut wie DaVE den Code erstellt um das Bit auszulesen,
kommt man aus dem Stauen nicht mehr heraus:
1 | #define CAN_ubNewData(ObjNr) (((CAN_HWOBJ[ObjNr].uwMOCTRL & 0x0008) == 0x0008) ? 1 : 0)
|
Was? Das hardwarseitig gesetzte Bit wird aus diesen Registern ausgelesen
und dann auch noch aus dem, der das Bit zurücksetzten soll?
Darauf wäre ich mittels Datenblatt niemals gekommen.
Aber warum steht da etwas überhaupt drin? ich denke man kann es nur
lesen!? Heißt das, dass das Flag auch schon wieder zurück gesetzt wurde?
Fragen über Fragen.
___________________________________________________________________
Also grundsätzlich ist mir das schon klar. Es gibt Controller die haben
Datenregister, deren Bits sich einzeln setzen lassen oder die man mit
UND löschen respektive mit ODER setzen muss.
Komfortablere Hardware bieten zusätzlich dafür Setz- und Lösch-Register
an.
Brauche ich zwar persönlich nicht, aber so vermeidet man eher Fehler.
Ich habe es aber noch nie gesehen, dass es nur Setz- und Lösch-Register
gibt ohne auf die Daten direkt zugreifen zu können.
Gut, dann dient wohl das LOW-Register zum auslesen. Oder vielleicht
sogar beide?
Damit könnte ich zur Not auch leben. Aber warum steht das nirgends?
Wer glaubt, dass sei ein Einzelfall, dem kann ich noch andere Beispiele
liefern.
Der XC2000er kommuniziert mit einem XC800er. Da sieht es nicht viel
besser aus.
Da mir hier im Forum aber schon einer (oder einige?) gesagt haben, dass
sie mit dem Datenblatt gut zurecht kommen, würde mich mal interessieren,
ob ich mich wirklich zu dumm anstelle oder ob diese Menschen aufgrund
ihrer Erfahrungen implizit Informationen herauslesen die so dort nicht
oder falsch stehen.
Gruß und Danke
Fabian