

The ICM20948, manufactured by InvenSense, is a highly integrated 9-axis motion tracking device. It combines a 3-axis gyroscope, a 3-axis accelerometer, and a 3-axis magnetometer into a single compact chip. This component is designed for applications requiring precise motion and orientation sensing, such as robotics, drones, smartphones, wearable devices, and gaming controllers.
The ICM20948 is known for its low power consumption, high accuracy, and advanced features like Digital Motion Processing™ (DMP) for sensor fusion. It communicates via I²C or SPI interfaces, making it versatile and easy to integrate into a wide range of systems.








Below are the key technical details of the ICM20948:
The ICM20948 has 24 pins. Below is a table describing the key pins:
| Pin Number | Pin Name | Description |
|---|---|---|
| 1 | VDD | Main power supply (1.71V to 3.6V). |
| 2 | VDDIO | I/O voltage supply. |
| 3 | GND | Ground. |
| 4 | SCL/SCLK | I²C clock or SPI clock input. |
| 5 | SDA/SDI | I²C data or SPI data input. |
| 6 | AD0/SDO | I²C address select or SPI data output. |
| 7 | INT1 | Interrupt 1 output. |
| 8 | INT2 | Interrupt 2 output. |
| 9 | FSYNC | Frame synchronization input. |
| 10 | AUX_CL | Magnetometer I²C clock. |
| 11 | AUX_DA | Magnetometer I²C data. |
| 12-24 | NC | No connection (reserved for future use). |
Below is an example of how to interface the ICM20948 with an Arduino UNO using I²C:
#include <Wire.h>
// ICM20948 I2C address (AD0 pin low = 0x68, AD0 pin high = 0x69)
#define ICM20948_ADDR 0x68
// Register addresses
#define WHO_AM_I 0x00
#define PWR_MGMT_1 0x06
#define ACCEL_XOUT_H 0x2D
void setup() {
Wire.begin(); // Initialize I2C communication
Serial.begin(9600); // Initialize serial communication
// Wake up the ICM20948
Wire.beginTransmission(ICM20948_ADDR);
Wire.write(PWR_MGMT_1); // Power management register
Wire.write(0x01); // Set clock source
Wire.endTransmission();
// Verify connection
Wire.beginTransmission(ICM20948_ADDR);
Wire.write(WHO_AM_I); // WHO_AM_I register
Wire.endTransmission();
Wire.requestFrom(ICM20948_ADDR, 1);
if (Wire.available()) {
byte whoAmI = Wire.read();
if (whoAmI == 0xEA) { // Expected WHO_AM_I response
Serial.println("ICM20948 connected!");
} else {
Serial.println("Connection failed!");
}
}
}
void loop() {
// Read accelerometer data
Wire.beginTransmission(ICM20948_ADDR);
Wire.write(ACCEL_XOUT_H); // Start with ACCEL_XOUT_H register
Wire.endTransmission();
Wire.requestFrom(ICM20948_ADDR, 6); // Read 6 bytes (X, Y, Z)
if (Wire.available() == 6) {
int16_t accelX = (Wire.read() << 8) | Wire.read();
int16_t accelY = (Wire.read() << 8) | Wire.read();
int16_t accelZ = (Wire.read() << 8) | Wire.read();
Serial.print("Accel X: ");
Serial.print(accelX);
Serial.print(" | Accel Y: ");
Serial.print(accelY);
Serial.print(" | Accel Z: ");
Serial.println(accelZ);
}
delay(500); // Delay for readability
}
No Response from the Sensor:
Incorrect or No Data:
Communication Errors:
By following this documentation, you can effectively integrate the ICM20948 into your projects and troubleshoot common issues.