Forum: Mikrocontroller und Digitale Elektronik STM32F4 SPI + ADIS 16485


von Vincent H. (vinci)


Lesenswert?

Grüß euch

Ich kämpfe gerade mit der Realisierung einer SPI Kommunikation zwischen 
einem STM32F405 und der Analog Devices IMU ADIS16485.

Datenblatt IMU:
http://www.analog.com/static/imported-files/data_sheets/ADIS16485.pdf

Das Projekt wurde mit STMs Eclipse Plugin erstellt und wird mit einem 
Discovery-Board via SWD debugged. Somit finden bereits die neuesten Libs 
Verwendung und ich greife auch auf die darin vorhandenen SPI Funktionen 
zurück. Wichtig ist vor allem das Auslesen der 24x 16bit Sensorregister, 
sprich jeweils 3x achsig Beschleunigung, Gyroskop, Geschwindigkeit und 
Winkel.

Der Code tut nichts anderes als auf die richtige Page des Speichers zu 
setzen und dann die 24x Sensorregister der Reihe nach auszulesen. Im 
Prinzip funktioniert das ganze sowohl via polling, als auch 
interruptbasiert... jedoch nicht durchgehend.

Lasse ich die Endlosschleife laufen, so spuckt die IMU früher oder 
später keine sinnvollen Daten mehr aus. Zum Testen des Codes lasse ich 
mittendrin irgendwann einmal die Produkt-ID ausgeben, die einen 
statischen Wert hat. (TxBuffer[12])

Die Angaben im Datenblatt zur Initialisierung der SPI wurden 
eingehalten. Testweise wurde die Datenrate (sprich der SPI CLK) bereits 
runtergesetzt, jedoch mit dem selben Ergebnis.

Jetzt bin ich bereits etwas ratlos...
1
  spi_TxBuffer[0] = W_PAGE_ID0;
2
3
  HAL_SPI_Transmit(&hspi2, (uint8_t *)spi_TxBuffer, BUFFERSIZE, TIMEOUT);
4
5
  spi_TxBuffer[0]  = R_X_GYRO_LOW;
6
  spi_TxBuffer[1]  = R_X_GYRO_OUT;
7
  spi_TxBuffer[2]  = R_Y_GYRO_LOW;
8
  spi_TxBuffer[3]  = R_Y_GYRO_OUT;
9
  spi_TxBuffer[4]  = R_Z_GYRO_LOW;
10
  spi_TxBuffer[5]  = R_Z_GYRO_OUT;
11
  spi_TxBuffer[6]  = R_X_ACCL_LOW;
12
  spi_TxBuffer[7]  = R_X_ACCL_OUT;
13
  spi_TxBuffer[8]  = R_Y_ACCL_LOW;
14
  spi_TxBuffer[9]  = R_Y_ACCL_OUT;
15
  spi_TxBuffer[10] = R_Z_ACCL_LOW;
16
  spi_TxBuffer[11] = R_Z_ACCL_OUT;
17
  spi_TxBuffer[12] = R_PROD_ID;
18
  spi_TxBuffer[13] = R_X_DELTANG_OUT;
19
  spi_TxBuffer[14] = R_Y_DELTANG_LOW;
20
  spi_TxBuffer[15] = R_Y_DELTANG_OUT;
21
  spi_TxBuffer[16] = R_Z_DELTANG_LOW;
22
  spi_TxBuffer[17] = R_Z_DELTANG_OUT;
23
  spi_TxBuffer[18] = R_X_DELTVEL_LOW;
24
  spi_TxBuffer[19] = R_X_DELTVEL_OUT;
25
  spi_TxBuffer[20] = R_Y_DELTVEL_LOW;
26
  spi_TxBuffer[21] = R_Y_DELTVEL_OUT;
27
  spi_TxBuffer[22] = R_Z_DELTVEL_LOW;
28
  spi_TxBuffer[23] = R_Z_DELTVEL_OUT;
29
30
  /* Infinite loop */
31
  while (1)
32
  { HAL_Delay(200);
33
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_15);
34
35
    HAL_SPI_TransmitReceive_IT(&hspi2, (uint8_t *)spi_TxBuffer, (uint8_t *)spi_RxBuffer, BUFFERSIZE);
36
    //HAL_SPI_TransmitReceive(&hspi2, (uint8_t *)spi_TxBuffer, (uint8_t *)spi_RxBuffer, BUFFERSIZE, TIMEOUT);
37
38
  }




/edit
Ok, Problem soeben gelöst.
Ich hab unter NSS Hardware Management wohl was anderes verstanden als 
ST...
Es ist jedenfalls KEIN automatischer Chip Select.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.