Hallo allerseits
ich lese von einer SD-Karte das CID-Register. Es beinhaltet ein 128 Bit
breites Bitfeld. Man kann die einzelnen Teile des Bitfelds als 4 Wörter
zu je 32 Bits lesen, wobei die Bits
127..96 -> Wort 0
95..64 -> Wort 1
63..32 -> Wort 2
31..0 -> Wort 0
verteilt sind. Ich möchte nun die Teile des Bitfelds mit einer Struktur
in C auswerten. Man könnte zwar mit Maskierung und Shiften etc. das auch
erledigen, aber der Cortex M bietet ja extra Befehle für Bitfelder und
ich denke mir, dass es mit einer Struktur schöner (und auch einfacher)
gehen müsste:
1 | typedef union
|
2 | {
|
3 | uint32_t cid[4];
|
4 | struct
|
5 | {
|
6 | unsigned mid : 8;
|
7 | unsigned oid : 16;
|
8 | uint64_t pnm : 40;
|
9 | unsigned prv : 8;
|
10 | unsigned psn : 32;
|
11 | unsigned rsvd1 : 4;
|
12 | unsigned mdt : 12;
|
13 | unsigned crc : 7;
|
14 | unsigned rsvd2 : 1;
|
15 | } __attribute__((packed));
|
16 | } cid_t;
|
Leider geht das so nicht wirklich. Die gelesenen Werte sind Mist. Ich
habe dann probehalber mal mid und oid auf bekannte Werte gesetzt und
geschaut, was dabei herauskommt. Setzt man in cid[4] alles auf 0 und
schreibt iin mid 0xff rein und in oid 0x8001, dann erhalte ich in cid[0]
den Wert 0x8001ff. Das ist irgendwie nicht ganz richtig, denn mid müsste
eigentlich auf das MSB abgebildet werden d.h. für mich es müsste, wenn
das Bitfeld richtig implementiert ist, der Wert 0xff800100 raus kommen
(entsprechend müsste natürlich ein 0xff800100 in cid[0] einen Wert von
0xff für mid und einen Wert von 0x8001 für oid ergeben).
Kurz gesagt: wie kann ich die Zuordnung der Bits im Bitfeld so
hinbiegen, dass mid die obersten 8 Bit von cid[0] abgebildet werden und
so weiter?