From e4f67c7bb1ebf0f2d2000fe5e3401a580fcc80b2 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 9 Feb 2021 07:57:04 +0000 Subject: [PATCH 1/2] Adding enableDebugging plus helper functions for print, println and printf --- src/ICM_20948.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++++ src/ICM_20948.h | 40 ++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/src/ICM_20948.cpp b/src/ICM_20948.cpp index fe9f43d..ba2b277 100644 --- a/src/ICM_20948.cpp +++ b/src/ICM_20948.cpp @@ -14,6 +14,61 @@ ICM_20948::ICM_20948() { } +void ICM_20948::enableDebugging(Stream &debugPort) +{ + _debugSerial = &debugPort; //Grab which port the user wants us to use for debugging + _printDebug = true; //Should we print the commands we send? Good for debugging +} +void ICM_20948::disableDebugging(void) +{ + _printDebug = false; //Turn off extra print statements +} + +// Debug Printing: based on gfvalvo's flash string helper code: +// https://forum.arduino.cc/index.php?topic=533118.msg3634809#msg3634809 + +void ICM_20948::debugPrint(const char *line) +{ + doDebugPrint([](const char *ptr) {return *ptr;}, line); +} + +void ICM_20948::debugPrint(const __FlashStringHelper *line) +{ + doDebugPrint([](const char *ptr) {return (char) pgm_read_byte_near(ptr);}, + (const char*) line); +} + +void ICM_20948::debugPrintln(const char *line) +{ + doDebugPrint([](const char *ptr) {return *ptr;}, line, true); +} + +void ICM_20948::debugPrintln(const __FlashStringHelper *line) +{ + doDebugPrint([](const char *ptr) {return (char) pgm_read_byte_near(ptr);}, + (const char*) line, true); +} + +void ICM_20948::doDebugPrint(char (*funct)(const char *), const char *string, bool newLine) +{ + if (_printDebug == false) + return; // Bail if debugging is not enabled + + char ch; + + while ((ch = funct(string++))) + { + _debugSerial->print(ch); + } + + if (newLine) + { + _debugSerial->println(); + } +} + + + ICM_20948_AGMT_t ICM_20948::getAGMT(void) { status = ICM_20948_get_agmt(&_device, &agmt); diff --git a/src/ICM_20948.h b/src/ICM_20948.h index fb220d7..bbafbff 100644 --- a/src/ICM_20948.h +++ b/src/ICM_20948.h @@ -20,6 +20,9 @@ A C++ interface to the ICM-20948 class ICM_20948 { private: + Stream *_debugSerial; //The stream to send debug messages to if enabled + boolean _printDebug = false; //Flag to print the serial commands we are sending to the Serial port for debug + protected: ICM_20948_Device_t _device; @@ -31,6 +34,43 @@ class ICM_20948 public: ICM_20948(); // Constructor + // Enable debug messages using the chosen Serial port (Stream) + // Boards like the RedBoard Turbo use SerialUSB (not Serial). + // But other boards like the SAMD51 Thing Plus use Serial (not SerialUSB). + // These lines let the code compile cleanly on as many SAMD boards as possible. + #if defined(ARDUINO_ARCH_SAMD) // Is this a SAMD board? + #if defined(USB_VID) // Is the USB Vendor ID defined? + #if (USB_VID == 0x1B4F) // Is this a SparkFun board? + #if !defined(ARDUINO_SAMD51_THING_PLUS) & !defined(ARDUINO_SAMD51_MICROMOD) // If it is not a SAMD51 Thing Plus or SAMD51 MicroMod + void enableDebugging(Stream &debugPort = SerialUSB); //Given a port to print to, enable debug messages. + #else + void enableDebugging(Stream &debugPort = Serial); //Given a port to print to, enable debug messages. + #endif + #else + void enableDebugging(Stream &debugPort = Serial); //Given a port to print to, enable debug messages. + #endif + #else + void enableDebugging(Stream &debugPort = Serial); //Given a port to print to, enable debug messages. + #endif + #else + void enableDebugging(Stream &debugPort = Serial); //Given a port to print to, enable debug messages. + #endif + + void disableDebugging(void); //Turn off debug statements + + // gfvalvo's flash string helper code: https://forum.arduino.cc/index.php?topic=533118.msg3634809#msg3634809 + void debugPrint(const char *); + void debugPrint(const __FlashStringHelper *); + void debugPrintln(const char *); + void debugPrintln(const __FlashStringHelper *); + void doDebugPrint(char (*)(const char *), const char *, bool newLine = false); + + // Debug printf - not glamorous but it works... + #define debugPrintf1( var ) {if (_printDebug == true) _debugSerial->printf( var );} + #define debugPrintf2( var1, var2 ) {if (_printDebug == true) _debugSerial->printf( var1, var2 );} + #define debugPrintf3( var1, var2, var3 ) {if (_printDebug == true) _debugSerial->printf( var1, var2, var3 );} + #define debugPrintf4( var1, var2, var3, var4 ) {if (_printDebug == true) _debugSerial->printf( var1, var2, var3, var4 );} + ICM_20948_AGMT_t agmt; // Acceleometer, Gyroscope, Magenetometer, and Temperature data ICM_20948_AGMT_t getAGMT(void); // Updates the agmt field in the object and also returns a copy directly From 21fb8208949ad77f4f9bd7f7bbd9f8e0f6f6b685 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 9 Feb 2021 10:56:26 +0000 Subject: [PATCH 2/2] Adding debug prints to help diagnose why the sensor sometime fails to begin Also replaced all references to 'slave' or 'slv' with 'peripheral' and 'periph' --- .../Example1_Basics/Example1_Basics.ino | 2 + .../Example2_Advanced/Example2_Advanced.ino | 2 + .../Example3_Interrupts.ino | 2 + keywords.txt | 10 +- src/ICM_20948.cpp | 191 ++++++++++++++++-- src/ICM_20948.h | 20 +- src/util/ICM_20948_C.c | 80 ++++---- src/util/ICM_20948_C.h | 18 +- src/util/ICM_20948_ENUMERATIONS.h | 96 ++++----- src/util/ICM_20948_REGISTERS.h | 142 ++++++------- 10 files changed, 367 insertions(+), 196 deletions(-) diff --git a/examples/Arduino/Example1_Basics/Example1_Basics.ino b/examples/Arduino/Example1_Basics/Example1_Basics.ino index 47edad7..19296be 100644 --- a/examples/Arduino/Example1_Basics/Example1_Basics.ino +++ b/examples/Arduino/Example1_Basics/Example1_Basics.ino @@ -42,6 +42,8 @@ void setup() { WIRE_PORT.setClock(400000); #endif + //myICM.enableDebugging(); // Uncomment this line to enable helpful debug messages on Serial + bool initialized = false; while( !initialized ){ diff --git a/examples/Arduino/Example2_Advanced/Example2_Advanced.ino b/examples/Arduino/Example2_Advanced/Example2_Advanced.ino index 1948395..979e1e1 100644 --- a/examples/Arduino/Example2_Advanced/Example2_Advanced.ino +++ b/examples/Arduino/Example2_Advanced/Example2_Advanced.ino @@ -43,6 +43,8 @@ void setup() { WIRE_PORT.setClock(400000); #endif + //myICM.enableDebugging(); // Uncomment this line to enable helpful debug messages on Serial + bool initialized = false; while( !initialized ){ diff --git a/examples/Arduino/Example3_Interrupts/Example3_Interrupts.ino b/examples/Arduino/Example3_Interrupts/Example3_Interrupts.ino index ae9ec48..5832e57 100644 --- a/examples/Arduino/Example3_Interrupts/Example3_Interrupts.ino +++ b/examples/Arduino/Example3_Interrupts/Example3_Interrupts.ino @@ -61,6 +61,8 @@ void setup() { WIRE_PORT.setClock(400000); #endif + //myICM.enableDebugging(); // Uncomment this line to enable helpful debug messages on Serial + bool initialized = false; while( !initialized ){ diff --git a/keywords.txt b/keywords.txt index af03244..b29785b 100644 --- a/keywords.txt +++ b/keywords.txt @@ -17,6 +17,12 @@ ICM_20948_InternalSensorID_bm KEYWORD1 ####################################### ICM_20948 KEYWORD2 +enableDebugging +disableDebugging +debugPrintStatus +debugPrint +debugPrintln +doDebugPrint getAGMT KEYWORD2 magX KEYWORD2 magY KEYWORD2 @@ -45,8 +51,8 @@ enableDLPF KEYWORD2 setSampleRate KEYWORD2 i2cMasterPassthrough KEYWORD2 i2cMasterEnable KEYWORD2 -i2cMasterConfigureSlave KEYWORD2 -i2cMasterSLV4Transaction KEYWORD2 +i2cControllerConfigurePeripheral KEYWORD2 +i2cControllerPeriph4Transaction KEYWORD2 i2cMasterSingleW KEYWORD2 i2cMasterSingleR KEYWORD2 startupDefault KEYWORD2 diff --git a/src/ICM_20948.cpp b/src/ICM_20948.cpp index ba2b277..04c15ec 100644 --- a/src/ICM_20948.cpp +++ b/src/ICM_20948.cpp @@ -67,7 +67,51 @@ void ICM_20948::doDebugPrint(char (*funct)(const char *), const char *string, bo } } +void ICM_20948::debugPrintf(int i) +{ + if (_printDebug == true) + _debugSerial->print(i); +} +void ICM_20948::debugPrintf(float f) +{ + if (_printDebug == true) + _debugSerial->print(f); +} + +void ICM_20948::debugPrintStatus(ICM_20948_Status_e stat) +{ + switch (stat) + { + case ICM_20948_Stat_Ok: + debugPrint(F("All is well.")); + break; + case ICM_20948_Stat_Err: + debugPrint(F("General Error")); + break; + case ICM_20948_Stat_NotImpl: + debugPrint(F("Not Implemented")); + break; + case ICM_20948_Stat_ParamErr: + debugPrint(F("Parameter Error")); + break; + case ICM_20948_Stat_WrongID: + debugPrint(F("Wrong ID")); + break; + case ICM_20948_Stat_InvalSensor: + debugPrint(F("Invalid Sensor")); + break; + case ICM_20948_Stat_NoData: + debugPrint(F("Data Underflow")); + break; + case ICM_20948_Stat_SensorNotSupported: + debugPrint(F("Sensor Not Supported")); + break; + default: + debugPrint(F("Unknown Status")); + break; + } +} ICM_20948_AGMT_t ICM_20948::getAGMT(void) { @@ -259,6 +303,12 @@ ICM_20948_Status_e ICM_20948::setClockSource(ICM_20948_PWR_MGMT_1_CLKSEL_e sourc ICM_20948_Status_e ICM_20948::checkID(void) { status = ICM_20948_check_id(&_device); + if (status != ICM_20948_Stat_Ok) + { + debugPrint(F("ICM_20948::checkID: ICM_20948_check_id returned: ")); + debugPrintStatus(status); + debugPrintln(F("")); + } return status; } @@ -286,6 +336,9 @@ bool ICM_20948::isConnected(void) { return true; } + debugPrint(F("ICM_20948::isConnected: checkID returned: ")); + debugPrintStatus(status); + debugPrintln(F("")); return false; } @@ -644,18 +697,32 @@ ICM_20948_Status_e ICM_20948::i2cMasterReset() return status; } -ICM_20948_Status_e ICM_20948::i2cMasterConfigureSlave(uint8_t slave, uint8_t addr, uint8_t reg, uint8_t len, bool Rw, bool enable, bool data_only, bool grp, bool swap) +ICM_20948_Status_e ICM_20948::i2cControllerConfigurePeripheral(uint8_t peripheral, uint8_t addr, uint8_t reg, uint8_t len, bool Rw, bool enable, bool data_only, bool grp, bool swap) { - status = ICM_20948_i2c_master_configure_slave(&_device, slave, addr, reg, len, Rw, enable, data_only, grp, swap); + status = ICM_20948_i2c_controller_configure_peripheral(&_device, peripheral, addr, reg, len, Rw, enable, data_only, grp, swap); return status; } -ICM_20948_Status_e ICM_20948::i2cMasterSLV4Transaction(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len, bool Rw, bool send_reg_addr) +//Provided for backward-compatibility only. Please update to i2cControllerConfigurePeripheral and i2cControllerPeriph4Transaction. +//https://www.oshwa.org/2020/06/29/a-resolution-to-redefine-spi-pin-names/ +ICM_20948_Status_e ICM_20948::i2cMasterConfigureSlave(uint8_t peripheral, uint8_t addr, uint8_t reg, uint8_t len, bool Rw, bool enable, bool data_only, bool grp, bool swap) { - status = ICM_20948_i2c_master_slv4_txn(&_device, addr, reg, data, len, Rw, send_reg_addr); + return (i2cControllerConfigurePeripheral(peripheral, addr, reg, len, Rw, enable, data_only, grp, swap)); +} + +ICM_20948_Status_e ICM_20948::i2cControllerPeriph4Transaction(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len, bool Rw, bool send_reg_addr) +{ + status = ICM_20948_i2c_controller_periph4_txn(&_device, addr, reg, data, len, Rw, send_reg_addr); return status; } +//Provided for backward-compatibility only. Please update to i2cControllerConfigurePeripheral and i2cControllerPeriph4Transaction. +//https://www.oshwa.org/2020/06/29/a-resolution-to-redefine-spi-pin-names/ +ICM_20948_Status_e ICM_20948::i2cMasterSLV4Transaction(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len, bool Rw, bool send_reg_addr) +{ + return (i2cControllerPeriph4Transaction(addr, reg, data, len, Rw, send_reg_addr)); +} + ICM_20948_Status_e ICM_20948::i2cMasterSingleW(uint8_t addr, uint8_t reg, uint8_t data) { status = ICM_20948_i2c_master_single_w(&_device, addr, reg, &data); @@ -663,8 +730,14 @@ ICM_20948_Status_e ICM_20948::i2cMasterSingleW(uint8_t addr, uint8_t reg, uint8_ } uint8_t ICM_20948::i2cMasterSingleR(uint8_t addr, uint8_t reg) { - uint8_t data; + uint8_t data = 0; status = ICM_20948_i2c_master_single_r(&_device, addr, reg, &data); + if (status != ICM_20948_Stat_Ok) + { + debugPrint(F("ICM_20948::i2cMasterSingleR: ICM_20948_i2c_master_single_r returned: ")); + debugPrintStatus(status); + debugPrintln(F("")); + } return data; } @@ -675,6 +748,9 @@ ICM_20948_Status_e ICM_20948::startupDefault(void) retval = checkID(); if (retval != ICM_20948_Stat_Ok) { + debugPrint(F("ICM_20948::startupDefault: checkID returned: ")); + debugPrintStatus(retval); + debugPrintln(F("")); status = retval; return status; } @@ -682,6 +758,9 @@ ICM_20948_Status_e ICM_20948::startupDefault(void) retval = swReset(); if (retval != ICM_20948_Stat_Ok) { + debugPrint(F("ICM_20948::startupDefault: swReset returned: ")); + debugPrintStatus(retval); + debugPrintln(F("")); status = retval; return status; } @@ -690,6 +769,9 @@ ICM_20948_Status_e ICM_20948::startupDefault(void) retval = sleep(false); if (retval != ICM_20948_Stat_Ok) { + debugPrint(F("ICM_20948::startupDefault: sleep returned: ")); + debugPrintStatus(retval); + debugPrintln(F("")); status = retval; return status; } @@ -697,6 +779,9 @@ ICM_20948_Status_e ICM_20948::startupDefault(void) retval = lowPower(false); if (retval != ICM_20948_Stat_Ok) { + debugPrint(F("ICM_20948::startupDefault: lowPower returned: ")); + debugPrintStatus(retval); + debugPrintln(F("")); status = retval; return status; } @@ -704,6 +789,9 @@ ICM_20948_Status_e ICM_20948::startupDefault(void) retval = setSampleMode((ICM_20948_Internal_Acc | ICM_20948_Internal_Gyr), ICM_20948_Sample_Mode_Continuous); // options: ICM_20948_Sample_Mode_Continuous or ICM_20948_Sample_Mode_Cycled if (retval != ICM_20948_Stat_Ok) { + debugPrint(F("ICM_20948::startupDefault: setSampleMode returned: ")); + debugPrintStatus(retval); + debugPrintln(F("")); status = retval; return status; } // sensors: ICM_20948_Internal_Acc, ICM_20948_Internal_Gyr, ICM_20948_Internal_Mst @@ -714,6 +802,9 @@ ICM_20948_Status_e ICM_20948::startupDefault(void) retval = setFullScale((ICM_20948_Internal_Acc | ICM_20948_Internal_Gyr), FSS); if (retval != ICM_20948_Stat_Ok) { + debugPrint(F("ICM_20948::startupDefault: setFullScale returned: ")); + debugPrintStatus(retval); + debugPrintln(F("")); status = retval; return status; } @@ -724,6 +815,9 @@ ICM_20948_Status_e ICM_20948::startupDefault(void) retval = setDLPFcfg((ICM_20948_Internal_Acc | ICM_20948_Internal_Gyr), dlpcfg); if (retval != ICM_20948_Stat_Ok) { + debugPrint(F("ICM_20948::startupDefault: setDLPFcfg returned: ")); + debugPrintStatus(retval); + debugPrintln(F("")); status = retval; return status; } @@ -731,23 +825,32 @@ ICM_20948_Status_e ICM_20948::startupDefault(void) retval = enableDLPF(ICM_20948_Internal_Acc, false); if (retval != ICM_20948_Stat_Ok) { + debugPrint(F("ICM_20948::startupDefault: enableDLPF (Acc) returned: ")); + debugPrintStatus(retval); + debugPrintln(F("")); status = retval; return status; } retval = enableDLPF(ICM_20948_Internal_Gyr, false); if (retval != ICM_20948_Stat_Ok) { + debugPrint(F("ICM_20948::startupDefault: enableDLPF (Gyr) returned: ")); + debugPrintStatus(retval); + debugPrintln(F("")); status = retval; return status; } retval = startupMagnetometer(); if (retval != ICM_20948_Stat_Ok) { + debugPrint(F("ICM_20948::startupDefault: startupMagnetometer returned: ")); + debugPrintStatus(retval); + debugPrintln(F("")); status = retval; return status; } - return status; + return status; // Leave status unchanged - return whatever it was when startupDefault was called } // direct read/write @@ -765,7 +868,7 @@ ICM_20948_Status_e ICM_20948::write(uint8_t reg, uint8_t *pdata, uint32_t len) uint8_t ICM_20948::readMag(AK09916_Reg_Addr_e reg) { - uint8_t data = i2cMasterSingleR(MAG_AK09916_I2C_ADDR, reg); + uint8_t data = i2cMasterSingleR(MAG_AK09916_I2C_ADDR, reg); // i2cMasterSingleR updates status too return data; } @@ -819,7 +922,9 @@ ICM_20948_Status_e ICM_20948_I2C::begin(TwoWire &wirePort, bool ad0val, uint8_t status = startupDefault(); if (status != ICM_20948_Stat_Ok) { - return status; + debugPrint(F("ICM_20948_I2C::begin: startupDefault returned: ")); + debugPrintStatus(status); + debugPrintln(F("")); } return status; } @@ -834,25 +939,37 @@ ICM_20948_Status_e ICM_20948::startupMagnetometer(void) //After a ICM reset the Mag sensor may stop responding over the I2C master //Reset the Master I2C until it responds uint8_t tries = 0; - uint8_t maxTries = 5; - while (tries < maxTries) + while (tries < MAX_MAGNETOMETER_STARTS) { + tries++; + //See if we can read the WhoIAm register correctly retval = magWhoIAm(); if (retval == ICM_20948_Stat_Ok) break; //WIA matched! i2cMasterReset(); //Otherwise, reset the master I2C and try again - tries++; + + delay(10); } - if (tries == maxTries) + if (tries == MAX_MAGNETOMETER_STARTS) { + debugPrint(F("ICM_20948::startupMagnetometer: reached MAX_MAGNETOMETER_STARTS (")); + debugPrintf((int)MAX_MAGNETOMETER_STARTS); + debugPrintln(F("). Returning ICM_20948_Stat_WrongID")); status = ICM_20948_Stat_WrongID; return status; } - - //Serial.printf("Mag connected tries: %d\n", tries); + else + { + debugPrint(F("ICM_20948::startupMagnetometer: successful magWhoIAm after ")); + debugPrintf((int)tries); + if (tries == 1) + debugPrintln(F(" try")); + else + debugPrintln(F(" tries")); + } //Set up magnetometer AK09916_CNTL2_Reg_t reg; @@ -860,13 +977,19 @@ ICM_20948_Status_e ICM_20948::startupMagnetometer(void) retval = writeMag(AK09916_REG_CNTL2, (uint8_t *)®); if (retval != ICM_20948_Stat_Ok) { + debugPrint(F("ICM_20948::startupMagnetometer: writeMag returned: ")); + debugPrintStatus(retval); + debugPrintln(F("")); status = retval; return status; } - retval = i2cMasterConfigureSlave(0, MAG_AK09916_I2C_ADDR, AK09916_REG_ST1, 9, true, true, false, false, false); + retval = i2cControllerConfigurePeripheral(0, MAG_AK09916_I2C_ADDR, AK09916_REG_ST1, 9, true, true, false, false, false); if (retval != ICM_20948_Stat_Ok) { + debugPrint(F("ICM_20948::startupMagnetometer: i2cMasterConfigurePeripheral returned: ")); + debugPrintStatus(retval); + debugPrintln(F("")); status = retval; return status; } @@ -880,10 +1003,31 @@ ICM_20948_Status_e ICM_20948::magWhoIAm(void) uint8_t whoiam1, whoiam2; whoiam1 = readMag(AK09916_REG_WIA1); + // readMag calls i2cMasterSingleR which calls ICM_20948_i2c_master_single_r + // i2cMasterSingleR updates status so it is OK to set retval to status here + retval = status; + if (retval != ICM_20948_Stat_Ok) + { + debugPrint(F("ICM_20948::magWhoIAm: whoiam1: ")); + debugPrintf((int)whoiam1); + debugPrint(F(" (should be 72) readMag set status to: ")); + debugPrintStatus(status); + debugPrintln(F("")); + return retval; + } whoiam2 = readMag(AK09916_REG_WIA2); - status = retval; + // readMag calls i2cMasterSingleR which calls ICM_20948_i2c_master_single_r + // i2cMasterSingleR updates status so it is OK to set retval to status here + retval = status; if (retval != ICM_20948_Stat_Ok) { + debugPrint(F("ICM_20948::magWhoIAm: whoiam1: ")); + debugPrintf((int)whoiam1); + debugPrint(F(" (should be 72) whoiam2: ")); + debugPrintf((int)whoiam2); + debugPrint(F(" (should be 9) readMag set status to: ")); + debugPrintStatus(status); + debugPrintln(F("")); return retval; } @@ -893,6 +1037,13 @@ ICM_20948_Status_e ICM_20948::magWhoIAm(void) status = retval; return status; } + + debugPrint(F("ICM_20948::magWhoIAm: whoiam1: ")); + debugPrintf((int)whoiam1); + debugPrint(F(" (should be 72) whoiam2: ")); + debugPrintf((int)whoiam2); + debugPrintln(F(" (should be 9). Returning ICM_20948_Stat_WrongID")); + retval = ICM_20948_Stat_WrongID; status = retval; return status; @@ -909,7 +1060,7 @@ ICM_20948_SPI::ICM_20948_SPI() ICM_20948_Status_e ICM_20948_SPI::begin(uint8_t csPin, SPIClass &spiPort, uint32_t SPIFreq) { if (SPIFreq > 7000000) - SPIFreq = 7000000; + SPIFreq = 7000000; // Limit SPI frequency to 7MHz // Associate _spi = &spiPort; @@ -941,10 +1092,12 @@ ICM_20948_Status_e ICM_20948_SPI::begin(uint8_t csPin, SPIClass &spiPort, uint32 status = startupDefault(); if (status != ICM_20948_Stat_Ok) { - return status; + debugPrint(F("ICM_20948_SPI::begin: startupDefault returned: ")); + debugPrintStatus(status); + debugPrintln(F("")); } - return ICM_20948_Stat_Ok; + return status; } // serif functions for the I2C and SPI classes diff --git a/src/ICM_20948.h b/src/ICM_20948.h index bbafbff..ce41336 100644 --- a/src/ICM_20948.h +++ b/src/ICM_20948.h @@ -23,6 +23,8 @@ class ICM_20948 Stream *_debugSerial; //The stream to send debug messages to if enabled boolean _printDebug = false; //Flag to print the serial commands we are sending to the Serial port for debug + const uint8_t MAX_MAGNETOMETER_STARTS = 10; // This replaces maxTries + protected: ICM_20948_Device_t _device; @@ -58,6 +60,8 @@ class ICM_20948 void disableDebugging(void); //Turn off debug statements + void debugPrintStatus(ICM_20948_Status_e stat); + // gfvalvo's flash string helper code: https://forum.arduino.cc/index.php?topic=533118.msg3634809#msg3634809 void debugPrint(const char *); void debugPrint(const __FlashStringHelper *); @@ -65,11 +69,8 @@ class ICM_20948 void debugPrintln(const __FlashStringHelper *); void doDebugPrint(char (*)(const char *), const char *, bool newLine = false); - // Debug printf - not glamorous but it works... - #define debugPrintf1( var ) {if (_printDebug == true) _debugSerial->printf( var );} - #define debugPrintf2( var1, var2 ) {if (_printDebug == true) _debugSerial->printf( var1, var2 );} - #define debugPrintf3( var1, var2, var3 ) {if (_printDebug == true) _debugSerial->printf( var1, var2, var3 );} - #define debugPrintf4( var1, var2, var3, var4 ) {if (_printDebug == true) _debugSerial->printf( var1, var2, var3, var4 );} + void debugPrintf(int i); + void debugPrintf(float f); ICM_20948_AGMT_t agmt; // Acceleometer, Gyroscope, Magenetometer, and Temperature data ICM_20948_AGMT_t getAGMT(void); // Updates the agmt field in the object and also returns a copy directly @@ -134,8 +135,13 @@ class ICM_20948 ICM_20948_Status_e i2cMasterEnable(bool enable = true); ICM_20948_Status_e i2cMasterReset(); - //Used for configuring slaves 0-3 - ICM_20948_Status_e i2cMasterConfigureSlave(uint8_t slave, uint8_t addr, uint8_t reg, uint8_t len, bool Rw = true, bool enable = true, bool data_only = false, bool grp = false, bool swap = false); + //Used for configuring peripherals 0-3 + ICM_20948_Status_e i2cControllerConfigurePeripheral(uint8_t peripheral, uint8_t addr, uint8_t reg, uint8_t len, bool Rw = true, bool enable = true, bool data_only = false, bool grp = false, bool swap = false); + ICM_20948_Status_e i2cControllerPeriph4Transaction(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len, bool Rw, bool send_reg_addr = true); + + //Provided for backward-compatibility only. Please update to i2cControllerConfigurePeripheral and i2cControllerPeriph4Transaction. + //https://www.oshwa.org/2020/06/29/a-resolution-to-redefine-spi-pin-names/ + ICM_20948_Status_e i2cMasterConfigureSlave(uint8_t peripheral, uint8_t addr, uint8_t reg, uint8_t len, bool Rw = true, bool enable = true, bool data_only = false, bool grp = false, bool swap = false); ICM_20948_Status_e i2cMasterSLV4Transaction(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len, bool Rw, bool send_reg_addr = true); //Used for configuring the Magnetometer diff --git a/src/util/ICM_20948_C.c b/src/util/ICM_20948_C.c index 85ceb40..3659147 100644 --- a/src/util/ICM_20948_C.c +++ b/src/util/ICM_20948_C.c @@ -44,8 +44,8 @@ ICM_20948_Status_e ICM_20948_execute_r(ICM_20948_Device_t *pdev, uint8_t regaddr } //Transact directly with an I2C device, one byte at a time -//Used to configure a device before it is setup into a normal 0-3 slave slot -ICM_20948_Status_e ICM_20948_i2c_master_slv4_txn(ICM_20948_Device_t *pdev, uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len, bool Rw, bool send_reg_addr) +//Used to configure a device before it is setup into a normal 0-3 peripheral slot +ICM_20948_Status_e ICM_20948_i2c_controller_periph4_txn(ICM_20948_Device_t *pdev, uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len, bool Rw, bool send_reg_addr) { // Thanks MikeFair! // https://github.com/kriswiner/MPU9250/issues/86 ICM_20948_Status_e retval = ICM_20948_Stat_Ok; @@ -53,20 +53,20 @@ ICM_20948_Status_e ICM_20948_i2c_master_slv4_txn(ICM_20948_Device_t *pdev, uint8 addr = (((Rw) ? 0x80 : 0x00) | addr); retval = ICM_20948_set_bank(pdev, 3); - retval = ICM_20948_execute_w(pdev, AGB3_REG_I2C_SLV4_ADDR, (uint8_t *)&addr, 1); + retval = ICM_20948_execute_w(pdev, AGB3_REG_I2C_PERIPH4_ADDR, (uint8_t *)&addr, 1); if (retval != ICM_20948_Stat_Ok) { return retval; } retval = ICM_20948_set_bank(pdev, 3); - retval = ICM_20948_execute_w(pdev, AGB3_REG_I2C_SLV4_REG, (uint8_t *)®, 1); + retval = ICM_20948_execute_w(pdev, AGB3_REG_I2C_PERIPH4_REG, (uint8_t *)®, 1); if (retval != ICM_20948_Stat_Ok) { return retval; } - ICM_20948_I2C_SLV4_CTRL_t ctrl; + ICM_20948_I2C_PERIPH4_CTRL_t ctrl; ctrl.EN = 1; ctrl.INT_EN = false; ctrl.DLY = 0; @@ -81,7 +81,7 @@ ICM_20948_Status_e ICM_20948_i2c_master_slv4_txn(ICM_20948_Device_t *pdev, uint8 if (!Rw) { retval = ICM_20948_set_bank(pdev, 3); - retval = ICM_20948_execute_w(pdev, AGB3_REG_I2C_SLV4_DO, (uint8_t *)&(data[nByte]), 1); + retval = ICM_20948_execute_w(pdev, AGB3_REG_I2C_PERIPH4_DO, (uint8_t *)&(data[nByte]), 1); if (retval != ICM_20948_Stat_Ok) { return retval; @@ -90,7 +90,7 @@ ICM_20948_Status_e ICM_20948_i2c_master_slv4_txn(ICM_20948_Device_t *pdev, uint8 // Kick off txn retval = ICM_20948_set_bank(pdev, 3); - retval = ICM_20948_execute_w(pdev, AGB3_REG_I2C_SLV4_CTRL, (uint8_t *)&ctrl, sizeof(ICM_20948_I2C_SLV4_CTRL_t)); + retval = ICM_20948_execute_w(pdev, AGB3_REG_I2C_PERIPH4_CTRL, (uint8_t *)&ctrl, sizeof(ICM_20948_I2C_PERIPH4_CTRL_t)); if (retval != ICM_20948_Stat_Ok) { return retval; @@ -99,17 +99,17 @@ ICM_20948_Status_e ICM_20948_i2c_master_slv4_txn(ICM_20948_Device_t *pdev, uint8 // long tsTimeout = millis() + 3000; // Emergency timeout for txn (hard coded to 3 secs) uint32_t max_cycles = 1000; uint32_t count = 0; - bool slave4Done = false; - while (!slave4Done) + bool peripheral4Done = false; + while (!peripheral4Done) { retval = ICM_20948_set_bank(pdev, 0); retval = ICM_20948_execute_r(pdev, AGB0_REG_I2C_MST_STATUS, (uint8_t *)&i2c_mst_status, 1); - slave4Done = (i2c_mst_status.I2C_SLV4_DONE /*| (millis() > tsTimeout) */); //Avoid forever-loops - slave4Done |= (count >= max_cycles); + peripheral4Done = (i2c_mst_status.I2C_PERIPH4_DONE /*| (millis() > tsTimeout) */); //Avoid forever-loops + peripheral4Done |= (count >= max_cycles); count++; } - txn_failed = (i2c_mst_status.I2C_SLV4_NACK /*| (millis() > tsTimeout) */); + txn_failed = (i2c_mst_status.I2C_PERIPH4_NACK /*| (millis() > tsTimeout) */); txn_failed |= (count >= max_cycles); if (txn_failed) break; @@ -117,7 +117,7 @@ ICM_20948_Status_e ICM_20948_i2c_master_slv4_txn(ICM_20948_Device_t *pdev, uint8 if (Rw) { retval = ICM_20948_set_bank(pdev, 3); - retval = ICM_20948_execute_r(pdev, AGB3_REG_I2C_SLV4_DI, &data[nByte], 1); + retval = ICM_20948_execute_r(pdev, AGB3_REG_I2C_PERIPH4_DI, &data[nByte], 1); } nByte++; @@ -134,12 +134,12 @@ ICM_20948_Status_e ICM_20948_i2c_master_slv4_txn(ICM_20948_Device_t *pdev, uint8 ICM_20948_Status_e ICM_20948_i2c_master_single_w(ICM_20948_Device_t *pdev, uint8_t addr, uint8_t reg, uint8_t *data) { - return ICM_20948_i2c_master_slv4_txn(pdev, addr, reg, data, 1, false, true); + return ICM_20948_i2c_controller_periph4_txn(pdev, addr, reg, data, 1, false, true); } ICM_20948_Status_e ICM_20948_i2c_master_single_r(ICM_20948_Device_t *pdev, uint8_t addr, uint8_t reg, uint8_t *data) { - return ICM_20948_i2c_master_slv4_txn(pdev, addr, reg, data, 1, true, true); + return ICM_20948_i2c_controller_periph4_txn(pdev, addr, reg, data, 1, true, true); } ICM_20948_Status_e ICM_20948_set_bank(ICM_20948_Device_t *pdev, uint8_t bank) @@ -702,35 +702,35 @@ ICM_20948_Status_e ICM_20948_i2c_master_reset(ICM_20948_Device_t *pdev) return retval; } -ICM_20948_Status_e ICM_20948_i2c_master_configure_slave(ICM_20948_Device_t *pdev, uint8_t slave, uint8_t addr, uint8_t reg, uint8_t len, bool Rw, bool enable, bool data_only, bool grp, bool swap) +ICM_20948_Status_e ICM_20948_i2c_controller_configure_peripheral(ICM_20948_Device_t *pdev, uint8_t peripheral, uint8_t addr, uint8_t reg, uint8_t len, bool Rw, bool enable, bool data_only, bool grp, bool swap) { ICM_20948_Status_e retval = ICM_20948_Stat_Ok; - uint8_t slv_addr_reg; - uint8_t slv_reg_reg; - uint8_t slv_ctrl_reg; + uint8_t periph_addr_reg; + uint8_t periph_reg_reg; + uint8_t periph_ctrl_reg; - switch (slave) + switch (peripheral) { case 0: - slv_addr_reg = AGB3_REG_I2C_SLV0_ADDR; - slv_reg_reg = AGB3_REG_I2C_SLV0_REG; - slv_ctrl_reg = AGB3_REG_I2C_SLV0_CTRL; + periph_addr_reg = AGB3_REG_I2C_PERIPH0_ADDR; + periph_reg_reg = AGB3_REG_I2C_PERIPH0_REG; + periph_ctrl_reg = AGB3_REG_I2C_PERIPH0_CTRL; break; case 1: - slv_addr_reg = AGB3_REG_I2C_SLV1_ADDR; - slv_reg_reg = AGB3_REG_I2C_SLV1_REG; - slv_ctrl_reg = AGB3_REG_I2C_SLV1_CTRL; + periph_addr_reg = AGB3_REG_I2C_PERIPH1_ADDR; + periph_reg_reg = AGB3_REG_I2C_PERIPH1_REG; + periph_ctrl_reg = AGB3_REG_I2C_PERIPH1_CTRL; break; case 2: - slv_addr_reg = AGB3_REG_I2C_SLV2_ADDR; - slv_reg_reg = AGB3_REG_I2C_SLV2_REG; - slv_ctrl_reg = AGB3_REG_I2C_SLV2_CTRL; + periph_addr_reg = AGB3_REG_I2C_PERIPH2_ADDR; + periph_reg_reg = AGB3_REG_I2C_PERIPH2_REG; + periph_ctrl_reg = AGB3_REG_I2C_PERIPH2_CTRL; break; case 3: - slv_addr_reg = AGB3_REG_I2C_SLV3_ADDR; - slv_reg_reg = AGB3_REG_I2C_SLV3_REG; - slv_ctrl_reg = AGB3_REG_I2C_SLV3_CTRL; + periph_addr_reg = AGB3_REG_I2C_PERIPH3_ADDR; + periph_reg_reg = AGB3_REG_I2C_PERIPH3_REG; + periph_ctrl_reg = AGB3_REG_I2C_PERIPH3_CTRL; break; default: return ICM_20948_Stat_ParamErr; @@ -742,36 +742,36 @@ ICM_20948_Status_e ICM_20948_i2c_master_configure_slave(ICM_20948_Device_t *pdev return retval; } - // Set the slave address and the Rw flag - ICM_20948_I2C_SLVX_ADDR_t address; + // Set the peripheral address and the Rw flag + ICM_20948_I2C_PERIPHX_ADDR_t address; address.ID = addr; if (Rw) { address.RNW = 1; } - retval = ICM_20948_execute_w(pdev, slv_addr_reg, (uint8_t *)&address, sizeof(ICM_20948_I2C_SLVX_ADDR_t)); + retval = ICM_20948_execute_w(pdev, periph_addr_reg, (uint8_t *)&address, sizeof(ICM_20948_I2C_PERIPHX_ADDR_t)); if (retval != ICM_20948_Stat_Ok) { return retval; } - // Set the slave sub-address (reg) - ICM_20948_I2C_SLVX_REG_t subaddress; + // Set the peripheral sub-address (reg) + ICM_20948_I2C_PERIPHX_REG_t subaddress; subaddress.REG = reg; - retval = ICM_20948_execute_w(pdev, slv_reg_reg, (uint8_t *)&subaddress, sizeof(ICM_20948_I2C_SLVX_REG_t)); + retval = ICM_20948_execute_w(pdev, periph_reg_reg, (uint8_t *)&subaddress, sizeof(ICM_20948_I2C_PERIPHX_REG_t)); if (retval != ICM_20948_Stat_Ok) { return retval; } // Set up the control info - ICM_20948_I2C_SLVX_CTRL_t ctrl; + ICM_20948_I2C_PERIPHX_CTRL_t ctrl; ctrl.LENG = len; ctrl.EN = enable; ctrl.REG_DIS = data_only; ctrl.GRP = grp; ctrl.BYTE_SW = swap; - retval = ICM_20948_execute_w(pdev, slv_ctrl_reg, (uint8_t *)&ctrl, sizeof(ICM_20948_I2C_SLVX_CTRL_t)); + retval = ICM_20948_execute_w(pdev, periph_ctrl_reg, (uint8_t *)&ctrl, sizeof(ICM_20948_I2C_PERIPHX_CTRL_t)); if (retval != ICM_20948_Stat_Ok) { return retval; diff --git a/src/util/ICM_20948_C.h b/src/util/ICM_20948_C.h index 402ece2..6e94af3 100644 --- a/src/util/ICM_20948_C.h +++ b/src/util/ICM_20948_C.h @@ -152,8 +152,8 @@ read raw temp values configure temperature sensor load DMP firmware into the device read DMP results from the device -configure interrupts - - configure interrupt and FSYNC pins +configure interrupts + - configure interrupt and FSYNC pins - configure which interrupts activate the interrupt pin respond to interrupts on INT configure FIFO (and use it) @@ -174,7 +174,7 @@ callbacks for the user to respond to interrupt events ICM_20948_Status_e ICM_20948_execute_w(ICM_20948_Device_t *pdev, uint8_t regaddr, uint8_t *pdata, uint32_t len); // Single-shot I2C on Master IF - ICM_20948_Status_e ICM_20948_i2c_master_slv4_txn(ICM_20948_Device_t *pdev, uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len, bool Rw, bool send_reg_addr); + ICM_20948_Status_e ICM_20948_i2c_controller_periph4_txn(ICM_20948_Device_t *pdev, uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len, bool Rw, bool send_reg_addr); ICM_20948_Status_e ICM_20948_i2c_master_single_w(ICM_20948_Device_t *pdev, uint8_t addr, uint8_t reg, uint8_t *data); ICM_20948_Status_e ICM_20948_i2c_master_single_r(ICM_20948_Device_t *pdev, uint8_t addr, uint8_t reg, uint8_t *data); @@ -203,7 +203,7 @@ callbacks for the user to respond to interrupt events ICM_20948_Status_e ICM_20948_i2c_master_passthrough(ICM_20948_Device_t *pdev, bool passthrough); ICM_20948_Status_e ICM_20948_i2c_master_enable(ICM_20948_Device_t *pdev, bool enable); ICM_20948_Status_e ICM_20948_i2c_master_reset(ICM_20948_Device_t *pdev); - ICM_20948_Status_e ICM_20948_i2c_master_configure_slave(ICM_20948_Device_t *pdev, uint8_t slave, uint8_t addr, uint8_t reg, uint8_t len, bool Rw, bool enable, bool data_only, bool grp, bool swap); + ICM_20948_Status_e ICM_20948_i2c_controller_configure_peripheral(ICM_20948_Device_t *pdev, uint8_t peripheral, uint8_t addr, uint8_t reg, uint8_t len, bool Rw, bool enable, bool data_only, bool grp, bool swap); // Higher Level ICM_20948_Status_e ICM_20948_get_agmt(ICM_20948_Device_t *pdev, ICM_20948_AGMT_t *p); @@ -212,15 +212,15 @@ callbacks for the user to respond to interrupt events // ToDo: - /* + /* Want to access magnetometer throught the I2C master interface... // If using the I2C master to read from the magnetometer // Enable the I2C master to talk to the magnetometer through the ICM 20948 - myICM.i2cMasterEnable( true ); + myICM.i2cMasterEnable( true ); SERIAL_PORT.print(F("Enabling the I2C master returned ")); SERIAL_PORT.println(myICM.statusString()); - myICM.i2cMasterConfigureSlave ( 0, MAG_AK09916_I2C_ADDR, REG_ST1, 9, true, true, false, false, false ); - SERIAL_PORT.print(F("Configuring the magnetometer slave returned ")); SERIAL_PORT.println(myICM.statusString()); + myICM.i2cControllerConfigurePeripheral ( 0, MAG_AK09916_I2C_ADDR, REG_ST1, 9, true, true, false, false, false ); + SERIAL_PORT.print(F("Configuring the magnetometer peripheral returned ")); SERIAL_PORT.println(myICM.statusString()); // Operate the I2C master in duty-cycled mode myICM.setSampleMode( (ICM_20948_Internal_Mst | ICM_20948_Internal_Gyr), ICM_20948_Sample_Mode_Cycled ); // options: ICM_20948_Sample_Mode_Continuous or ICM_20948_Sample_Mode_Cycled @@ -230,4 +230,4 @@ callbacks for the user to respond to interrupt events } #endif /* __cplusplus */ -#endif /* _ICM_20948_C_H_ */ \ No newline at end of file +#endif /* _ICM_20948_C_H_ */ diff --git a/src/util/ICM_20948_ENUMERATIONS.h b/src/util/ICM_20948_ENUMERATIONS.h index 4457bed..7df094f 100644 --- a/src/util/ICM_20948_ENUMERATIONS.h +++ b/src/util/ICM_20948_ENUMERATIONS.h @@ -71,32 +71,32 @@ typedef enum{ // AGB0_REG_GYRO_YOUT_L, // AGB0_REG_GYRO_ZOUT_H, // AGB0_REG_GYRO_ZOUT_L, - // AGB0_REG_TEMP_OUT_H, + // AGB0_REG_TEMP_OUT_H, // AGB0_REG_TEMP_OUT_L, - // AGB0_REG_EXT_SLV_SENS_DATA_00, - // AGB0_REG_EXT_SLV_SENS_DATA_01, - // AGB0_REG_EXT_SLV_SENS_DATA_02, - // AGB0_REG_EXT_SLV_SENS_DATA_03, - // AGB0_REG_EXT_SLV_SENS_DATA_04, - // AGB0_REG_EXT_SLV_SENS_DATA_05, - // AGB0_REG_EXT_SLV_SENS_DATA_06, - // AGB0_REG_EXT_SLV_SENS_DATA_07, - // AGB0_REG_EXT_SLV_SENS_DATA_08, - // AGB0_REG_EXT_SLV_SENS_DATA_09, - // AGB0_REG_EXT_SLV_SENS_DATA_10, - // AGB0_REG_EXT_SLV_SENS_DATA_11, - // AGB0_REG_EXT_SLV_SENS_DATA_12, - // AGB0_REG_EXT_SLV_SENS_DATA_13, - // AGB0_REG_EXT_SLV_SENS_DATA_14, - // AGB0_REG_EXT_SLV_SENS_DATA_15, - // AGB0_REG_EXT_SLV_SENS_DATA_16, - // AGB0_REG_EXT_SLV_SENS_DATA_17, - // AGB0_REG_EXT_SLV_SENS_DATA_18, - // AGB0_REG_EXT_SLV_SENS_DATA_19, - // AGB0_REG_EXT_SLV_SENS_DATA_20, - // AGB0_REG_EXT_SLV_SENS_DATA_21, - // AGB0_REG_EXT_SLV_SENS_DATA_22, - // AGB0_REG_EXT_SLV_SENS_DATA_23, + // AGB0_REG_EXT_PERIPH_SENS_DATA_00, + // AGB0_REG_EXT_PERIPH_SENS_DATA_01, + // AGB0_REG_EXT_PERIPH_SENS_DATA_02, + // AGB0_REG_EXT_PERIPH_SENS_DATA_03, + // AGB0_REG_EXT_PERIPH_SENS_DATA_04, + // AGB0_REG_EXT_PERIPH_SENS_DATA_05, + // AGB0_REG_EXT_PERIPH_SENS_DATA_06, + // AGB0_REG_EXT_PERIPH_SENS_DATA_07, + // AGB0_REG_EXT_PERIPH_SENS_DATA_08, + // AGB0_REG_EXT_PERIPH_SENS_DATA_09, + // AGB0_REG_EXT_PERIPH_SENS_DATA_10, + // AGB0_REG_EXT_PERIPH_SENS_DATA_11, + // AGB0_REG_EXT_PERIPH_SENS_DATA_12, + // AGB0_REG_EXT_PERIPH_SENS_DATA_13, + // AGB0_REG_EXT_PERIPH_SENS_DATA_14, + // AGB0_REG_EXT_PERIPH_SENS_DATA_15, + // AGB0_REG_EXT_PERIPH_SENS_DATA_16, + // AGB0_REG_EXT_PERIPH_SENS_DATA_17, + // AGB0_REG_EXT_PERIPH_SENS_DATA_18, + // AGB0_REG_EXT_PERIPH_SENS_DATA_19, + // AGB0_REG_EXT_PERIPH_SENS_DATA_20, + // AGB0_REG_EXT_PERIPH_SENS_DATA_21, + // AGB0_REG_EXT_PERIPH_SENS_DATA_22, + // AGB0_REG_EXT_PERIPH_SENS_DATA_23, // // Break // AGB0_REG_FIFO_EN_1 = 0x66, // AGB0_REG_FIFO_EN_2, @@ -214,30 +214,30 @@ typedef enum{ // Format is dAbwB_nXbwZ - A is integer part of 3db BW, B is // AGB3_REG_I2C_MST_ODR_CONFIG = 0x00, // AGB3_REG_I2C_MST_CTRL, // AGB3_REG_I2C_MST_DELAY_CTRL, - // AGB3_REG_I2C_SLV0_ADDR, - // AGB3_REG_I2C_SLV0_REG, - // AGB3_REG_I2C_SLV0_CTRL, - // AGB3_REG_I2C_SLV0_DO, - // AGB3_REG_I2C_SLV1_ADDR, - // AGB3_REG_I2C_SLV1_REG, - // AGB3_REG_I2C_SLV1_CTRL, - // AGB3_REG_I2C_SLV1_DO, - // AGB3_REG_I2C_SLV2_ADDR, - // AGB3_REG_I2C_SLV2_REG, - // AGB3_REG_I2C_SLV2_CTRL, - // AGB3_REG_I2C_SLV2_DO, - // AGB3_REG_I2C_SLV3_ADDR, - // AGB3_REG_I2C_SLV3_REG, - // AGB3_REG_I2C_SLV3_CTRL, - // AGB3_REG_I2C_SLV3_DO, - // AGB3_REG_I2C_SLV4_ADDR, - // AGB3_REG_I2C_SLV4_REG, - // AGB3_REG_I2C_SLV4_CTRL, - // AGB3_REG_I2C_SLV4_DO, - // AGB3_REG_I2C_SLV4_DI, + // AGB3_REG_I2C_PERIPH0_ADDR, + // AGB3_REG_I2C_PERIPH0_REG, + // AGB3_REG_I2C_PERIPH0_CTRL, + // AGB3_REG_I2C_PERIPH0_DO, + // AGB3_REG_I2C_PERIPH1_ADDR, + // AGB3_REG_I2C_PERIPH1_REG, + // AGB3_REG_I2C_PERIPH1_CTRL, + // AGB3_REG_I2C_PERIPH1_DO, + // AGB3_REG_I2C_PERIPH2_ADDR, + // AGB3_REG_I2C_PERIPH2_REG, + // AGB3_REG_I2C_PERIPH2_CTRL, + // AGB3_REG_I2C_PERIPH2_DO, + // AGB3_REG_I2C_PERIPH3_ADDR, + // AGB3_REG_I2C_PERIPH3_REG, + // AGB3_REG_I2C_PERIPH3_CTRL, + // AGB3_REG_I2C_PERIPH3_DO, + // AGB3_REG_I2C_PERIPH4_ADDR, + // AGB3_REG_I2C_PERIPH4_REG, + // AGB3_REG_I2C_PERIPH4_CTRL, + // AGB3_REG_I2C_PERIPH4_DO, + // AGB3_REG_I2C_PERIPH4_DI, // // Break // AGB3_REG_REG_BANK_SEL = 0x7F, - + // // Magnetometer // M_REG_WIA2 = 0x01, // // Break @@ -260,4 +260,4 @@ typedef enum{ // Format is dAbwB_nXbwZ - A is integer part of 3db BW, B is } #endif /* __cplusplus */ -#endif /* _ICM_20948_ENUMERATIONS_H_ */ \ No newline at end of file +#endif /* _ICM_20948_ENUMERATIONS_H_ */ diff --git a/src/util/ICM_20948_REGISTERS.h b/src/util/ICM_20948_REGISTERS.h index bccdc0b..bbffe98 100644 --- a/src/util/ICM_20948_REGISTERS.h +++ b/src/util/ICM_20948_REGISTERS.h @@ -55,32 +55,32 @@ typedef enum{ AGB0_REG_GYRO_YOUT_L, AGB0_REG_GYRO_ZOUT_H, AGB0_REG_GYRO_ZOUT_L, - AGB0_REG_TEMP_OUT_H, + AGB0_REG_TEMP_OUT_H, AGB0_REG_TEMP_OUT_L, - AGB0_REG_EXT_SLV_SENS_DATA_00, - AGB0_REG_EXT_SLV_SENS_DATA_01, - AGB0_REG_EXT_SLV_SENS_DATA_02, - AGB0_REG_EXT_SLV_SENS_DATA_03, - AGB0_REG_EXT_SLV_SENS_DATA_04, - AGB0_REG_EXT_SLV_SENS_DATA_05, - AGB0_REG_EXT_SLV_SENS_DATA_06, - AGB0_REG_EXT_SLV_SENS_DATA_07, - AGB0_REG_EXT_SLV_SENS_DATA_08, - AGB0_REG_EXT_SLV_SENS_DATA_09, - AGB0_REG_EXT_SLV_SENS_DATA_10, - AGB0_REG_EXT_SLV_SENS_DATA_11, - AGB0_REG_EXT_SLV_SENS_DATA_12, - AGB0_REG_EXT_SLV_SENS_DATA_13, - AGB0_REG_EXT_SLV_SENS_DATA_14, - AGB0_REG_EXT_SLV_SENS_DATA_15, - AGB0_REG_EXT_SLV_SENS_DATA_16, - AGB0_REG_EXT_SLV_SENS_DATA_17, - AGB0_REG_EXT_SLV_SENS_DATA_18, - AGB0_REG_EXT_SLV_SENS_DATA_19, - AGB0_REG_EXT_SLV_SENS_DATA_20, - AGB0_REG_EXT_SLV_SENS_DATA_21, - AGB0_REG_EXT_SLV_SENS_DATA_22, - AGB0_REG_EXT_SLV_SENS_DATA_23, + AGB0_REG_EXT_PERIPH_SENS_DATA_00, + AGB0_REG_EXT_PERIPH_SENS_DATA_01, + AGB0_REG_EXT_PERIPH_SENS_DATA_02, + AGB0_REG_EXT_PERIPH_SENS_DATA_03, + AGB0_REG_EXT_PERIPH_SENS_DATA_04, + AGB0_REG_EXT_PERIPH_SENS_DATA_05, + AGB0_REG_EXT_PERIPH_SENS_DATA_06, + AGB0_REG_EXT_PERIPH_SENS_DATA_07, + AGB0_REG_EXT_PERIPH_SENS_DATA_08, + AGB0_REG_EXT_PERIPH_SENS_DATA_09, + AGB0_REG_EXT_PERIPH_SENS_DATA_10, + AGB0_REG_EXT_PERIPH_SENS_DATA_11, + AGB0_REG_EXT_PERIPH_SENS_DATA_12, + AGB0_REG_EXT_PERIPH_SENS_DATA_13, + AGB0_REG_EXT_PERIPH_SENS_DATA_14, + AGB0_REG_EXT_PERIPH_SENS_DATA_15, + AGB0_REG_EXT_PERIPH_SENS_DATA_16, + AGB0_REG_EXT_PERIPH_SENS_DATA_17, + AGB0_REG_EXT_PERIPH_SENS_DATA_18, + AGB0_REG_EXT_PERIPH_SENS_DATA_19, + AGB0_REG_EXT_PERIPH_SENS_DATA_20, + AGB0_REG_EXT_PERIPH_SENS_DATA_21, + AGB0_REG_EXT_PERIPH_SENS_DATA_22, + AGB0_REG_EXT_PERIPH_SENS_DATA_23, // Break AGB0_REG_FIFO_EN_1 = 0x66, AGB0_REG_FIFO_EN_2, @@ -150,30 +150,30 @@ typedef enum{ AGB3_REG_I2C_MST_ODR_CONFIG = 0x00, AGB3_REG_I2C_MST_CTRL, AGB3_REG_I2C_MST_DELAY_CTRL, - AGB3_REG_I2C_SLV0_ADDR, - AGB3_REG_I2C_SLV0_REG, - AGB3_REG_I2C_SLV0_CTRL, - AGB3_REG_I2C_SLV0_DO, - AGB3_REG_I2C_SLV1_ADDR, - AGB3_REG_I2C_SLV1_REG, - AGB3_REG_I2C_SLV1_CTRL, - AGB3_REG_I2C_SLV1_DO, - AGB3_REG_I2C_SLV2_ADDR, - AGB3_REG_I2C_SLV2_REG, - AGB3_REG_I2C_SLV2_CTRL, - AGB3_REG_I2C_SLV2_DO, - AGB3_REG_I2C_SLV3_ADDR, - AGB3_REG_I2C_SLV3_REG, - AGB3_REG_I2C_SLV3_CTRL, - AGB3_REG_I2C_SLV3_DO, - AGB3_REG_I2C_SLV4_ADDR, - AGB3_REG_I2C_SLV4_REG, - AGB3_REG_I2C_SLV4_CTRL, - AGB3_REG_I2C_SLV4_DO, - AGB3_REG_I2C_SLV4_DI, + AGB3_REG_I2C_PERIPH0_ADDR, + AGB3_REG_I2C_PERIPH0_REG, + AGB3_REG_I2C_PERIPH0_CTRL, + AGB3_REG_I2C_PERIPH0_DO, + AGB3_REG_I2C_PERIPH1_ADDR, + AGB3_REG_I2C_PERIPH1_REG, + AGB3_REG_I2C_PERIPH1_CTRL, + AGB3_REG_I2C_PERIPH1_DO, + AGB3_REG_I2C_PERIPH2_ADDR, + AGB3_REG_I2C_PERIPH2_REG, + AGB3_REG_I2C_PERIPH2_CTRL, + AGB3_REG_I2C_PERIPH2_DO, + AGB3_REG_I2C_PERIPH3_ADDR, + AGB3_REG_I2C_PERIPH3_REG, + AGB3_REG_I2C_PERIPH3_CTRL, + AGB3_REG_I2C_PERIPH3_DO, + AGB3_REG_I2C_PERIPH4_ADDR, + AGB3_REG_I2C_PERIPH4_REG, + AGB3_REG_I2C_PERIPH4_CTRL, + AGB3_REG_I2C_PERIPH4_DO, + AGB3_REG_I2C_PERIPH4_DI, // Break AGB3_REG_REG_BANK_SEL = 0x7F, - + // Magnetometer M_REG_WIA2 = 0x01, // Break @@ -299,13 +299,13 @@ typedef union{ // }ICM_20948_INT_ENABLE_3_t; typedef struct{ - uint8_t I2C_SLV0_NACK : 1; - uint8_t I2C_SLV1_NACK : 1; - uint8_t I2C_SLV2_NACK : 1; - uint8_t I2C_SLV3_NACK : 1; - uint8_t I2C_SLV4_NACK : 1; + uint8_t I2C_PERIPH0_NACK : 1; + uint8_t I2C_PERIPH1_NACK : 1; + uint8_t I2C_PERIPH2_NACK : 1; + uint8_t I2C_PERIPH3_NACK : 1; + uint8_t I2C_PERIPH4_NACK : 1; uint8_t I2C_LOST_ARB : 1; - uint8_t I2C_SLV4_DONE : 1; + uint8_t I2C_PERIPH4_DONE : 1; uint8_t PASS_THROUGH : 1; }ICM_20948_I2C_MST_STATUS_t; @@ -428,13 +428,13 @@ typedef struct{ typedef struct{ uint8_t DATA; // Note: this is not worth copying 24 times, despite there being 24 registers like this one -}ICM_20948_EXT_SLV_SENS_DATA_t; +}ICM_20948_EXT_PERIPH_SENS_DATA_t; typedef struct{ - uint8_t SLV_0_FIFO_EN : 1; - uint8_t SLV_1_FIFO_EN : 1; - uint8_t SLV_2_FIFO_EN : 1; - uint8_t SLV_3_FIFO_EN : 1; + uint8_t PERIPH_0_FIFO_EN : 1; + uint8_t PERIPH_1_FIFO_EN : 1; + uint8_t PERIPH_2_FIFO_EN : 1; + uint8_t PERIPH_3_FIFO_EN : 1; uint8_t reserved_0 : 4; }ICM_20948_FIFO_EN_1_t; @@ -659,11 +659,11 @@ typedef struct{ }ICM_20948_I2C_MST_CTRL_t; typedef struct{ - uint8_t I2C_SLV0_DELAY_EN : 1; - uint8_t I2C_SLV1_DELAY_EN : 1; - uint8_t I2C_SLV2_DELAY_EN : 1; - uint8_t I2C_SLV3_DELAY_EN : 1; - uint8_t I2C_SLV4_DELAY_EN : 1; + uint8_t I2C_PERIPH0_DELAY_EN : 1; + uint8_t I2C_PERIPH1_DELAY_EN : 1; + uint8_t I2C_PERIPH2_DELAY_EN : 1; + uint8_t I2C_PERIPH3_DELAY_EN : 1; + uint8_t I2C_PERIPH4_DELAY_EN : 1; uint8_t reserved_0 : 2; uint8_t DELAY_ES_SHADOW : 1; }ICM_20948_I2C_MST_DELAY_CTRL_t; @@ -671,11 +671,11 @@ typedef struct{ typedef struct{ uint8_t ID : 7; uint8_t RNW : 1; -}ICM_20948_I2C_SLVX_ADDR_t; +}ICM_20948_I2C_PERIPHX_ADDR_t; typedef struct{ - uint8_t REG; -}ICM_20948_I2C_SLVX_REG_t; + uint8_t REG; +}ICM_20948_I2C_PERIPHX_REG_t; typedef struct{ uint8_t LENG : 4; @@ -683,22 +683,22 @@ typedef struct{ uint8_t REG_DIS : 1; uint8_t BYTE_SW : 1; uint8_t EN : 1; -}ICM_20948_I2C_SLVX_CTRL_t; +}ICM_20948_I2C_PERIPHX_CTRL_t; typedef struct{ uint8_t DO; -}ICM_20948_I2C_SLVX_DO_t; +}ICM_20948_I2C_PERIPHX_DO_t; typedef struct{ uint8_t DLY : 5; uint8_t REG_DIS : 1; uint8_t INT_EN : 1; uint8_t EN : 1; -}ICM_20948_I2C_SLV4_CTRL_t; +}ICM_20948_I2C_PERIPH4_CTRL_t; typedef struct{ uint8_t DI; -}ICM_20948_I2C_SLV4_DI_t; +}ICM_20948_I2C_PERIPH4_DI_t; // Bank select register! @@ -716,4 +716,4 @@ typedef struct{ } #endif /* __cplusplus */ -#endif /* _ICM_20948_REGISTERS_H_ */ \ No newline at end of file +#endif /* _ICM_20948_REGISTERS_H_ */