Hallo Leute,
ich versuche Rotationsdaten aus einem IMU (BHI160b) auszulesen. Dafür
habe ich mir das Shuttle Board von Bosch besorgt. Den Sensor möchte ich
gerne mit meinem NUCLEO-L053R8 betreiben. Daher habe ich mit CubeMX
meine I2C Schnittstelle, einen Interrupt Eingang und den User Button &
LED initialisiert ( siehe Bild CubeMX.png ). In dieses Projekt habe ich
dann diese library -
https://github.com/BoschSensortec/BHy1_driver_and_MCU_solution, mit
hilfe des bereitgestellten Driver porting guide hinzugefügt. Der erste
Schritt war die I2C read & write Funktionen im File "bhy_support.c" auf
die Zielplatform anzupassen. Mit Hilfe der HAL library habe ich es wie
folgt umgesetzt:
1 | uint8_t GTXBuffer[256];
|
2 |
|
3 | int8_t SensorAPI_I2Cx_Read(uint8_t slave_address7, uint8_t subaddress, uint8_t *pBuffer, uint16_t ReadNumbr)
|
4 | {
|
5 | uint16_t DevAddress = slave_address7 << 1;
|
6 |
|
7 | // send register address
|
8 | HAL_I2C_Master_Transmit(&I2C_HANDLE, DevAddress, &subaddress, 1, BUS_TIMEOUT);
|
9 | HAL_I2C_Master_Receive(&I2C_HANDLE, DevAddress, pBuffer, ReadNumbr, BUS_TIMEOUT);
|
10 | return 0;
|
11 | }
|
12 |
|
13 | int8_t SensorAPI_I2Cx_Write(uint8_t slave_address7, uint8_t subaddress, uint8_t *pBuffer, uint16_t WriteNumbr)
|
14 | {
|
15 | uint16_t DevAddress = slave_address7 << 1;
|
16 |
|
17 | GTXBuffer[0] = subaddress;
|
18 | memcpy(>XBuffer[1], pBuffer, WriteNumbr);
|
19 |
|
20 | // send register address
|
21 | HAL_I2C_Master_Transmit(&I2C_HANDLE, DevAddress, GTXBuffer, WriteNumbr+1, BUS_TIMEOUT);
|
22 | return 0;
|
23 | }
|
Anschließend habe ich mein NUCLEO Board mit dem Shuttle Board (siehe
Bild ShuttleBoard Connector.png ) des BHI160 wie folgt angeschlossen:
1 | ___J1___|___NUCLEO___
|
2 | 1/2 | 3.3V
|
3 | 3 | GND
|
4 | 17 | PB7 -> I2C1_SCL
|
5 | 18 | PB6 -> I2C1_SDA
|
6 | 21 | PB5 -> DI/BHI160_INT
|
Da nun der Treiber mit der Zielplatform verknüpft ist gilt es nur noch
diesen richtig zu benutzten, was sich für mich als schwieriger als
gedacht herausstellt. In der Dokumentation heißt es das der Treiber dir
in 3 Schritten hilft die Daten auszulesen. Initialisierung,
Konfigurierung und Data readout. Daher habe ich erstmal begonnen meinen
Sensor zu initialisieren. In meiner main Funktion rufe ich die Funktion
bhy_initialize_support(); auf.
1 | int main(void)
|
2 | {
|
3 | /* MCU Configuration--------------------------------------------------------*/
|
4 | HAL_Init();
|
5 | SystemClock_Config();
|
6 | MX_GPIO_Init();
|
7 | MX_I2C1_Init();
|
8 | /* USER CODE BEGIN 2 */
|
9 | bhy_initialize_support();
|
10 | /* USER CODE END 2 */
|
11 | while (1)
|
12 | {
|
13 | if(HAL_GPIO_ReadPin(Button_GPIO_Port, Button_Pin) == 0)
|
14 | {
|
15 | //HAL_GPIO_WritePin(User_LED_GPIO_Port, User_LED_Pin, 1);
|
16 | GPIOA->BSRR = (1<<5);
|
17 | }
|
18 | else
|
19 | {
|
20 | //HAL_GPIO_WritePin(User_LED_GPIO_Port, User_LED_Pin, 0);
|
21 | GPIOA->BSRR = (1<<21);
|
22 | }
|
23 | }
|
24 | }
|
Nach erfolgreichem bauen habe ich eine Debug Session gestartet und in
diese Funktion reingeschaut. Es wird erfolgreich die ProductID abgerufen
und mit einem "return BHY_SUCCESS" beendet. Daher gehe ich davon aus das
zumindest die I2C Verbindung schon mal klappt.
Bosch bietet auch Beispielprogramme -
https://github.com/BoschSensortec/BHy1_driver_and_MCU_solution/tree/master/examples
in ihrer Github repository an. Da ich Lagedaten geliefert haben möchte
bietet sich das "rotation_vector_example.c" an. Diese Besteht aus zwei
Funktionen, einmal der static void sensors_callback_rotation_vector()
und void demo_sensor().
Ich habe alle Variablen und Macros sowie die zwei Funktionen in meine
main.c eingefügt. Da die Funktion void demo_sensor() das bhy hub startet
habe ich diese einfach in meiner main Funktion aufgerufen. Sobald ich
diese Funktion aufrufe bekomme ich beim compilieren probleme.
1 | BHI160b\BHI160b.axf: Error: L6406E: No space in execution regions with .ANY selector matching main.o(.data).
|
2 | BHI160b\BHI160b.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32l053xx.o(STACK).
|
3 | ...
|
4 | ...
|
5 | ...
|
6 | BHI160b\BHI160b.axf: Error: L6407E: Sections of aggregate size 0x6ebc bytes could not fit into .ANY selector(s).
|
Das ist ein zusätzlicher Error den ich mir nicht erklären kann... Sollte
doch genug Speicher vorhanden sein um einen Sensor auszulesen.
Außerdem bin ich mir nicht mal sicher wie ich dieses Beispielprogramm
genau benutze um endlich an die Sensordaten zu kommen.
Vielen dank schonmal im vorraus!