Steffen schrieb:
> Also weil ich zwei Byte lsen will, muss ich zwei Byte senden, weil durch
> das Senden die Clock des SPI gestartet wird quasi. Der EIngang des ADT
> ist nicht angeschlossen, da der PowerDown Modus nicht benötigt wird.
>
> Somit wäre es dann hier egal, was ich an der Stelle
>
> UDR1= (char)(in >> 8);
>
> und
>
> UDR1= (char)in;
>
> schreibe, Hauptsache ist, dass ich was schreibe, damit die Clock
> läuft!?!
Richtig. Was du sendest ist aber nicht immer Egal, denn wie bereits
geschrieben wird meist ein Befehl oder die Adresse gesendet, und der
SPI-Master antwortet im ersten Byte erstmal gar nicht sondern erst beim
zweiten weil er dann ja erst die Adresse des Registers weiß. In diesem
Fall ist es eben anders. Er fängt wohl sofort an zu senden und ignoriert
bis auf das dritte Bit vom erstem Byte alle geschriebenen Daten.
Du kannst also schreiben was du willst, nur wenn du nicht den Power-Down
Mode versehendlich aktivieren willst solltest du eben das dritte bit auf
0 lassen.
Du kannst genauso gut schreiben:
1 | in = 0;
|
2 | while (!( UCSR1A & (1<<UDRE1))); // Warten Empfangs-Puffer leer
|
3 | UDR1= in;
|
4 | while (!(UCSR1A & (1<<RXC1))); // Warten bis Daten empfangen
|
5 | sensor= (UDR1<<8); // Ersten 8 Bit MSB
|
6 | while (!( UCSR1A & (1<<UDRE1))); // Warten Empfangs-Puffer leer
|
7 | UDR1= in;
|
8 | while (!(UCSR1A & (1<<RXC1))); // Warten bis Daten empfangen
|
9 | sensor+= UDR1;
|
Es gibt auch Bausteine die erwarten erstmal einen 8 Bit Befehl worauf
sie dann mit einem 16 Bit-Wert Antworten. Hier schreibt man also erstmal
die 8-Bit Befehl und danach zwei Dummy-Bytes (welche durch den Baustein
ignoriert werden) um die zwei 8-BitWerte auszulesen.