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:
1 | SPI_I2S_DeInit(SPI3);
|
2 | SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
|
3 | SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
|
4 | SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
|
5 | SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
|
6 | SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
|
7 | SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
|
8 | SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
|
9 | SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
|
10 | SPI_Init(SPI3, &SPI_InitStructure);
|
11 |
|
12 | SPI_Cmd(SPI3, ENABLE);
|
Um den Winkelinformationen auszulesen nutze ich folgende Routine:
1 | GPIOA->BRR = GPIO_Pin_4; // Chip-Select low
|
2 | SPI_I2S_SendData(SPI3, 0x55); // Dummy-Byte senden
|
3 | while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) == SET) {} // warten solange Busy-Flag gesetzt ist
|
4 | GPIOA->BSRR = GPIO_Pin_4; // Chip-Select high
|
5 | AS_Winkel = SPI_I2S_ReceiveData(SPI3); // Winkelinfos lesen
|
6 | AS_Winkel >>= 5; // shiften
|
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