das ist mein erster Beitrag und hoffe alle Regeln zu beachten.
Zu meinem Problem: ich bin neu in der STM Umgebung sowie der Programmierung.
Ich möchte nun einen Sensor (PST360G2-1S) mit dem STM32-L432KC auslesen.
Leider stoße ich an Probleme, die ich mir leider nicht erklären kann.
Im Anhang findet Ihr meinen Code sowie das Datenblatt zur Kommunikation des Sensors.
Eingestellt habe ich in der Cube folgendes:
SPI Mode: Full-Duplex Master
Hardware NSS Signal Disable
Frame Format: Motorola
Data Size: 8 Bits
Prescaler: 2
CPOL: Low
CPHA: 1 Edge
Die ausgelesenen Werte seinen nicht zu stimmen.
Könnt Ihr mir dabei helfen dem Problem auf den Grund zu gehen?
Könnt Ihr mir dabei helfen dem Problem auf den Grund zu gehen?
Nimm ein Oszilloskope und sieh Dir die Signale an.
Ohne Oszilloskope definiere Dir ein paar Portpins passend für synchrone Übertragung und lass die Pins per Software 'wackeln'. Das kann ganz langsam passieren und mit LEDs kontrolliert werden.
Zu Cube kann ich nichts sagen, das ist mir zu kompliziert.
Jede Operation liefert einen Wert eines bestimmten Typs.
xxx << n liefert einen Wert des Typs, den xxx hat.
Welchen Typ sollte man denn sonst nehmen?
Beispiel:
uint8_t xyz = 3;
In Bits geschrieben ist der Wert der Variablen 00000011.
Der Ausdruck (xyz << 7) hat den Typ uint_8 und den Wert 10000000. Ein Bit ist im Nirvana verschwunden.
Bei (xyz << 8) ist der Wert also immer 00000000.
Selbst wenn man nach dem Verschieben castet, ändert das nichts: Erst wird der Wert (= 00000000) ermittelt, dann wird der Cast ausgeführt:
(uint16_t) (xyz << 8) ist also 0000000000000000
Man muss also den Cast vor dem Verschieben ausführen, um einen 16-Bit-Wert zu bekommen: ((((uint16_t)yxz)) << 8), das ergibt den gewünschten Wert 0000001100000000.
Ohne überflüssige Klammern (uint16_t)yxz << 8
Das ist ein 32bit Controller, sprich er führt die Operation in
einem 32bit Register durch. Da verschwindet gar nix.
Das ist eine Frage der C-Semantik. Eine uint8_t-Variable hat nun mal aus Programmierersicht genau 8 Bit, und der Compiler muss entsprechend übersetzen.
Das ist eine Frage der C-Semantik. Eine uint8_t-Variable hat nun mal aus
Programmierersicht genau 8 Bit, und der Compiler muss entsprechend
übersetzen.
Ja gebe dir ja Recht,
um es universell zu halt würde ich es wohl auch erst casten.
Sollte so aber auch funktionieren.
Seit Jahren funktioniert hier auch, daß Leute aufschlagen, nur Fragen stellen, keine Details angeben und erwarten, ihre Probleme anhand zugeworfener Häppchen gelöst zu bekommen.
Es werden keine Zwischenwerte (Inhalt von data[]) angegeben, nur ein printf()-Wert erwähnt, der angeblich falsch sein soll, und dann irgendwann gemotzt, daß ihm nicht geholfen wird.
Ok, da hast du Recht. Aber ich habe auch Recht. ;-)
Die Integer Promotion funktioniert – entgegen der Aussage von Adam P. – nicht bis zu beliebig großen Datentypen. "Kleine" Typen werden nur bis zur Größe eines 'int' aufgeblasen:
https://en.cppreference.com/w/cpp/language/implicit_conversion#Integral_promotion
if T is char8_t, (since C++20)char16_t, char32_t or (since C++11)wchar_t, val can be converted according to the rules specified in item (3);
otherwise, if the integer conversion rank of T is lower than the rank of int:
val can be converted to a prvalue of type int if int can represent all the values of T;
otherwise, val can be converted to a prvalue of type unsigned int.
Wenn der Prozessor größere Register hat, als es einem 'int' entspricht, dann verschwinden beim Links-Shift die weiteren Bits im Nirvana. Ggf. muss der Compiler eben einen Befehl zum Löschen einfügen:
The value of a << b is the unique value congruent to a * 2b
modulo 2N
where N is the number of bits in the return type (that is, bitwise left shift is performed and the bits that get shifted out of the destination type are discarded).
Die Integer Promotion funktioniert – entgegen der Aussage von Adam P. –
nicht bis zu beliebig großen Datentypen. "Kleine" Typen werden nur bis
zur Größe eines 'int' aufgeblasen:
Was anderes habe ich nie behauptet!
Kein Mensch redet hier von 64 oder 128bit variablen.
Die Integer Promotion funktioniert – entgegen der Aussage von Adam P. –
nicht bis zu beliebig großen Datentypen. "Kleine" Typen werden nur bis
zur Größe eines 'int' aufgeblasen:
Was anderes habe ich nie behauptet!
Du hast gesagt, es würde bis auf die Registergröße von 32 Bit aufgeblasen. Ich glaube aber nicht, dass 'int' in diesem Fall 32 Bit hat, es wird 16 Bit haben. Oder?
Du hast gesagt, es würde bis auf die Registergröße von 32 Bit
aufgeblasen. Ich glaube aber nicht, dass 'int' in diesem Fall 32 Bit
hat, es wird 16 Bit haben. Oder?
Hey zusammen und an die, die das in der Zukunft lesen werden.
Die Probleme, welche ich hatte, sind behoben und ich bekomme die richtigen Winkel auf dem STM32 L4 raus.
Einstellungen für STMCube:
SPI Mode: Full-Duplex Master
Hardware NSS Signal Disable
Frame Format: Motorola
Data Size: 8 Bits
Prescaler: 256 (Das ist eine Notwendige Änderung)
CPOL: Low
CPHA: 2 Edge (Das ist eine Notwendige Änderung)
Ich hoffe das hilft jemandem in der Zukunft auch!
Ein Tipp von mir als Anfänger für weitere Anfänger: beschäftigt euch mit dem Datenblatt ausreichend, um wirklilch jeden einzelnen Schritt zu verstehen. Dann ist es leichter Fehler zu finden. Außerdem versteht die Commands, die Ihr benutzt und wie diese aufgebaut sind.
Also dann, danke an jede/n, der/die mir geholfen hat!