16bit bzw 32bit über SPI senden

Gast #1546473
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 #1546478
Sorry, ich hab eben den Fehler selbst gefunden ...
1
Wert = (Wert & LS8bit);
2
Wert = (Wert << 8);
3
Wert = (Wert & MS8bit);

So wird es zmindest mal vom Compiler akzeptiert.


Liebe Grüße
Crash
Gast #1546588
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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.