STM32F4 SPI + ADIS 16485

OP #3619948
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren