Setzen von Registern

OP #3352613
Lesenswert?

Hallo,

ich habe das Problem, dass ich nicht weiß, wie man am elegantesten die 
Register für die SPI-Initialisierung setzt. Ich habe die 
SPI-Initialisierungsmethode. Und der MEthode sollen die Registerwerte 
übergeben werden.

Dazu habe ich eine allgemeine SPI-Initialisierungsroutine. Der Methode 
wird jetzt übergeben, dass die SPI-Schnittstelle als Master agieren 
soll.

Wie schreibe ich das am besten, dass das passende Bit im Register 
UCA0CTL0 1 gesetzt wird bzw. bei Slave 0?

Ich hoffe, ihr versteht, was ich meine:S
#3352633
Lesenswert?

Florian Hinrichs schrieb:
> Wie schreibe ich das am besten, dass das passende Bit im Register
> UCA0CTL0 1 gesetzt wird bzw. bei Slave 0?

Na indem Du den bestehenden Wert aus dem Register holst, mit der Maske 
von Dir ver-xor-st und anschließend zurückschreibst. Idealerweise gibt 
es ein #define von Deinem Register und dann schreibst Du eigentlich nur:

<definitions.h>
#define REGISTER_NAME (*(0xFFFFFF));
#define IRGENDEIN_WERT 0x04;
</definitions.h>

<main.c>
REGISTER_NAME |= 0x04;
</main.c>

bzw.

<main.c>
REGISTER_NAME |= IRGENDEIN_WERT;
</main.c>
OP #3352636
Lesenswert?

Also nochmal:D Ich will eine SPI-Initialiseirungsroutine, der ich sagen 
kann, ob sie sich zb. als Master oder als Slave initialisieren soll. Wie 
mache ich das, ohne zwei seperate Routinen zu schreiben?

Benutzen tue ich den MSP430F5310 und programmiere mit C.

Auszug aus solch einer Initialisierungsroutine:

void SPI(void){

...

UCA0CTL0 |= UCMST;

...

}

Damit habe ich jetzt mein Master-SPI initialisiert. Jetzt will ich aber 
einen Slave-SPI haben. Dazu muss eigentlich nur aus UCA0CTL &= ~UCMST 
werden. Ich will jetzt aber nicht zwei solcher routinen haben, sondern 
nur eine, indem ich diesen Teil variabel setze. ABer ich habe keine 
Ahnung, wie ich das machen kann.
#3352647
Lesenswert?

Florian Hinrichs schrieb:

> Ich hoffe, ihr versteht, was ich meine:S

So ungefähr :-)
1
#define SPI_MASTER 0
2
#define SPI_SLAVE  1
3

4
void InitSPI( uint8_t asWhat )
5
{
6
  if( asWhat == SPI_MASTER )
7
  {
8
    .... mache die Initialisierung als Master
9
    .... und setze alle notwendigen Werte in den entsprechenden Registern
10
  }
11
  else
12
  {
13
    .... mache die Initialisierung als Slave
14
    .... und setzte alle dafür notwendigen Werte in den entsprechenden Registern
15
  }
16

17
  ... setzte noch die Werte, für die es egal ist, ob die Initialsierung
18
  ... als Master oder als Slave erfolgen soll
19
}

wenn du noch weitere Dinge hast, die du der InitSPI mitgeben willst, wie 
zb irgendwelche Geschwindigkeitsangaben oder dergleichen, dann führst du 
halt weitere Parameter dafür ein.


Oder ....
... du machst 2 getrennte Funktionen für die Initialisierung als Master 
oder als Slave
1
void InitSPICommonPart()
2
{
3
  ... das was alle SPI Konfigurationen gemeinsam haben.
4
}
5

6
void InitSPIMaster()
7
{
8
  ... den Master-spezifischen Teil
9
  InitSPICommonPart();
10
}
11

12
void InitSPISlave()
13
{
14
  ... den Slaveö-spezifischen Teil
15
  InitSPICommonPart();
16
}

und rufst dann eben die auf, die du im konkreten Anwendungsfall 
benötigst.

Oder ....
.... denk dir was anderes aus. Wie immer gilt: Es gibt mehr als einen 
Weg nach Rom, und sowas wie 'am besten' hängt ganz vom Anwendungsfall 
und zu einem nicht unerheblichen Teil auch von den persönlichen 
Vorlieben ab.
#3352664
Lesenswert?

Florian Hinrichs schrieb:
> Ja, ich habe massenweise Parameter. INsgesamt sind es 7 an der Zahl.

Da würde sich dann  zb anbieten, diese Parameter in eine struct zu 
packen und die als Parameter an die Funktion zu übergeben.

> Somit gäbe es einen ziemlich langen Code, wenn ich alles mit If und Else
> Prüfungen machen würde.

Ah geh.
7 if-else untereinander.
Das ist doch nicht ziemlich lang

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren