Hallo alle zusammen,
ich arbeite gerade mit dem STM32F107 und möchte per SPI den Winkelsensor
AS5040 auslesen.
Das Interface aus dem Datenblatt des Sensors habe ich angehängt. Den
STM32 habe ich dazu wie folgt konfiguriert:
An sich funktioniert das Auslesen des Winkels, jedoch müsste ich meiner
Meinung nach 6 mal shiften, um den Winkel zu haben, da dieser die
obersten 10 Bit belegt. Den richtigen Winkel bekomme ich jedoch nur,
wenn ich 5 mal shifte. Das heißt ja eigentlich, dass das letzte Bit
nicht eingelesen wird.
Würde mich freuen, wenn mir jemand einen Tipp geben kann, an was dies
liegt oder ob ich ein Fehler in der Konfiguration gemacht hab.
Danke und Gruß
Paul
>SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
Wenn ich Deine Bildchen und das STM32 Datenblatt richtig interpretiere,
sollte das eher
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
sein.
Gruss
Scher
Aber egal, ob ich 5 oder 6 mal shifte, kommt trotzdem nicht das richtige
raus.
Ich hab ein Bild vom Logikanalysator angehängt. Wenn ich das Bild mit
dem aus dem Datenblatt des AS5040 vergleiche, sieht es aus, als würde
CSn zu früh auf high gehen. Könnte es daran liegen?
Wenn du das Bild aus dem Datasheet genau anschaust, dann kannst du
erkennen, dass es für das letzte Bit zwar eine Taktflanke gibt, durch
die es ausgelöst wird, aber keine, an der es durch den Controller
abgetastet werden könnte.
Der Sensor liefert das erste Datenbit so, dass es erst mit der zweiten
fallenden oder steigenden Taktflanke gesampelt werden kann. Einen
passenden SPI-Modus für dieses SSI-Protokoll gibt es nicht. Folglich
landen die Daten um ein Bit verschoben im Register und das letzte Bit
ist nicht verfügbar.
Wenn du dieses letzte Bit benötigst, dann kannst du nach der Übertragung
des Datenwortes und vor Deaktivierung des Sensors den Pinzustand
auslesen.
Der AS5040 ist ein ganz gemeiner Hund!
Du musst aufpassen, welchen Pegel der DI-Pin (MOSI) beim Selektieren des
Device hat. Sonst versetzt du ihn ggf. in den Programmiermodus, was du
bestimmt nicht willst oder??
Desweiteren ist entscheidend, dass der Sensor wohl einen kompletten
CLK-Puls benötigt bevor das erste Datenbit rausgetaktet wird, sonst
liest du das erste Bit immer als eine 1 und der ganze Datenstrom ist um
ein Bit verschoben... (Parity wird also abgeschnitten.)
Vielen Dank für die Tipps.
Also das Parity-Bit benötige ich eigentlich nicht. Wollte nur die
kompletten 16 Bit auslesen. Die Winkelinfo reicht mir schon, von daher
werd ich einfach 5 mal shiften.
Hey,
ich weiß der Thread ist alt, aber ich habe ein Problem seit Tagen,
welches ich mir nicht erklären kann.
Wenn ich den AS5040 über SPI auslesen möchte, fehlen die Datenbits 0-2.
Ich habe den Magneten 3x um 90° gedreht und folgendes erhalten:
Position|tDo|_____D0___|Systeminfos|D0(Dez)|DR(HEX)|DR(Dez)|
______|___|0123456789|__________|_______|_______|_______|
0_____|1__|0000010101|10011_____|21_____|82D3___|33459__|
90____|1__|0001010110|10011_____|86_____|8AD3___|35539__|
180___|1__|0000101010|10011_____|42_____|8553___|34131__|
360___|1__|0000011101|10011_____|29_____|82B3___|33715__|
Aus der Tabelle lässt sich ja erkennen, dass D0,D1,D2 immer Null sind.
In dem angehängtem Bild meines Logikanalyzers, sieht man, der Sensor
sendet auch genau diese Daten.
Ich weiß also nicht warum der Sensor diese Daten so sendet.
Mein SPI habe ich wie folgt deklariert: