6#define I2C_MASTER_RESETS_BEFORE_FAIL \
8#define NUM_FINISHED_CHECKS \
12#define ICM20X_B0_WHOAMI 0x00
13#define ICM20X_B0_USER_CTRL 0x03
14#define ICM20X_B0_LP_CONFIG 0x05
15#define ICM20X_B0_REG_INT_PIN_CFG 0xF
16#define ICM20X_B0_REG_INT_ENABLE 0x10
17#define ICM20X_B0_REG_INT_ENABLE_1 0x11
18#define ICM20X_B0_I2C_MST_STATUS \
20#define ICM20X_B0_REG_BANK_SEL 0x7F
21#define ICM20X_B0_PWR_MGMT_1 0x06
22#define ICM20X_B0_ACCEL_XOUT_H 0x2D
23#define ICM20X_B0_GYRO_XOUT_H 0x33
26#define ICM20X_B2_GYRO_SMPLRT_DIV 0x00
27#define ICM20X_B2_GYRO_CONFIG_1 0x01
28#define ICM20X_B2_ACCEL_SMPLRT_DIV_1 0x10
29#define ICM20X_B2_ACCEL_SMPLRT_DIV_2 0x11
30#define ICM20X_B2_ACCEL_CONFIG_1 0x14
33#define ICM20X_B3_I2C_MST_ODR_CONFIG 0x0
34#define ICM20X_B3_I2C_MST_CTRL 0x1
35#define ICM20X_B3_I2C_MST_DELAY_CTRL 0x2
36#define ICM20X_B3_I2C_SLV0_ADDR \
38#define ICM20X_B3_I2C_SLV0_REG \
40#define ICM20X_B3_I2C_SLV0_CTRL 0x5
41#define ICM20X_B3_I2C_SLV0_DO 0x6
43#define ICM20X_B3_I2C_SLV4_ADDR \
45#define ICM20X_B3_I2C_SLV4_REG \
47#define ICM20X_B3_I2C_SLV4_CTRL 0x15
48#define ICM20X_B3_I2C_SLV4_DO 0x16
49#define ICM20X_B3_I2C_SLV4_DI 0x17
51#define ICM20948_CHIP_ID 0xEA
53#define ICM20948_I2CADDR_DEFAULT 0x69
54#define ICM20948_MAG_ID 0x09
56#define ICM20948_UT_PER_LSB 0.15
58#define AK09916_WIA2 0x01
59#define AK09916_ST1 0x10
60#define AK09916_HXL 0x11
61#define AK09916_HXH 0x12
62#define AK09916_HYL 0x13
63#define AK09916_HYH 0x14
64#define AK09916_HZL 0x15
65#define AK09916_HZH 0x16
66#define AK09916_ST2 0x18
67#define AK09916_CNTL2 0x31
68#define AK09916_CNTL3 0x32
70#define SENSORS_GRAVITY_EARTH (9.80665F)
71#define SENSORS_DPS_TO_RADS (0.017453293F)
119 i2c_.
Init(i2c_config);
122 void Write(uint8_t *data, uint16_t size)
128 void Read(uint8_t *data, uint16_t size)
157 buffer[1] = value >> 8;
158 buffer[1] = value & 0xFF;
164 void ReadReg(uint8_t reg, uint8_t *buff, uint8_t size)
240 void Write(uint8_t *data, uint16_t size)
245 void Read(uint8_t *data, uint16_t size)
258 buffer[0] = reg & ~0x80;
272 buffer[0] = reg & ~0x80;
273 buffer[1] = value >> 8;
274 buffer[2] = value & 0xFF;
280 void ReadReg(uint8_t reg, uint8_t *buff, uint8_t size)
282 reg = uint8_t(reg | 0x80);
315template <
typename Transport>
510 float accel_scale = 1.0;
511 float gyro_scale = 1.0;
523 accel_scale = 16384.0;
525 accel_scale = 8192.0;
527 accel_scale = 4096.0;
529 accel_scale = 2048.0;
531 gyroX = rawGyroX / gyro_scale;
532 gyroY = rawGyroY / gyro_scale;
533 gyroZ = rawGyroZ / gyro_scale;
535 accX = rawAccX / accel_scale;
536 accY = rawAccY / accel_scale;
537 accZ = rawAccZ / accel_scale;
580 current_accel_range_ = new_accel_range;
626 current_gyro_range_ = new_gyro_range;
702 false, slv_addr, reg_addr, value);
728 return (uint8_t)
false;
735 return (uint8_t)
false;
741 return (uint8_t)
false;
747 return (uint8_t)
false;
758 return (uint8_t)
false;
768 return (uint8_t)
true;
778 const uint8_t numbytes
781 uint8_t buffer[numbytes];
784 rawAccX = buffer[0] << 8 | buffer[1];
785 rawAccY = buffer[2] << 8 | buffer[3];
786 rawAccZ = buffer[4] << 8 | buffer[5];
788 rawGyroX = buffer[6] << 8 | buffer[7];
789 rawGyroY = buffer[8] << 8 | buffer[9];
790 rawGyroZ = buffer[10] << 8 | buffer[11];
792 temperature = buffer[12] << 8 | buffer[13];
794 rawMagX = ((buffer[16] << 8)
795 | (buffer[15] & 0xFF));
796 rawMagY = ((buffer[18] << 8) | (buffer[17] & 0xFF));
797 rawMagZ = ((buffer[20] << 8) | (buffer[19] & 0xFF));
833 float GetTemp() {
return (temperature / 333.87) + 21.0; }
839 uint8_t
Read8(uint8_t reg) {
return transport_.Read8(reg); }
847 return transport_.Write8(reg, value);
856 return transport_.Write16(reg, value);
860 void ReadReg(uint8_t reg, uint8_t *buff, uint8_t size)
862 return transport_.ReadReg(reg, buff, size);
865 uint8_t
ReadBits(uint8_t reg, uint8_t bits, uint8_t shift)
867 uint8_t val =
Read8(reg);
869 return val & ((1 << (bits)) - 1);
872 void WriteBits(uint8_t reg, uint8_t data, uint8_t bits, uint8_t shift)
874 uint8_t val =
Read8(reg);
877 uint8_t mask = (1 << (bits)) - 1;
882 val |= data << shift;
959 Transport transport_;
961 uint16_t _sensorid_accel,
966 uint8_t current_accel_range_;
967 uint8_t current_gyro_range_;
Result Init(const Config &config)
Result ReceiveBlocking(uint16_t address, uint8_t *data, uint16_t size, uint32_t timeout)
Result TransmitBlocking(uint16_t address, uint8_t *data, uint16_t size, uint32_t timeout)
Device support for ICM20948 IMU sensor.
Definition icm20948.h:317
icm20948_accel_range_t GetAccelRange()
Definition icm20948.h:557
void SetAccelRange(icm20948_accel_range_t new_accel_range)
Definition icm20948.h:587
Result GetTransportError()
Definition icm20948.h:955
Result Init(Config config)
Definition icm20948.h:376
void ResetI2CMaster(void)
Definition icm20948.h:920
icm20948_accel_range_t
Definition icm20948.h:338
@ ICM20948_ACCEL_RANGE_8_G
Definition icm20948.h:341
@ ICM20948_ACCEL_RANGE_16_G
Definition icm20948.h:342
@ ICM20948_ACCEL_RANGE_2_G
Definition icm20948.h:339
@ ICM20948_ACCEL_RANGE_4_G
Definition icm20948.h:340
Result AuxI2CBusSetupFailed(void)
Definition icm20948.h:935
bool WriteMagRegister(uint8_t mag_reg_addr, uint8_t value)
Definition icm20948.h:498
void SetBank(uint8_t bank_number)
Definition icm20948.h:675
Icm20948()
Definition icm20948.h:319
uint8_t ReadAccelRange()
Definition icm20948.h:565
void Write16(uint8_t reg, uint16_t value)
Definition icm20948.h:854
ak09916_data_rate_t GetMagDataRate()
Definition icm20948.h:646
~Icm20948()
Definition icm20948.h:320
uint8_t GetMagId()
Definition icm20948.h:432
Icm20948Vect GetGyroVect()
Definition icm20948.h:813
bool SetMagDataRate(ak09916_data_rate_t rate)
Definition icm20948.h:656
void WriteBits(uint8_t reg, uint8_t data, uint8_t bits, uint8_t shift)
Definition icm20948.h:872
void SetGyroRange(icm20948_gyro_range_t new_gyro_range)
Definition icm20948.h:614
uint8_t ReadExternalRegister(uint8_t slv_addr, uint8_t reg_addr)
Definition icm20948.h:686
void Reset()
Definition icm20948.h:417
Icm20948Vect GetMagVect()
Definition icm20948.h:823
void Write8(uint8_t reg, uint8_t value)
Definition icm20948.h:845
bool WriteExternalRegister(uint8_t slv_addr, uint8_t reg_addr, uint8_t value)
Definition icm20948.h:699
Result ConfigureI2CMaster(void)
Definition icm20948.h:912
Result SetupMag()
Definition icm20948.h:438
icm20948_gyro_range_t
Definition icm20948.h:347
@ ICM20948_GYRO_RANGE_500_DPS
Definition icm20948.h:349
@ ICM20948_GYRO_RANGE_250_DPS
Definition icm20948.h:348
@ ICM20948_GYRO_RANGE_1000_DPS
Definition icm20948.h:350
@ ICM20948_GYRO_RANGE_2000_DPS
Definition icm20948.h:351
void WriteGyroRange(uint8_t new_gyro_range)
Definition icm20948.h:622
Result EnableI2CMaster(bool enable_i2c_master)
Definition icm20948.h:902
void SetAccelRateDivisor(uint16_t new_accel_divisor)
Definition icm20948.h:547
icm20948_gyro_range_t GetGyroRange()
Definition icm20948.h:606
ak09916_data_rate_t
Definition icm20948.h:356
@ AK09916_MAG_DATARATE_50_HZ
updates at 50Hz
Definition icm20948.h:363
@ AK09916_MAG_DATARATE_10_HZ
updates at 10Hz
Definition icm20948.h:361
@ AK09916_MAG_DATARATE_100_HZ
updates at 100Hz
Definition icm20948.h:364
@ AK09916_MAG_DATARATE_SHUTDOWN
Stops measurement updates.
Definition icm20948.h:357
@ AK09916_MAG_DATARATE_SINGLE
Definition icm20948.h:358
@ AK09916_MAG_DATARATE_20_HZ
updates at 20Hz
Definition icm20948.h:362
float GetTemp()
Definition icm20948.h:833
uint8_t ReadBits(uint8_t reg, uint8_t bits, uint8_t shift)
Definition icm20948.h:865
Icm20948Vect GetAccelVect()
Definition icm20948.h:803
uint8_t AuxillaryRegisterTransaction(bool read, uint8_t slv_addr, uint8_t reg_addr, uint8_t value)
Definition icm20948.h:711
void WriteAccelRange(uint8_t new_accel_range)
Definition icm20948.h:576
void SetGyroRateDivisor(uint8_t new_gyro_divisor)
Definition icm20948.h:596
void ScaleValues()
Definition icm20948.h:503
Result
Definition icm20948.h:368
@ OK
Definition icm20948.h:369
@ ERR
Definition icm20948.h:370
uint8_t Read8(uint8_t reg)
Definition icm20948.h:839
uint8_t ReadMagRegister(uint8_t mag_reg_addr)
Definition icm20948.h:493
void SetI2CBypass(bool bypass_i2c)
Definition icm20948.h:892
void ReadReg(uint8_t reg, uint8_t *buff, uint8_t size)
Definition icm20948.h:860
uint8_t ReadGyroRange()
Definition icm20948.h:634
void Process()
Definition icm20948.h:772
void Read(uint8_t *data, uint16_t size)
Definition icm20948.h:128
void Write8(uint8_t reg, uint8_t value)
Definition icm20948.h:138
void Write16(uint8_t reg, uint16_t value)
Definition icm20948.h:152
uint8_t Read8(uint8_t reg)
Definition icm20948.h:174
~Icm20948I2CTransport()
Definition icm20948.h:84
void Write(uint8_t *data, uint16_t size)
Definition icm20948.h:122
void Init(Config config)
Definition icm20948.h:107
void ReadReg(uint8_t reg, uint8_t *buff, uint8_t size)
Definition icm20948.h:164
Icm20948I2CTransport()
Definition icm20948.h:83
bool GetError()
Definition icm20948.h:181
Definition icm20948.h:198
void Write16(uint8_t reg, uint16_t value)
Definition icm20948.h:268
bool GetError()
Definition icm20948.h:299
Icm20948SpiTransport()
Definition icm20948.h:200
uint8_t Read8(uint8_t reg)
Definition icm20948.h:292
void Write(uint8_t *data, uint16_t size)
Definition icm20948.h:240
void Write8(uint8_t reg, uint8_t value)
Definition icm20948.h:254
void Read(uint8_t *data, uint16_t size)
Definition icm20948.h:245
void ReadReg(uint8_t reg, uint8_t *buff, uint8_t size)
Definition icm20948.h:280
~Icm20948SpiTransport()
Definition icm20948.h:201
void Init(Config config)
Definition icm20948.h:221
Result BlockingTransmit(uint8_t *buff, size_t size, uint32_t timeout=100)
Result BlockingReceive(uint8_t *buffer, uint16_t size, uint32_t timeout)
Result Init(const Config &config)
static void Delay(uint32_t delay_ms)
#define ICM20X_B0_USER_CTRL
User Control Reg. Includes I2C Master.
Definition icm20948.h:13
#define ICM20X_B0_I2C_MST_STATUS
Records if I2C master bus data is finished/*#end#*/.
Definition icm20948.h:18
#define ICM20X_B0_REG_INT_PIN_CFG
Interrupt config register.
Definition icm20948.h:15
#define ICM20X_B3_I2C_SLV0_REG
Sets register address for I2C master bus slave 0/*#end#*/.
Definition icm20948.h:38
#define ICM20X_B2_ACCEL_SMPLRT_DIV_1
Accel data rate divisor MSByte.
Definition icm20948.h:28
#define ICM20X_B2_GYRO_CONFIG_1
Gyro config for range setting.
Definition icm20948.h:27
#define ICM20X_B0_REG_BANK_SEL
register bank selection register
Definition icm20948.h:20
#define ICM20X_B0_ACCEL_XOUT_H
first byte of accel data
Definition icm20948.h:22
#define ICM20X_B3_I2C_SLV4_ADDR
Sets I2C address for I2C master bus slave 4/*#end#*/.
Definition icm20948.h:43
#define ICM20X_B3_I2C_SLV4_REG
Sets register address for I2C master bus slave 4/*#end#*/.
Definition icm20948.h:45
#define ICM20948_MAG_ID
The chip ID for the magnetometer.
Definition icm20948.h:54
#define SENSORS_DPS_TO_RADS
Definition icm20948.h:71
#define ICM20948_UT_PER_LSB
mag data LSB value (fixed)
Definition icm20948.h:56
#define ICM20X_B2_GYRO_SMPLRT_DIV
Gyroscope data rate divisor.
Definition icm20948.h:26
#define I2C_MASTER_RESETS_BEFORE_FAIL
The number of times to try resetting a stuck I2C master before giving up/*#end#*/.
Definition icm20948.h:6
#define ICM20948_I2CADDR_DEFAULT
ICM20948 default i2c address.
Definition icm20948.h:53
#define ICM20X_B3_I2C_SLV4_CTRL
Controls for I2C master bus slave 4.
Definition icm20948.h:47
#define ICM20948_CHIP_ID
ICM20948 default device id from WHOAMI.
Definition icm20948.h:51
#define ICM20X_B3_I2C_SLV4_DI
Sets I2C master bus slave 4 data in.
Definition icm20948.h:49
#define ICM20X_B2_ACCEL_CONFIG_1
Accel config for setting range.
Definition icm20948.h:30
#define ICM20X_B3_I2C_SLV4_DO
Sets I2C master bus slave 4 data out.
Definition icm20948.h:48
#define AK09916_CNTL2
Magnetometer.
Definition icm20948.h:67
#define ICM20X_B3_I2C_SLV0_ADDR
Sets I2C address for I2C master bus slave 0/*#end#*/.
Definition icm20948.h:36
#define NUM_FINISHED_CHECKS
How many times to poll I2C_SLV4_DONE before giving up and resetting/*#end#*/.
Definition icm20948.h:8
#define ICM20X_B0_WHOAMI
Chip ID register.
Definition icm20948.h:12
#define ICM20X_B3_I2C_MST_CTRL
I2C master bus config.
Definition icm20948.h:34
#define ICM20X_B3_I2C_SLV0_CTRL
Controls for I2C master bus slave 0.
Definition icm20948.h:40
#define SENSORS_GRAVITY_EARTH
Definition icm20948.h:70
#define ICM20X_B0_PWR_MGMT_1
primary power management register
Definition icm20948.h:21
Hardware defines and helpers for daisy field platform.
Definition index.h:2
@ PORTB
Definition daisy_core.h:246
@ PORTG
Definition daisy_core.h:251
dsy_gpio_pin scl
Definition i2c.h:59
Mode mode
Definition i2c.h:64
Speed speed
Definition i2c.h:63
dsy_gpio_pin sda
Definition i2c.h:60
struct daisy::I2CHandle::Config::@13 pin_config
Peripheral periph
Definition i2c.h:56
Peripheral
Definition i2c.h:39
Definition icm20948.h:323
Config()
Definition icm20948.h:326
Transport::Config transport_config
Definition icm20948.h:324
Definition icm20948.h:330
float y
Definition icm20948.h:332
float z
Definition icm20948.h:333
float x
Definition icm20948.h:331
I2CHandle::Config::Speed speed
Definition icm20948.h:89
Config()
Definition icm20948.h:95
Pin sda
Definition icm20948.h:91
I2CHandle::Config::Peripheral periph
Definition icm20948.h:88
uint8_t address
Definition icm20948.h:93
Pin scl
Definition icm20948.h:90
Definition icm20948.h:204
Pin miso
Definition icm20948.h:207
Pin sclk
Definition icm20948.h:206
Config()
Definition icm20948.h:211
SpiHandle::Config::Peripheral periph
Definition icm20948.h:205
Pin nss
Definition icm20948.h:209
Pin mosi
Definition icm20948.h:208
representation of hardware port/pin combination
Definition daisy_core.h:261
ClockPolarity clock_polarity
Definition spi.h:100
Peripheral periph
Definition spi.h:96
dsy_gpio_pin sclk
Definition spi.h:81
struct daisy::SpiHandle::Config::@16 pin_config
Mode mode
Definition spi.h:97
dsy_gpio_pin mosi
Definition spi.h:83
Peripheral
Definition spi.h:25
dsy_gpio_pin nss
Definition spi.h:84
ClockPhase clock_phase
Definition spi.h:101
BaudPrescaler baud_prescaler
Definition spi.h:103
dsy_gpio_pin miso
Definition spi.h:82
Direction direction
Definition spi.h:98