Simple demo of BMI160 Library

Dependencies:   BMI160 max32630fthr mbed

Fork of MAX32630FTHR_IMU_Test by Justin Jordan

Committer:
j3
Date:
Wed Dec 07 19:51:44 2016 +0000
Revision:
0:0db9a7ed2e63
Child:
1:a3fa54415b4e
Init Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j3 0:0db9a7ed2e63 1 /**********************************************************************
j3 0:0db9a7ed2e63 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
j3 0:0db9a7ed2e63 3 *
j3 0:0db9a7ed2e63 4 * Permission is hereby granted, free of charge, to any person obtaining a
j3 0:0db9a7ed2e63 5 * copy of this software and associated documentation files (the "Software"),
j3 0:0db9a7ed2e63 6 * to deal in the Software without restriction, including without limitation
j3 0:0db9a7ed2e63 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
j3 0:0db9a7ed2e63 8 * and/or sell copies of the Software, and to permit persons to whom the
j3 0:0db9a7ed2e63 9 * Software is furnished to do so, subject to the following conditions:
j3 0:0db9a7ed2e63 10 *
j3 0:0db9a7ed2e63 11 * The above copyright notice and this permission notice shall be included
j3 0:0db9a7ed2e63 12 * in all copies or substantial portions of the Software.
j3 0:0db9a7ed2e63 13 *
j3 0:0db9a7ed2e63 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
j3 0:0db9a7ed2e63 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
j3 0:0db9a7ed2e63 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
j3 0:0db9a7ed2e63 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
j3 0:0db9a7ed2e63 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
j3 0:0db9a7ed2e63 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
j3 0:0db9a7ed2e63 20 * OTHER DEALINGS IN THE SOFTWARE.
j3 0:0db9a7ed2e63 21 *
j3 0:0db9a7ed2e63 22 * Except as contained in this notice, the name of Maxim Integrated
j3 0:0db9a7ed2e63 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
j3 0:0db9a7ed2e63 24 * Products, Inc. Branding Policy.
j3 0:0db9a7ed2e63 25 *
j3 0:0db9a7ed2e63 26 * The mere transfer of this software does not imply any licenses
j3 0:0db9a7ed2e63 27 * of trade secrets, proprietary technology, copyrights, patents,
j3 0:0db9a7ed2e63 28 * trademarks, maskwork rights, or any other form of intellectual
j3 0:0db9a7ed2e63 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
j3 0:0db9a7ed2e63 30 * ownership rights.
j3 0:0db9a7ed2e63 31 **********************************************************************/
j3 0:0db9a7ed2e63 32
j3 0:0db9a7ed2e63 33
j3 0:0db9a7ed2e63 34 #include "mbed.h"
j3 0:0db9a7ed2e63 35 #include "SDFileSystem.h"
j3 0:0db9a7ed2e63 36 #include "max32630fthr.h"
j3 0:0db9a7ed2e63 37 #include "mbed-dev/targets/TARGET_Maxim/TARGET_MAX32630/mxc/adc.h"
j3 0:0db9a7ed2e63 38 #include "mbed-dev/targets/TARGET_Maxim/TARGET_MAX32630/mxc/mxc_errors.h"
j3 0:0db9a7ed2e63 39
j3 0:0db9a7ed2e63 40 #include "bmi160.h"
j3 0:0db9a7ed2e63 41
j3 0:0db9a7ed2e63 42 void dumpPmicRegisters(MAX32630FTHR &pegasus);
j3 0:0db9a7ed2e63 43 int readBatteryRaw(uint16_t *data);
j3 0:0db9a7ed2e63 44 float getBatteryVolts(uint16_t data);
j3 0:0db9a7ed2e63 45 void dumpImuRegisters(BMI160 &imu);
j3 0:0db9a7ed2e63 46 void printRegister(BMI160 &imu, BMI160::Registers reg);
j3 0:0db9a7ed2e63 47 void printBlock(BMI160 &imu, BMI160::Registers startReg, BMI160::Registers stopReg, uint8_t *buff);
j3 0:0db9a7ed2e63 48
j3 0:0db9a7ed2e63 49
j3 0:0db9a7ed2e63 50 int main()
j3 0:0db9a7ed2e63 51 {
j3 0:0db9a7ed2e63 52 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
j3 0:0db9a7ed2e63 53 pegasus.init();
j3 0:0db9a7ed2e63 54 //connect battery to monitor pin AIN_0
j3 0:0db9a7ed2e63 55 pegasus.max14690.monSet(MAX14690::MON_BAT, MAX14690::MON_DIV1);
j3 0:0db9a7ed2e63 56 dumpPmicRegisters(pegasus);
j3 0:0db9a7ed2e63 57
j3 0:0db9a7ed2e63 58 DigitalOut rLED(LED1, LED_OFF);
j3 0:0db9a7ed2e63 59 DigitalOut gLED(LED2, LED_OFF);
j3 0:0db9a7ed2e63 60 DigitalOut bLED(LED3, LED_ON);
j3 0:0db9a7ed2e63 61
j3 0:0db9a7ed2e63 62 BMI160 imu(pegasus.i2c, BMI160::I2C_ADRS_SDO_LO);
j3 0:0db9a7ed2e63 63 dumpImuRegisters(imu);
j3 0:0db9a7ed2e63 64
j3 0:0db9a7ed2e63 65 uint16_t battRawData;
j3 0:0db9a7ed2e63 66 uint32_t loopCnt = 0;
j3 0:0db9a7ed2e63 67
j3 0:0db9a7ed2e63 68 while(1)
j3 0:0db9a7ed2e63 69 {
j3 0:0db9a7ed2e63 70 if(loopCnt == 0)
j3 0:0db9a7ed2e63 71 {
j3 0:0db9a7ed2e63 72 if(readBatteryRaw(&battRawData) == E_NO_ERROR)
j3 0:0db9a7ed2e63 73 {
j3 0:0db9a7ed2e63 74 printf("Battery voltage = %05.3f\n\n", getBatteryVolts(battRawData));
j3 0:0db9a7ed2e63 75 }
j3 0:0db9a7ed2e63 76 else
j3 0:0db9a7ed2e63 77 {
j3 0:0db9a7ed2e63 78 printf("Battery voltage = Overflow\n\n");
j3 0:0db9a7ed2e63 79 }
j3 0:0db9a7ed2e63 80 }
j3 0:0db9a7ed2e63 81
j3 0:0db9a7ed2e63 82 wait(1.0);
j3 0:0db9a7ed2e63 83 bLED = !bLED;
j3 0:0db9a7ed2e63 84 loopCnt++;
j3 0:0db9a7ed2e63 85 if(loopCnt >= 15)
j3 0:0db9a7ed2e63 86 {
j3 0:0db9a7ed2e63 87 loopCnt = 0;
j3 0:0db9a7ed2e63 88 }
j3 0:0db9a7ed2e63 89 }
j3 0:0db9a7ed2e63 90 }
j3 0:0db9a7ed2e63 91
j3 0:0db9a7ed2e63 92
j3 0:0db9a7ed2e63 93 //*****************************************************************************
j3 0:0db9a7ed2e63 94 void dumpPmicRegisters(MAX32630FTHR &pegasus)
j3 0:0db9a7ed2e63 95 {
j3 0:0db9a7ed2e63 96 char reg_val[32];
j3 0:0db9a7ed2e63 97 size_t len = sizeof(reg_val);
j3 0:0db9a7ed2e63 98
j3 0:0db9a7ed2e63 99 if(pegasus.max14690.readAllReg(reg_val, len) == 0)
j3 0:0db9a7ed2e63 100 {
j3 0:0db9a7ed2e63 101 for(uint8_t idx = 0; idx < len; idx++)
j3 0:0db9a7ed2e63 102 {
j3 0:0db9a7ed2e63 103 printf("PMIC Register 0x%02x = 0x%02x\n", idx, reg_val[idx]);
j3 0:0db9a7ed2e63 104 }
j3 0:0db9a7ed2e63 105 printf("\n");
j3 0:0db9a7ed2e63 106 }
j3 0:0db9a7ed2e63 107 else
j3 0:0db9a7ed2e63 108 {
j3 0:0db9a7ed2e63 109 printf("Failed to read PMIC registers\n\n");
j3 0:0db9a7ed2e63 110 }
j3 0:0db9a7ed2e63 111
j3 0:0db9a7ed2e63 112 }
j3 0:0db9a7ed2e63 113
j3 0:0db9a7ed2e63 114
j3 0:0db9a7ed2e63 115 //*****************************************************************************
j3 0:0db9a7ed2e63 116 void dumpImuRegisters(BMI160 &imu)
j3 0:0db9a7ed2e63 117 {
j3 0:0db9a7ed2e63 118 //dumps registers defined by datasheet
j3 0:0db9a7ed2e63 119 uint8_t buff[0x30];
j3 0:0db9a7ed2e63 120
j3 0:0db9a7ed2e63 121 printRegister(imu, BMI160::CHIP_ID);
j3 0:0db9a7ed2e63 122 printBlock(imu, BMI160::ERR_REG,BMI160::FIFO_DATA, buff);
j3 0:0db9a7ed2e63 123 printBlock(imu, BMI160::ACC_CONF, BMI160::FIFO_CONFIG_1, buff);
j3 0:0db9a7ed2e63 124 printBlock(imu, BMI160::MAG_IF_0, BMI160::SELF_TEST, buff);
j3 0:0db9a7ed2e63 125 printBlock(imu, BMI160::NV_CONF, BMI160::STEP_CONF_1, buff);
j3 0:0db9a7ed2e63 126 printRegister(imu, BMI160::CMD);
j3 0:0db9a7ed2e63 127 printf("\n");
j3 0:0db9a7ed2e63 128 }
j3 0:0db9a7ed2e63 129
j3 0:0db9a7ed2e63 130
j3 0:0db9a7ed2e63 131 //*****************************************************************************
j3 0:0db9a7ed2e63 132 void printRegister(BMI160 &imu, BMI160::Registers reg)
j3 0:0db9a7ed2e63 133 {
j3 0:0db9a7ed2e63 134 uint8_t data;
j3 0:0db9a7ed2e63 135 if(imu.readRegister(reg, &data) == BMI160::NO_ERROR)
j3 0:0db9a7ed2e63 136 {
j3 0:0db9a7ed2e63 137 printf("IMU Register 0x%02x = 0x%02x\n", reg, data);
j3 0:0db9a7ed2e63 138 }
j3 0:0db9a7ed2e63 139 else
j3 0:0db9a7ed2e63 140 {
j3 0:0db9a7ed2e63 141 printf("Failed to read register\n");
j3 0:0db9a7ed2e63 142 }
j3 0:0db9a7ed2e63 143 }
j3 0:0db9a7ed2e63 144
j3 0:0db9a7ed2e63 145
j3 0:0db9a7ed2e63 146 //*****************************************************************************
j3 0:0db9a7ed2e63 147 void printBlock(BMI160 &imu, BMI160::Registers startReg, BMI160::Registers stopReg, uint8_t *buff)
j3 0:0db9a7ed2e63 148 {
j3 0:0db9a7ed2e63 149 uint8_t numBytes = ((stopReg - startReg) + 1);
j3 0:0db9a7ed2e63 150 uint8_t offset = static_cast<uint8_t>(startReg);
j3 0:0db9a7ed2e63 151
j3 0:0db9a7ed2e63 152 if(imu.readBlock(startReg, stopReg, buff) == BMI160::NO_ERROR)
j3 0:0db9a7ed2e63 153 {
j3 0:0db9a7ed2e63 154 for(uint8_t idx = offset; idx < (numBytes + offset); idx++)
j3 0:0db9a7ed2e63 155 {
j3 0:0db9a7ed2e63 156 printf("IMU Register 0x%02x = 0x%02x\n", idx, buff[idx - offset]);
j3 0:0db9a7ed2e63 157 }
j3 0:0db9a7ed2e63 158 }
j3 0:0db9a7ed2e63 159 else
j3 0:0db9a7ed2e63 160 {
j3 0:0db9a7ed2e63 161 printf("Failed to read block\n");
j3 0:0db9a7ed2e63 162 }
j3 0:0db9a7ed2e63 163 }
j3 0:0db9a7ed2e63 164
j3 0:0db9a7ed2e63 165
j3 0:0db9a7ed2e63 166 //*****************************************************************************
j3 0:0db9a7ed2e63 167 int readBatteryRaw(uint16_t *data)
j3 0:0db9a7ed2e63 168 {
j3 0:0db9a7ed2e63 169 static bool init = false;
j3 0:0db9a7ed2e63 170 int rtnVal = E_NULL_PTR;
j3 0:0db9a7ed2e63 171
j3 0:0db9a7ed2e63 172 if(!init)
j3 0:0db9a7ed2e63 173 {
j3 0:0db9a7ed2e63 174 if(ADC_Init() == E_NO_ERROR)
j3 0:0db9a7ed2e63 175 {
j3 0:0db9a7ed2e63 176 init = true;
j3 0:0db9a7ed2e63 177 }
j3 0:0db9a7ed2e63 178 }
j3 0:0db9a7ed2e63 179
j3 0:0db9a7ed2e63 180 if(init)
j3 0:0db9a7ed2e63 181 {
j3 0:0db9a7ed2e63 182 ADC_StartConvert(ADC_CH_0_DIV_5, 1, 0);
j3 0:0db9a7ed2e63 183 rtnVal = ADC_GetData(data);
j3 0:0db9a7ed2e63 184 }
j3 0:0db9a7ed2e63 185
j3 0:0db9a7ed2e63 186 return rtnVal;
j3 0:0db9a7ed2e63 187 }
j3 0:0db9a7ed2e63 188
j3 0:0db9a7ed2e63 189
j3 0:0db9a7ed2e63 190 //*****************************************************************************
j3 0:0db9a7ed2e63 191 float getBatteryVolts(uint16_t data)
j3 0:0db9a7ed2e63 192 {
j3 0:0db9a7ed2e63 193 return((((0x03FF & data) * 6.0F)/1023.0F));
j3 0:0db9a7ed2e63 194 }