Forum: Mikrocontroller und Digitale Elektronik STM32 IMU mit I2C auslesen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Walt N. (belayason)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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(&GTXBuffer[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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.