Skip to main content
Visitor II
March 11, 2025
Question

LSM6DSO32 step count data

  • March 11, 2025
  • 1 reply
  • 464 views

Hi,

I designed a special board that includes the LSM6DSO32 sensor. I want to get step count data, for testing I am using ESP32-CAM with LSM6DSO32 via I2C. I have followed the basic routine mentioned in application notes. I can get only garbage value. I will attached sample code for reference. Can you check and help me step by step what to do? First code give step count 0 always. For second code I attached screenshot. Please look into it and tell if anything need to change.

 

 

#include <Wire.h>
 
// LSM6DSO32 I2C address
#define LSM6DSO32_ADDR 0x6B
 
// Register addresses
#define FUNC_CFG_ACCESS 0x01
#define PAGE_RW 0x17 //0x02 
#define PAGE_SEL 0x02 //0x03
#define PAGE_ADDR 0x08 //0x04
#define PAGE_VALUE 0x09 //0x05
#define EMB_FUNC_EN_A 0x04
#define EMB_FUNC_EN_B 0x05
#define EMB_FUNC_INT1 0x0A
#define MD1_CFG 0x5E
#define CTRL1_XL 0x10
#define WHO_AM_I 0x0F
#define STEP_COUNTER_L 0x62
#define STEP_COUNTER_H 0x63
#define EMB_FUNC_SRC 0x64
#define PEDO_CMD_REG 0x83
 
void setup() {
 Serial.begin(115200);
 delay(1000);
 
 Wire.begin(13, 14); // SDA = GPIO13, SCL = GPIO14
 
 // Test communication with WHO_AM_I register
 byte whoAmI = readRegister(WHO_AM_I);
 Serial.print("WHO_AM_I: 0x");
 Serial.println(whoAmI, HEX);
 /*if (whoAmI != 0x6C) {
 Serial.println("Sensor not found!");
 while (1); // Stop execution if sensor is not found
 }*/
 if (whoAmI != 0x6C) {
 Serial.println("Sensor is found!");
 while (1); // Stop execution if sensor is not found
 }
 
 // Initialize the sensor
 initSensor();
 // Reset the step counter using 0x04
 resetStepCounter();
}
 
void loop() {
 // Check step detection status (read raw status register)
 byte stepStatus = readRegister(EMB_FUNC_SRC);
 Serial.print("Step Detection Status: 0x");
 Serial.println(stepStatus, HEX);
 if (stepStatus & (1 << 7)) { // Step detected bit is set
 Serial.println("Step Detected!");
 }
 
 // Read the step count (raw step counter values)
 uint16_t stepCount = readStepCounter();
 Serial.print("Step Count: ");
 Serial.println(stepCount);
 
 // Read and print the raw step counter registers
 byte stepLow = readRegister(STEP_COUNTER_L);
 byte stepHigh = readRegister(STEP_COUNTER_H);
 Serial.print("Raw STEP_COUNTER_L: 0x");
 Serial.print(stepLow, HEX);
 Serial.print(", STEP_COUNTER_H: 0x");
 Serial.println(stepHigh, HEX);
 
 delay(1000); // Delay for 1 second before next read
}
 
void initSensor() {
 Serial.println("Initializing Sensor...");
 
 // Step 1: Enable access to embedded functions registers
 writeRegister(FUNC_CFG_ACCESS, 0x80);
 
 // Step 2: Select write operation mode
 writeRegister(PAGE_RW, 0x40);
 
 // Step 3: Select page 1
 writeRegister(PAGE_SEL, 0x11);
 
 // Step 4: Set the embedded advanced features register (PEDO_CMD_REG)
 writeRegister(PAGE_ADDR, 0x83);
 
 // Step 5: Enable false positive rejection block
 writeRegister(PAGE_VALUE, 0x04);
 
 // Step 6: Disable write operation mode
 writeRegister(PAGE_RW, 0x00);
 
 // Step 7: Enable pedometer
 writeRegister(EMB_FUNC_EN_A, 0x08);
 
 // Step 8: Enable pedometer false-positive rejection block and advanced detection feature
 writeRegister(EMB_FUNC_EN_B, 0x10);
 
 // Step 9: Route step detection interrupt to INT1 pin (temporarily disable this for now)
 // writeRegister(EMB_FUNC_INT1, 0x08);
 
 // Step 10: Disable access to embedded functions registers
 writeRegister(FUNC_CFG_ACCESS, 0x00);
 
 // Step 11: Enable routing of the embedded function interrupts
 writeRegister(MD1_CFG, 0x02);
 
 // Step 12: Enable accelerometer (26 Hz, ±8g)
 writeRegister(CTRL1_XL, 0x28);
 
 delay(2000); // Increase the delay for initialization time
 Serial.println("Sensor Initialized!");
}
 
