Hello, I’m facing an issue that I can’t quite figure out. I’m working on getting the BNO086 IMU to run with a BGM121 module (EFR32BG1 chip) using Simplicity Studio .
Some parts of the setup are working fine:
- I receive the “reset complete” message from the BNO086.
- When I request the Product ID, I get a valid response as expected.
Next, I attempt to disable the unused sensors and enable the ROTATION_VECTOR feature. That’s where the problem begins.
According to the datasheet, I’m sending a proper Set Feature command to enable the ROTATION_VECTOR. In return, I get a 0xFC response, which seems like a positive acknowledgment. However, the report interval stays at 0 , and as a result, I never receive any sensor data .
To cross-verify my approach, I recreated the same logic on an Arduino Mega using the BNO086, and everything works perfectly there. This leads me to believe that the issue lies somewhere in the implementation under Simplicity Studio or something specific to the BGM121 environment.
If anyone has experienced something similar or has any insights, I’d really appreciate your help.
I’m happy to explain the problem in more detail if needed.
I’ve also shared:
- My main application file (app.c)
- Output logs from Simplicity Studio
- The working Arduino code
Let me know if you’d like to take a look — any input is welcome!
there is the log :
00>
00>
00> ===== BNO086 STARTUP =====
00> Interrupt pin configured, state: 0
00> INIT: Clearing initial queue
00> ===== readI2C: ÃTAT 0 =====
00> ÃTAT 0: Lecture en-tete SHTP
00> Octets disponibles: 4
00> En-tête reçu: [0xC8 0x80 0x00 0x04]
00> Canal: 0, Séquence: 4, Taille totale: 200 octets
00> Octets restants a lire: 200
00> Passage a l’etat 1 (fragment intermédiaire), prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 200 restants
00> Fragment intermédiaire reçu: [0xC8 0x80 0x00 0x05…]
00> Octets restants mis à jour de 200 → 172
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 172 restants
00> Fragment intermédiaire reçu: [0xAC 0x80 0x00 0x06…]
00> Octets restants mis à jour de 172 → 144
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 144 restants
00> Fragment intermédiaire reçu: [0x90 0x80 0x00 0x07…]
00> Octets restants mis à jour de 144 → 116
00> Reste à l’etat 1, prochain requestBytes=32
00> Sending software reset…
00> Packet sent successfully
00> le packet est envoyer et tranferdone = true
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 116 restants
00> Fragment intermédiaire reçu: [0x74 0x80 0x00 0x08…]
00> Octets restants mis à jour de 116 → 88
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 88 restants
00> Fragment intermédiaire reçu: [0x58 0x80 0x00 0x09…]
00> Octets restants mis à jour de 88 → 60
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 60 restants
00> Fragment intermédiaire reçu: [0x3C 0x80 0x00 0x0A…]
00> Octets restants mis à jour de 60 → 32
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 32 restants
00> Fragment intermédiaire reçu: [0x20 0x80 0x00 0x0B…]
00> Octets restants mis à jour de 32 → 4
00> Passage à l’état 2 (fragment final), prochain requestBytes=4
00> ===== readI2C: ÃTAT 2 =====
00> ÃTAT 2: Lecture fragment final
00> Fragment final recu: [0x1C 0x01 0x00 0x00…]
00> ===== FIN readI2C - Paquet complet =====
00> ===== readI2C: ÃTAT 0 =====
00> ÃTAT 0: Lecture en-tete SHTP
00> Octets disponibles: 4
00> En-tête reçu: [0x1C 0x81 0x00 0x01]
00> Canal: 0, Séquence: 1, Taille totale: 284 octets
00> Octets restants a lire: 284
00> Passage a l’etat 1 (fragment intermédiaire), prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 284 restants
00> Fragment intermédiaire reçu: [0x1C 0x81 0x00 0x02…]
00> Octets restants mis à jour de 284 → 256
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 256 restants
00> Fragment intermédiaire reçu: [0x00 0x81 0x00 0x03…]
00> Octets restants mis à jour de 256 → 228
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 228 restants
00> Fragment intermédiaire reçu: [0xE4 0x80 0x00 0x04…]
00> Octets restants mis à jour de 228 → 200
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 200 restants
00> Fragment intermédiaire reçu: [0xC8 0x80 0x00 0x05…]
00> Octets restants mis à jour de 200 → 172
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 172 restants
00> Fragment intermédiaire reçu: [0xAC 0x80 0x00 0x06…]
00> Octets restants mis à jour de 172 → 144
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 144 restants
00> Fragment intermédiaire reçu: [0x90 0x80 0x00 0x07…]
00> Octets restants mis à jour de 144 → 116
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 116 restants
00> Fragment intermédiaire reçu: [0x74 0x80 0x00 0x08…]
00> Octets restants mis à jour de 116 → 88
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 88 restants
00> Fragment intermédiaire reçu: [0x58 0x80 0x00 0x09…]
00> Octets restants mis à jour de 88 → 60
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 60 restants
00> Fragment intermédiaire reçu: [0x3C 0x80 0x00 0x0A…]
00> Octets restants mis à jour de 60 → 32
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 32 restants
00> Fragment intermédiaire reçu: [0x20 0x80 0x00 0x0B…]
00> Octets restants mis à jour de 32 → 4
00> Passage à l’état 2 (fragment final), prochain requestBytes=4
00> ===== readI2C: ÃTAT 2 =====
00> ÃTAT 2: Lecture fragment final
00> Fragment final recu: [0x05 0x00 0x01 0x00…]
00> ===== FIN readI2C - Paquet complet =====
00> ===== readI2C: ÃTAT 0 =====
00> ÃTAT 0: Lecture en-tete SHTP
00> Octets disponibles: 4
00> En-tête reçu: [0x05 0x80 0x01 0x01]
00> Canal: 1, Séquence: 1, Taille totale: 5 octets
00> Octets restants a lire: 5
00> Passage à l’etat 2 (fragment final), prochain requestBytes=5
00> ===== readI2C: ÃTAT 2 =====
00> ÃTAT 2: Lecture fragment final
00> Fragment final recu: [0x05 0x80 0x01 0x02…]
00> ===== FIN readI2C - Paquet complet =====
00> Reset confirmed!
00> ===== readI2C: ÃTAT 0 =====
00> ÃTAT 0: Lecture en-tete SHTP
00> Octets disponibles: 4
00> En-tête reçu: [0x1C 0x01 0x00 0x00]
00> Canal: 0, Séquence: 0, Taille totale: 284 octets
00> Octets restants a lire: 284
00> Passage a l’etat 1 (fragment intermédiaire), prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 284 restants
00> Fragment intermédiaire reçu: [0x1C 0x81 0x00 0x01…]
00> Octets restants mis à jour de 284 → 256
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 256 restants
00> Fragment intermédiaire reçu: [0x00 0x81 0x00 0x02…]
00> Octets restants mis à jour de 256 → 228
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 228 restants
00> Fragment intermédiaire reçu: [0xE4 0x80 0x00 0x03…]
00> Octets restants mis à jour de 228 → 200
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 200 restants
00> Fragment intermédiaire reçu: [0xC8 0x80 0x00 0x04…]
00> Octets restants mis à jour de 200 → 172
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 172 restants
00> Fragment intermédiaire reçu: [0xAC 0x80 0x00 0x05…]
00> Octets restants mis à jour de 172 → 144
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 144 restants
00> Fragment intermédiaire reçu: [0x90 0x80 0x00 0x06…]
00> Octets restants mis à jour de 144 → 116
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 116 restants
00> Fragment intermédiaire reçu: [0x74 0x80 0x00 0x07…]
00> Octets restants mis à jour de 116 → 88
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 88 restants
00> Fragment intermédiaire reçu: [0x58 0x80 0x00 0x08…]
00> Octets restants mis à jour de 88 → 60
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 60 restants
00> Fragment intermédiaire reçu: [0x3C 0x80 0x00 0x09…]
00> Octets restants mis à jour de 60 → 32
00> Reste à l’etat 1, prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 32 restants
00> Fragment intermédiaire reçu: [0x20 0x80 0x00 0x0A…]
00> Octets restants mis à jour de 32 → 4
00> Passage à l’état 2 (fragment final), prochain requestBytes=4
00> Requesting product ID…
00> Packet sent successfully
00> le packet est envoyer et tranferdone = true
00> ===== readI2C: ÃTAT 2 =====
00> ÃTAT 2: Lecture fragment final
00> Fragment final recu: [0x14 0x00 0x02 0x00…]
00> ===== FIN readI2C - Paquet complet =====
00> ===== readI2C: ÃTAT 0 =====
00> ÃTAT 0: Lecture en-tete SHTP
00> Octets disponibles: 4
00> En-tête reçu: [0x14 0x80 0x02 0x01]
00> Canal: 2, Séquence: 1, Taille totale: 20 octets
00> Octets restants a lire: 20
00> Passage à l’etat 2 (fragment final), prochain requestBytes=20
00> ===== readI2C: ÃTAT 2 =====
00> ÃTAT 2: Lecture fragment final
00> Fragment final recu: [0x14 0x80 0x02 0x02…]
00> ===== FIN readI2C - Paquet complet =====
00> ------ PRODUCT ID ------
00> Reset Cause: Watchdog
00> SW Version: 3.12.6
00> SW Part Number: 10004563
00> SW Build Number: 62
00> -----------------------
00> Product ID received!
00> ===== readI2C: ÃTAT 0 =====
00> ÃTAT 0: Lecture en-tete SHTP
00> Octets disponibles: 4
00> En-tête reçu: [0x34 0x00 0x02 0x03]
00> Canal: 2, Séquence: 3, Taille totale: 52 octets
00> Octets restants a lire: 52
00> Passage a l’etat 1 (fragment intermédiaire), prochain requestBytes=32
00> ===== readI2C: ÃTAT 1 =====
00> ÃTAT 1: Lecture fragment intermediaire
00> Octets disponibles: 32
00> Fragment intermédiaire: attente de 32 octets sur 52 restants
00> Fragment intermédiaire reçu: [0x34 0x80 0x02 0x04…]
00> Octets restants mis à jour de 52 → 24
00> Passage à l’état 2 (fragment final), prochain requestBytes=24
00> ===== readI2C: ÃTAT 2 =====
00> ÃTAT 2: Lecture fragment final
00> Fragment final recu: [0x18 0x80 0x02 0x05…]
00> ===== FIN readI2C - Paquet complet =====
00> DISABLING ACCELEROMETER…
00> Sending accelerometer disable command…
00> Packet sent successfully
00> le packet est envoyer et tranferdone = true
00> Demande statut pour reportID=0x01
00> Packet sent successfully
00> le packet est envoyer et tranferdone = true
00> ===== readI2C: ÃTAT 0 =====
00> ÃTAT 0: Lecture en-tete SHTP
00> Octets disponibles: 4
00> En-tête reçu: [0x15 0x00 0x02 0x06]
00> Canal: 2, Séquence: 6, Taille totale: 21 octets
00> Octets restants a lire: 21
00> Passage à l’etat 2 (fragment final), prochain requestBytes=21
00> ===== readI2C: ÃTAT 2 =====
00> ÃTAT 2: Lecture fragment final
00> Fragment final recu: [0x15 0x80 0x02 0x07…]
00> ===== FIN readI2C - Paquet complet =====
00> Accelerometer disable confirmed!
00> DISABLING GYROSCOPE…
00> Sending gyroscope disable command…
00> Packet sent successfully
00> le packet est envoyer et tranferdone = true
00> Demande statut pour reportID=0x02
00> Packet sent successfully
00> le packet est envoyer et tranferdone = true
00> ===== readI2C: ÃTAT 0 =====
00> ÃTAT 0: Lecture en-tete SHTP
00> Octets disponibles: 4
00> En-tête reçu: [0x15 0x00 0x02 0x08]
00> Canal: 2, Séquence: 8, Taille totale: 21 octets
00> Octets restants a lire: 21
00> Passage à l’etat 2 (fragment final), prochain requestBytes=21
00> DISABLING GYROSCOPE…
00> Sending gyroscope disable command…
00> Packet sent successfully
00> le packet est envoyer et tranferdone = true
00> Demande statut pour reportID=0x02
00> Packet sent successfully
00> le packet est envoyer et tranferdone = true
00> ===== readI2C: ÃTAT 2 =====
00> ÃTAT 2: Lecture fragment final
00> Fragment final recu: [0x15 0x80 0x02 0x09…]
00> ===== FIN readI2C - Paquet complet =====
00> Gyroscope disable confirmed!
00> 1. Désactivation explicite du Rotation Vector…
00> Packet sent successfully
00> le packet est envoyer et tranferdone = true
00> ENABLING ROTATION VECTOR…
00> EXACT BYTES: 0xFD 0x05 0x01 0x00 0x00 0x10 0x27 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
00> Packet sent successfully
00> le packet est envoyer et tranferdone = true
00> success to set feature for report ID 0x05
00> ===== readI2C: ÃTAT 0 =====
00> ÃTAT 0: Lecture en-tete SHTP
00> Octets disponibles: 4
00> En-tête reçu: [0x15 0x00 0x02 0x0A]
00> Canal: 2, Séquence: 10, Taille totale: 21 octets
00> Octets restants a lire: 21
00> Passage à l’etat 2 (fragment final), prochain requestBytes=21
00> ===== readI2C: ÃTAT 2 =====
00> ÃTAT 2: Lecture fragment final
00> Fragment final recu: [0x15 0x80 0x02 0x0B…]
00> ===== FIN readI2C - Paquet complet =====
00> Verifying rotation vector status…
00> Packet sent successfully
00> le packet est envoyer et tranferdone = true
00> ===== readI2C: ÃTAT 0 =====
00> ÃTAT 0: Lecture en-tete SHTP
00> Octets disponibles: 4
00> En-tête reçu: [0x15 0x00 0x02 0x0C]
00> Canal: 2, Séquence: 12, Taille totale: 21 octets
00> Octets restants a lire: 21
00> Passage à l’etat 2 (fragment final), prochain requestBytes=21
00> ===== readI2C: ÃTAT 2 =====
00> ÃTAT 2: Lecture fragment final
00> Fragment final recu: [0x15 0x80 0x02 0x0D…]
00> ===== FIN readI2C - Paquet complet =====
00> Get Feature response received for Rotation Vector:
00> Response bytes: 0x15 0x80 0x02 0x0D 0xFC 0x05 0x01 0x00
00> 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
00> 0x00 0x00 0x00 0x00
00> Feature flags: 0x01, Enabled: YES
00> Report interval: 0 microseconds
00> ERROR: Rotation Vector not enabled properly.
00> 1. Désactivation explicite du Rotation Vector…
00> Packet sent successfully
00> le packet est envoyer et tranferdone = true
as you can see the interval is still at 0 … please any kind of help is welcomed !