Problem with interval report with BNO086 and my BGM121 in Simplicity Studio

amel_code

New member
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 !
 

Attachments

  • app.c
    10 KB · Views: 82
  • app.h
    8 KB · Views: 88
  • main.c
    2.1 KB · Views: 84
  • shtp_protocol.c
    4.2 KB · Views: 84
  • shtp_protocol.h
    1.4 KB · Views: 82
  • code_arduino.ino
    28.1 KB · Views: 83
Just a couple of questions. Looking at Simplicity Studio looks like an IDE for silicon labs products. What Teensy version are you using? and is Teensyduino installed in the IDE? Have you tried using the Teensy with the Arduino IDE?
 
Just a couple of questions. Looking at Simplicity Studio looks like an IDE for silicon labs products. What Teensy version are you using? and is Teensyduino installed in the IDE? Have you tried using the Teensy with the Arduino IDE?
Hi, thank you for your reply,
I'm actually not using a Teensy in this project. I'm working with a BGM121 module from Silicon Labs, which is why I'm using Simplicity Studio as the development environment. The BGM121 is based on the EFR32BG1 chip and is programmable directly in Simplicity Studio using C.


I only used Arduino (with an Arduino Mega, not Teensy) as a reference platform to validate the communication logic with the BNO086 sensor — and it works perfectly there. My main challenge is getting the same behavior working on the BGM121.
 
Sorry I do not think I can help you as I have never used a BGM121 or Simplicity Studio. Might be better off asking on the Silicon labs forum.
 
Back
Top