uint16_t readStepCounter() {
 byte stepCountLow = readRegister(STEP_COUNTER_L); // Read low byte
 byte stepCountHigh = readRegister(STEP_COUNTER_H); // Read high byte
 uint16_t stepCount = (stepCountHigh << | stepCountLow; // Combine into 16-bit unsigned value
 return stepCount;
}
 
void resetStepCounter() {
 Serial.println("Resetting Step Counter...");
 writeRegister(PEDO_CMD_REG, 0x04); // Reset the step counter (use 0x04 instead of 0x01)
 delay(500); // Wait for reset to take effect
 
 // Verify the reset by reading step count
 uint16_t stepCount = readStepCounter();
 Serial.print("Step Counter After Reset: ");
 Serial.println(stepCount);
}
 
byte readRegister(byte reg) {
 Wire.beginTransmission(LSM6DSO32_ADDR);
 Wire.write(reg);
 Wire.endTransmission(false);
 Wire.requestFrom(LSM6DSO32_ADDR, 1);
 return Wire.available() ? Wire.read() : 0;
}
 
void writeRegister(byte reg, byte value) {
 Wire.beginTransmission(LSM6DSO32_ADDR);
 Wire.write(reg);
 Wire.write(value);
 Wire.endTransmission();
}

 

 

I would appreciate if you some ways to get step count data, that would be great.

Thanks You

 

 

#include <Wire.h>
 
// LSM6DSO32 I2C address
#define LSM6DSO32_ADDR 0x6B // Default 0x6B
 
// Register addresses
#define FUNC_CFG_ACCESS 0x01
#define PAGE_RW 0x17
#define PAGE_SEL 0x02
#define PAGE_ADDR 0x08
#define PAGE_VALUE 0x09
#define EMB_FUNC_EN_A 0x04
#define EMB_FUNC_EN_B 0x05
#define EMB_FUNC_INT1 0x0A
#define MD1_CFG 0x5E
#define CTRL1_XL 0x10
#define WHO_AM_I 0x0F
#define STEP_COUNTER_L 0x4B // Corrected step counter low byte register
#define STEP_COUNTER_H 0x4C // Corrected step counter high byte register
#define EMB_FUNC_SRC 0x1A // Corrected step detection status register
#define PEDO_CMD_REG 0x5E // Step counter reset register
 
void setup() {
 Serial.begin(115200);
 delay(1000);
 Wire.begin(13, 14); // SDA = GPIO13, SCL = GPIO14
 
 // Initialize the sensor
 initSensor();
 
 // Verify WHO_AM_I register
 byte whoAmI = readRegister(WHO_AM_I);
 if (whoAmI == 0x6C) { // WHO_AM_I fixed at 6Ch for LSM6DSO32
 Serial.println("Successfully connected to sensor!");
 } else {
 Serial.print("Failed to connect. WHO_AM_I: 0x");
 Serial.println(whoAmI, HEX);
 while (1); // Stop execution if sensor is not detected
 }
}
 
void loop() {
 // Read step detection status
 byte stepStatus = readRegister(EMB_FUNC_SRC);
 if (stepStatus & (1 << 7)) { // Correct step detection bit (bit 7)
 Serial.println("Step Detected!");
 }
 
 // Read step count
 int16_t stepCount = readStepCounter();
 Serial.print("Step Count: ");
 Serial.println(stepCount);
 delay(1000); // Read every second
}
 
void initSensor() {
 Serial.println("Initializing Sensor...");
 
 // Enable embedded function configuration
 writeRegister(FUNC_CFG_ACCESS, 0x80);
 
 // Select Page 1
 writeRegister(PAGE_RW, 0x40);
 writeRegister(PAGE_SEL, 0x11);
 
 // Enable advanced detection
 writeRegister(PAGE_ADDR, 0x83);
 writeRegister(PAGE_VALUE, 0x04); // AD_DET_EN
 
 // Disable page write access
 writeRegister(PAGE_RW, 0x00);
 
 // Enable step counter & detection
 writeRegister(EMB_FUNC_EN_A, 0x08); // Enable step counter
 writeRegister(EMB_FUNC_EN_B, 0x10); // Enable step detection
 
 // Route step detection to INT1
 writeRegister(EMB_FUNC_INT1, 0x08);
 
 // Exit embedded functions access
 writeRegister(FUNC_CFG_ACCESS, 0x00);
 // Enable routing the embedded functions interrupt
 writeRegister(MD1_CFG, 0x02);
 
 // Enable accelerometer (26 Hz, ±8g)
 writeRegister(CTRL1_XL, 0x28);
 
 delay(1000); // Allow pedometer time to initialize
 Serial.println("Sensor Initialized!");
}
 
int16_t readStepCounter() {
 byte stepCountLow = readRegister(STEP_COUNTER_L); // Read low byte
 byte stepCountHigh = readRegister(STEP_COUNTER_H); // Read high byte
 
 int16_t stepCount = (stepCountHigh << | stepCountLow;
 return stepCount;
}
 
void resetStepCounter() {
 Serial.println("Resetting Step Counter...");
 writeRegister(PEDO_CMD_REG, 0x01); // Write reset command
 delay(100); // Wait for reset to take effect
 // Verify reset
 int16_t stepCount = readStepCounter();
 Serial.print("Step Counter After Reset: ");
 Serial.println(stepCount);
}
 
byte readRegister(byte reg) {
 Wire.beginTransmission(LSM6DSO32_ADDR);
 Wire.write(reg);
 Wire.endTransmission(false);
 Wire.requestFrom(LSM6DSO32_ADDR, 1);
 return Wire.available() ? Wire.read() : 0;
}
 
void writeRegister(byte reg, byte value) {
 Wire.beginTransmission(LSM6DSO32_ADDR);
 Wire.write(reg);
 Wire.write(value);
 Wire.endTransmission();
}

 

 

 

image.png

1 reply

Federica Bossi
Technical Moderator
March 12, 2025

Hi @rex2 ,

Can you try this code and let me know if you get consistent data?

#include <Wire.h>

// LSM6DSO32 I2C address
#define LSM6DSO32_ADDR 0x6B

// Register addresses
#define FUNC_CFG_ACCESS 0x01
#define PAGE_RW 0x17
#define PAGE_SEL 0x02
#define PAGE_ADDR 0x08
#define PAGE_VALUE 0x09
#define EMB_FUNC_EN_A 0x04
#define EMB_FUNC_EN_B 0x05
#define EMB_FUNC_INT1 0x0A
#define MD1_CFG 0x5E
#define CTRL1_XL 0x10
#define WHO_AM_I 0x0F
#define STEP_COUNTER_L 0x62
#define STEP_COUNTER_H 0x63
#define EMB_FUNC_SRC 0x64
#define PEDO_CMD_REG 0x83

void setup() {
 Serial.begin(115200);
 delay(1000);

 Wire.begin(13, 14); // SDA = GPIO13, SCL = GPIO14

 // Test communication with WHO_AM_I register
 byte whoAmI = readRegister(WHO_AM_I);
 Serial.print("WHO_AM_I: 0x");
 Serial.println(whoAmI, HEX);
 if (whoAmI != 0x6C) {
 Serial.println("Sensor not found!");
 while (1); // Stop execution if sensor is not found
 }

 // Initialize the sensor
 initSensor();
 // Reset the step counter using 0x04
 resetStepCounter();
}

void loop() {
 // Check step detection status (read raw status register)
 byte stepStatus = readRegister(EMB_FUNC_SRC);
 Serial.print("Step Detection Status: 0x");
 Serial.println(stepStatus, HEX);
 if (stepStatus & (1 << 7)) { // Step detected bit is set
 Serial.println("Step Detected!");
 }

 // Read the step count (raw step counter values)
 uint16_t stepCount = readStepCounter();
 Serial.print("Step Count: ");
 Serial.println(stepCount);

 // Read and print the raw step counter registers
 byte stepLow = readRegister(STEP_COUNTER_L);
 byte stepHigh = readRegister(STEP_COUNTER_H);
 Serial.print("Raw STEP_COUNTER_L: 0x");
 Serial.print(stepLow, HEX);
 Serial.print(", STEP_COUNTER_H: 0x");
 Serial.println(stepHigh, HEX);

 delay(1000); // Delay for 1 second before next read
}

void initSensor() {
 Serial.println("Initializing Sensor...");

 // Step 1: Enable access to embedded functions registers
 writeRegister(FUNC_CFG_ACCESS, 0x80);

 // Step 2: Select write operation mode
 writeRegister(PAGE_RW, 0x40);

 // Step 3: Select page 1
 writeRegister(PAGE_SEL, 0x11);

 // Step 4: Set the embedded advanced features register (PEDO_CMD_REG)
 writeRegister(PAGE_ADDR, PEDO_CMD_REG);

 // Step 5: Enable false positive rejection block
 writeRegister(PAGE_VALUE, 0x04);

 // Step 6: Disable write operation mode
 writeRegister(PAGE_RW, 0x00);

 // Step 7: Enable pedometer
 writeRegister(EMB_FUNC_EN_A, 0x08);

 // Step 8: Enable pedometer false-positive rejection block and advanced detection feature
 writeRegister(EMB_FUNC_EN_B, 0x10);

 // Step 9: Route step detection interrupt to INT1 pin (temporarily disable this for now)
 // writeRegister(EMB_FUNC_INT1, 0x08);

 // Step 10: Disable access to embedded functions registers
 writeRegister(FUNC_CFG_ACCESS, 0x00);

 // Step 11: Enable routing of the embedded function interrupts
 writeRegister(MD1_CFG, 0x02);

 // Step 12: Enable accelerometer (26 Hz, ±8g)
 writeRegister(CTRL1_XL, 0x28);

 delay(2000); // Increase the delay for initialization time
 Serial.println("Sensor Initialized!");
}

uint16_t readStepCounter() {
 byte stepCountLow = readRegister(STEP_COUNTER_L); // Read low byte
 byte stepCountHigh = readRegister(STEP_COUNTER_H); // Read high byte
 uint16_t stepCount = (stepCountHigh << 8) | stepCountLow; // Combine into 16-bit unsigned value
 return stepCount;
}

void resetStepCounter() {
 Serial.println("Resetting Step Counter...");
 writeRegister(PEDO_CMD_REG, 0x04); // Reset the step counter (use 0x04 instead of 0x01)
 delay(500); // Wait for reset to take effect

 // Verify the reset by reading step count
 uint16_t stepCount = readStepCounter();
 Serial.print("Step Counter After Reset: ");
 Serial.println(stepCount);
}

byte readRegister(byte reg) {
 Wire.beginTransmission(LSM6DSO32_ADDR);
 Wire.write(reg);
 Wire.endTransmission(false);
 Wire.requestFrom(LSM6DSO32_ADDR, 1);
 return Wire.available() ? Wire.read() : 0;
}

void writeRegister(byte reg, byte value) {
 Wire.beginTransmission(LSM6DSO32_ADDR);
 Wire.write(reg);
 Wire.write(value);
 Wire.endTransmission();
}

 

Thanks! 

In order to give better visibility on the answered topics, please click on 'Accept as Solution' on the reply which solved your issue or answered your question.
Visitor II
February 5, 2026

Hi Federica

I have essentially the same code as above, however its being run on a Microchip MCU in C.

In my code I initialize the IC, then wait 1second, reset the count, wait 100ms and then read the count. 

When I read the count I get consistently EC 00 

Do you see any error in what I am doing

 

 

 

 

Franky_1-1770309726505.png

 

 

Franky_0-1770309612879.png