Path: blob/master/libraries/AP_Baro/examples/ICM20789/ICM20789.cpp
9692 views
/*1minimal test program for ICM20789 baro with IMU on SPI and baro on I2C2*/34#include <AP_HAL/AP_HAL.h>5#include <AP_HAL/I2CDevice.h>6#include <AP_Baro/AP_Baro.h>7#include <AP_BoardConfig/AP_BoardConfig.h>8#include <stdio.h>910const AP_HAL::HAL& hal = AP_HAL::get_HAL();1112#ifdef HAL_INS_MPU60x0_NAME13static AP_HAL::Device *i2c_dev;14static AP_HAL::Device *spi_dev;15static AP_HAL::Device *dev;16#endif // defined(HAL_INS_MPU60x0_NAME)1718// SPI registers19#define MPUREG_WHOAMI 0x7520#define MPUREG_USER_CTRL 0x6A21#define MPUREG_PWR_MGMT_1 0x6B2223#define MPUREG_INT_PIN_CFG 0x3724# define BIT_BYPASS_EN 0x0225# define BIT_INT_RD_CLEAR 0x10 // clear the interrupt when any read occurs26# define BIT_LATCH_INT_EN 0x20 // latch data ready pin2728#define BIT_USER_CTRL_I2C_MST_EN 0x20 // Enable MPU to act as the I2C Master to external slave sensors29#define BIT_PWR_MGMT_1_DEVICE_RESET 0x80 // reset entire device30#define BIT_USER_CTRL_I2C_IF_DIS 0x10 // Disable primary I2C interface and enable hal.spi->interface31#define BIT_PWR_MGMT_1_CLK_XGYRO 0x01 // PLL with X axis gyroscope reference32#define BIT_PWR_MGMT_1_CLK_ZGYRO 0x03 // PLL with Z axis gyroscope reference3334// baro commands35#define CMD_SOFT_RESET 0x805D36#define CMD_READ_ID 0xEFC83738void setup(void);39void loop(void);404142#ifdef HAL_INS_MPU60x0_NAME43static void spi_init()44{45// SPI reads have flag 0x80 set46spi_dev->set_read_flag(0x80);4748// run the SPI bus at low speed49spi_dev->set_speed(AP_HAL::Device::SPEED_LOW);5051uint8_t whoami = 0;52uint8_t v;5354spi_dev->write_register(0x6B, 0x01);55spi_dev->write_register(0x6B, 0x01);5657hal.scheduler->delay(1);58spi_dev->write_register(0x6A, 0x10);59spi_dev->write_register(0x6B, 0x41);6061hal.scheduler->delay(1);62spi_dev->write_register(0x6C, 0x3f);63spi_dev->write_register(0xF5, 0x00);64spi_dev->write_register(0x19, 0x09);65spi_dev->write_register(0xEA, 0x00);66spi_dev->write_register(0x6B, 0x01);6768hal.scheduler->delay(1);69spi_dev->write_register(0x6A, 0x10);70spi_dev->write_register(0x6B, 0x41);7172hal.scheduler->delay(1);73spi_dev->write_register(0x6B, 0x01);7475hal.scheduler->delay(1);76spi_dev->write_register(0x23, 0x00);77spi_dev->write_register(0x6B, 0x41);7879hal.scheduler->delay(1);80spi_dev->write_register(0x1D, 0xC0);81spi_dev->write_register(0x6B, 0x01);8283hal.scheduler->delay(1);84spi_dev->write_register(0x1A, 0xC0);85spi_dev->write_register(0x6B, 0x41);8687hal.scheduler->delay(1);88spi_dev->write_register(0x38, 0x01);8990spi_dev->read_registers(0x6A, &v, 1);91printf("reg 0x6A=0x%02x\n", v);92spi_dev->read_registers(0x6B, &v, 1);93printf("reg 0x6B=0x%02x\n", v);9495hal.scheduler->delay(1);96spi_dev->write_register(0x6A, 0x10);97spi_dev->write_register(0x6B, 0x41);9899hal.scheduler->delay(1);100spi_dev->write_register(0x6B, 0x01);101102hal.scheduler->delay(1);103spi_dev->write_register(0x23, 0x00);104spi_dev->write_register(0x6B, 0x41);105106hal.scheduler->delay(1);107spi_dev->write_register(0x6B, 0x41);108spi_dev->write_register(0x6C, 0x3f);109spi_dev->write_register(0x6B, 0x41);110111spi_dev->read_registers(0x6A, &v, 1);112printf("reg 0x6A=0x%02x\n", v);113spi_dev->write_register(0x6B, 0x01);114115hal.scheduler->delay(1);116spi_dev->write_register(0x6A, 0x10);117spi_dev->write_register(0x6B, 0x41);118119hal.scheduler->delay(1);120spi_dev->write_register(0x6B, 0x01);121122hal.scheduler->delay(1);123spi_dev->write_register(0x23, 0x00);124spi_dev->write_register(0x6B, 0x41);125126hal.scheduler->delay(1);127spi_dev->read_registers(0x6A, &v, 1);128printf("reg 0x6A=0x%02x\n", v);129spi_dev->write_register(0x6B, 0x01);130131hal.scheduler->delay(1);132spi_dev->write_register(0x6A, 0x10);133spi_dev->write_register(0x6B, 0x41);134135hal.scheduler->delay(1);136spi_dev->write_register(0x6B, 0x01);137138hal.scheduler->delay(1);139spi_dev->write_register(0x23, 0x00);140spi_dev->write_register(0x6B, 0x41);141142hal.scheduler->delay(1);143spi_dev->write_register(0x6B, 0x41);144spi_dev->write_register(0x6C, 0x3f);145spi_dev->write_register(0x6B, 0x41);146147spi_dev->read_registers(0x6A, &v, 1);148printf("reg 0x6A=0x%02x\n", v);149spi_dev->write_register(0x6B, 0x01);150151hal.scheduler->delay(1);152spi_dev->write_register(0x6A, 0x10);153spi_dev->write_register(0x6B, 0x41);154155hal.scheduler->delay(1);156spi_dev->write_register(0x6B, 0x01);157158hal.scheduler->delay(1);159spi_dev->write_register(0x23, 0x00);160spi_dev->write_register(0x6B, 0x41);161162// print the WHOAMI163spi_dev->read_registers(MPUREG_WHOAMI, &whoami, 1);164printf("20789 SPI whoami: 0x%02x\n", whoami);165166// wait for sensor to settle167hal.scheduler->delay(100);168169// dump registers170printf("ICM20789 registers\n");171#if 0172for (uint8_t reg = 0; reg<0x80; reg++) {173v=0;174spi_dev->read_registers(reg, &v, 1);175printf("%02x:%02x ", (unsigned)reg, (unsigned)v);176if ((reg+1) % 16 == 0) {177printf("\n");178}179}180printf("\n");181#endif182183spi_dev->get_semaphore()->give();184}185#endif186187#ifdef HAL_INS_MPU60x0_NAME188/*189send a 16 bit command to the baro190*/191static bool send_cmd16(uint16_t cmd)192{193uint8_t cmd_b[2] = { uint8_t(cmd >> 8), uint8_t(cmd & 0xFF) };194return i2c_dev->transfer(cmd_b, 2, nullptr, 0);195}196197/*198read baro calibration data199*/200static bool read_calibration_data(void)201{202// setup for OTP read203const uint8_t cmd[5] = { 0xC5, 0x95, 0x00, 0x66, 0x9C };204if (!i2c_dev->transfer(cmd, sizeof(cmd), nullptr, 0)) {205return false;206}207for (uint8_t i=0; i<4; i++) {208if (!send_cmd16(0xC7F7)) {209return false;210}211uint8_t d[3];212if (!i2c_dev->transfer(nullptr, 0, d, sizeof(d))) {213return false;214}215uint16_t c = int16_t((d[0]<<8) | d[1]);216printf("sensor_constants[%u]=%d\n", i, c);217}218return true;219}220221// initialise baro on i2c222static void i2c_init(void)223{224i2c_dev->get_semaphore()->take_blocking();225226if (send_cmd16(CMD_READ_ID)) {227printf("ICM20789: read ID ******\n");228uint8_t id[3] {};229if (!i2c_dev->transfer(nullptr, 0, id, 3)) {230printf("ICM20789: failed to read ID\n");231}232printf("ICM20789: ID %02x %02x %02x\n", id[0], id[1], id[2]);233} else {234printf("ICM20789 read ID failed\n");235}236237if (send_cmd16(CMD_SOFT_RESET)) {238printf("ICM20789: reset OK ************###########*********!!!!!!!!\n");239} else {240printf("ICM20789 baro reset failed\n");241}242hal.scheduler->delay(1);243244245read_calibration_data();246247i2c_dev->get_semaphore()->give();248249printf("checking baro\n");250dev->get_semaphore()->take_blocking();251252uint8_t regs[3] = { 0xC0, 0xC1, 0xC2 };253for (uint8_t i=0; i<ARRAY_SIZE(regs); i++) {254uint8_t v = 0;255dev->read_registers(regs[i], &v, 1);256printf("0x%02x : 0x%02x\n", regs[i], v);257}258dev->get_semaphore()->give();259}260#endif261262void setup()263{264printf("ICM20789 test\n");265266AP_BoardConfig{}.init();267268hal.scheduler->delay(1000);269270#ifdef HAL_INS_MPU60x0_NAME271spi_dev = hal.spi->get_device_ptr(HAL_INS_MPU60x0_NAME);272273spi_dev->get_semaphore()->take_blocking();274275i2c_dev = hal.i2c_mgr->get_device_ptr(1, 0x63);276dev = hal.i2c_mgr->get_device_ptr(1, 0x29);277278while (true) {279spi_init();280i2c_init();281hal.scheduler->delay(1000);282}283#else284while (true) {285printf("HAL_INS_MPU60x0_NAME not defined for this board\n");286hal.scheduler->delay(1000);287}288#endif289}290291292void loop()293{294}295296AP_HAL_MAIN();297298299