This is the code (it is an example from SparkFun_9DoF_IMU_Breakout_-ICM_20948-_Arduino_Library https://github.com/sparkfun/SparkFun_IC … PITest.ino ):
#include "ICM_20948.h" // Click here to get the library: http://librarymanager/All#SparkFun_ICM_20948_IMU
#define SERIAL_PORT Serial
#define SPI_PORT SPI // Your desired SPI port.
#define CS_PIN_1 7 // Which pin you connect CS to for Sensor 1
#define CS_PIN_2 6 // Which pin you connect CS to for Sensor 2
ICM_20948_SPI myICM1; // Create an ICM_20948_SPI object
ICM_20948_SPI myICM2; // Create an ICM_20948_SPI object
void setup()
{
SERIAL_PORT.begin(115200);
while (!SERIAL_PORT)
{
};
SPI_PORT.begin();
myICM1.enableDebugging(); // Uncomment this line to enable helpful debug messages on Serial
myICM2.enableDebugging(); // Uncomment this line to enable helpful debug messages on Serial
bool initialized = false;
while (!initialized)
{
myICM1.begin(CS_PIN_1, SPI_PORT);
SERIAL_PORT.print(F("Initialization of sensor 1 returned: "));
SERIAL_PORT.println(myICM1.statusString());
if (myICM1.status != ICM_20948_Stat_Ok)
{
SERIAL_PORT.println(F("Trying again..."));
delay(500);
}
else
{
initialized = true;
}
}
initialized = false;
while (!initialized)
{
myICM2.begin(CS_PIN_2, SPI_PORT);
SERIAL_PORT.print(F("Initialization of sensor 2 returned: "));
SERIAL_PORT.println(myICM1.statusString());
if (myICM2.status != ICM_20948_Stat_Ok)
{
SERIAL_PORT.println(F("Trying again..."));
delay(500);
}
else
{
initialized = true;
}
}
}
bool dataSeen = false;
void loop()
{
if (myICM1.dataReady())
{
myICM1.getAGMT(); // The values are only updated when you call 'getAGMT'
SERIAL_PORT.print("Sensor 1: ");
//printRawAGMT( myICM1.agmt);
printScaledAGMT(&myICM1);
dataSeen = true;
}
if (myICM2.dataReady())
{
myICM2.getAGMT(); // The values are only updated when you call 'getAGMT'
SERIAL_PORT.print("Sensor 2: ");
//printRawAGMT( myICM2.agmt );
printScaledAGMT(&myICM2);
dataSeen = true;
}
if (dataSeen)
{
delay(30);
dataSeen = false;
}
else
{
SERIAL_PORT.println("Waiting for data");
delay(500);
}
}
// Below here are some helper functions to print the data nicely!
void printPaddedInt16b(int16_t val)
{
if (val > 0)
{
SERIAL_PORT.print(" ");
if (val < 10000)
{
SERIAL_PORT.print("0");
}
if (val < 1000)
{
SERIAL_PORT.print("0");
}
if (val < 100)
{
SERIAL_PORT.print("0");
}
if (val < 10)
{
SERIAL_PORT.print("0");
}
}
else
{
SERIAL_PORT.print("-");
if (abs(val) < 10000)
{
SERIAL_PORT.print("0");
}
if (abs(val) < 1000)
{
SERIAL_PORT.print("0");
}
if (abs(val) < 100)
{
SERIAL_PORT.print("0");
}
if (abs(val) < 10)
{
SERIAL_PORT.print("0");
}
}
SERIAL_PORT.print(abs(val));
}
void printRawAGMT(ICM_20948_AGMT_t agmt)
{
SERIAL_PORT.print("RAW. Acc [ ");
printPaddedInt16b(agmt.acc.axes.x);
SERIAL_PORT.print(", ");
printPaddedInt16b(agmt.acc.axes.y);
SERIAL_PORT.print(", ");
printPaddedInt16b(agmt.acc.axes.z);
SERIAL_PORT.print(" ], Gyr [ ");
printPaddedInt16b(agmt.gyr.axes.x);
SERIAL_PORT.print(", ");
printPaddedInt16b(agmt.gyr.axes.y);
SERIAL_PORT.print(", ");
printPaddedInt16b(agmt.gyr.axes.z);
SERIAL_PORT.print(" ], Mag [ ");
printPaddedInt16b(agmt.mag.axes.x);
SERIAL_PORT.print(", ");
printPaddedInt16b(agmt.mag.axes.y);
SERIAL_PORT.print(", ");
printPaddedInt16b(agmt.mag.axes.z);
SERIAL_PORT.print(" ], Tmp [ ");
printPaddedInt16b(agmt.tmp.val);
SERIAL_PORT.print(" ]");
SERIAL_PORT.println();
}
void printFormattedFloat(float val, uint8_t leading, uint8_t decimals)
{
float aval = abs(val);
if (val < 0)
{
SERIAL_PORT.print("-");
}
else
{
SERIAL_PORT.print(" ");
}
for (uint8_t indi = 0; indi < leading; indi++)
{
uint32_t tenpow = 0;
if (indi < (leading - 1))
{
tenpow = 1;
}
for (uint8_t c = 0; c < (leading - 1 - indi); c++)
{
tenpow *= 10;
}
if (aval < tenpow)
{
SERIAL_PORT.print("0");
}
else
{
break;
}
}
if (val < 0)
{
SERIAL_PORT.print(-val, decimals);
}
else
{
SERIAL_PORT.print(val, decimals);
}
}
void printScaledAGMT(ICM_20948_SPI *sensor)
{
SERIAL_PORT.print("Scaled. Acc (mg) [ ");
printFormattedFloat(sensor->accX(), 5, 2);
SERIAL_PORT.print(", ");
printFormattedFloat(sensor->accY(), 5, 2);
SERIAL_PORT.print(", ");
printFormattedFloat(sensor->accZ(), 5, 2);
SERIAL_PORT.print(" ], Gyr (DPS) [ ");
printFormattedFloat(sensor->gyrX(), 5, 2);
SERIAL_PORT.print(", ");
printFormattedFloat(sensor->gyrY(), 5, 2);
SERIAL_PORT.print(", ");
printFormattedFloat(sensor->gyrZ(), 5, 2);
SERIAL_PORT.print(" ], Mag (uT) [ ");
printFormattedFloat(sensor->magX(), 5, 2);
SERIAL_PORT.print(", ");
printFormattedFloat(sensor->magY(), 5, 2);
SERIAL_PORT.print(", ");
printFormattedFloat(sensor->magZ(), 5, 2);
SERIAL_PORT.print(" ], Tmp (C) [ ");
printFormattedFloat(sensor->temp(), 5, 2);
SERIAL_PORT.print(" ]");
SERIAL_PORT.println();
}
In attach the wiring diagram