16bit bzw 32bit über SPI senden

Gast #1546473
Lesenswert?

Hallo Freunde der Frickelei!

Ich beschäftige mich momentan mit einem MSP430 und würde gernen über die 
eingebaute SPI-Schnitstelle ein Kontollwort(16bit bzw 32bit) an einen 
anderen Chip senden.
Ebenfalls über SPI kommt die Antwort.
In diesem Fall ein Messwert eines ADC(16bit).
Das "SPI-Schieberegister" ist ja nun nur 8bit groß ... also muss ich es 
"in Häppchen" verschicken, bzw empfangen.

Hier erstmal mein Code:
1
uint16_t ADC_Wert(uint8_t Messpunkt)
2
{
3
uint16_t Wert=0x0000;
4
uint8_t LS8bit = 0x00;
5
uint8_t MS8bit = 0x00;
6

7

8
ADC_SPI_Init();
9

10
//ChipSelect@LOW
11
ADC_SPI_CS_LOW;
12

13
ADC_Kanal(Messpunkt);
14

15
MS8bit = ADC_SPI_Lesen();
16
LS8bit = ADC_SPI_Lesen();
17

18
//Nun werden die 2*8bit zu einem 16bit-Wort zusammengesetzt:
19
Wert = (ADC_Wert & LS8bit);
20
Wert = (ADC_Wert << 8);
21
Wert = (ADC_Wert & MS8bit);
22

23
ADC_Sleep();
24

25
//ChipSelect@HIGH
26
ADC_SPI_CS_HIGH;
27

28
return Wert;
29
}



Leider wehrt sich der Compiler (IAR) ...
"expression must have integral type" kommentiert er bei diesen 3 Zeilen:
1
Wert = (ADC_Wert & LS8bit);
2
Wert = (ADC_Wert << 8);
3
Wert = (ADC_Wert & MS8bit);

Hab mittlerweile herausgefunden, daß es offenbar an der Zwangsheirat 
eines 8bit mit einem 16bit Wert liegt ... wie bekomm ich das in den 
Griff?


Vielen Dank,
Crash
Gast #1546588
Lesenswert?

Hallo Tom M.!

Ich verstehe nicht ganz was Du meinst?
Hatte mir das so gedacht:



LS8bit=xxxxxxxx
MS8bit=yyyyyyyy
Wert=00000000 00000000

> Wert = (ADC_Wert & LS8bit);
Wert=00000000 xxxxxxxx

> Wert = (ADC_Wert << 8);
Wert=xxxxxxxx 00000000

> Wert = (ADC_Wert & MS8bit);
Wert=xxxxxxxx yyyyyyyy

Wobei mir da gerade auffällt, daß ich MSB und LSB in der Reihefolge 
vertauschen muss ;)



Gruß
Crash
Gast #1546608
Lesenswert?

Aahhh !

Also so:
1
uint16_t Wert=0xFFFF;
2
uint8_t LS8bit = 0x00;
3
uint8_t MS8bit = 0x00;
4

5
Wert = (ADC_Wert & MS8bit);
6
Wert = (ADC_Wert << 8);
7
Wert = (ADC_Wert & LS8bit);


Oder so:
1
uint16_t Wert=0x0000;
2
uint8_t LS8bit = 0x00;
3
uint8_t MS8bit = 0x00;
4

5
Wert = (ADC_Wert | MS8bit);
6
Wert = (ADC_Wert << 8);
7
Wert = (ADC_Wert | LS8bit);

Was ich an deinem Konstruk noch nicht verstehe Tom ist dieser Teil:
(uint16_t)MS8bit
Ist das auch eine verODERung?


Gruß
Crash

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