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.