Program for testing development of BMI160 Library
Dependencies: BMI160 max32630fthr mbed
Diff: main.cpp
- Revision:
- 0:0db9a7ed2e63
- Child:
- 1:a3fa54415b4e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Dec 07 19:51:44 2016 +0000 @@ -0,0 +1,194 @@ +/********************************************************************** +* Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES +* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +* OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of Maxim Integrated +* Products, Inc. shall not be used except as stated in the Maxim Integrated +* Products, Inc. Branding Policy. +* +* The mere transfer of this software does not imply any licenses +* of trade secrets, proprietary technology, copyrights, patents, +* trademarks, maskwork rights, or any other form of intellectual +* property whatsoever. Maxim Integrated Products, Inc. retains all +* ownership rights. +**********************************************************************/ + + +#include "mbed.h" +#include "SDFileSystem.h" +#include "max32630fthr.h" +#include "mbed-dev/targets/TARGET_Maxim/TARGET_MAX32630/mxc/adc.h" +#include "mbed-dev/targets/TARGET_Maxim/TARGET_MAX32630/mxc/mxc_errors.h" + +#include "bmi160.h" + +void dumpPmicRegisters(MAX32630FTHR &pegasus); +int readBatteryRaw(uint16_t *data); +float getBatteryVolts(uint16_t data); +void dumpImuRegisters(BMI160 &imu); +void printRegister(BMI160 &imu, BMI160::Registers reg); +void printBlock(BMI160 &imu, BMI160::Registers startReg, BMI160::Registers stopReg, uint8_t *buff); + + +int main() +{ + MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3); + pegasus.init(); + //connect battery to monitor pin AIN_0 + pegasus.max14690.monSet(MAX14690::MON_BAT, MAX14690::MON_DIV1); + dumpPmicRegisters(pegasus); + + DigitalOut rLED(LED1, LED_OFF); + DigitalOut gLED(LED2, LED_OFF); + DigitalOut bLED(LED3, LED_ON); + + BMI160 imu(pegasus.i2c, BMI160::I2C_ADRS_SDO_LO); + dumpImuRegisters(imu); + + uint16_t battRawData; + uint32_t loopCnt = 0; + + while(1) + { + if(loopCnt == 0) + { + if(readBatteryRaw(&battRawData) == E_NO_ERROR) + { + printf("Battery voltage = %05.3f\n\n", getBatteryVolts(battRawData)); + } + else + { + printf("Battery voltage = Overflow\n\n"); + } + } + + wait(1.0); + bLED = !bLED; + loopCnt++; + if(loopCnt >= 15) + { + loopCnt = 0; + } + } +} + + +//***************************************************************************** +void dumpPmicRegisters(MAX32630FTHR &pegasus) +{ + char reg_val[32]; + size_t len = sizeof(reg_val); + + if(pegasus.max14690.readAllReg(reg_val, len) == 0) + { + for(uint8_t idx = 0; idx < len; idx++) + { + printf("PMIC Register 0x%02x = 0x%02x\n", idx, reg_val[idx]); + } + printf("\n"); + } + else + { + printf("Failed to read PMIC registers\n\n"); + } + +} + + +//***************************************************************************** +void dumpImuRegisters(BMI160 &imu) +{ + //dumps registers defined by datasheet + uint8_t buff[0x30]; + + printRegister(imu, BMI160::CHIP_ID); + printBlock(imu, BMI160::ERR_REG,BMI160::FIFO_DATA, buff); + printBlock(imu, BMI160::ACC_CONF, BMI160::FIFO_CONFIG_1, buff); + printBlock(imu, BMI160::MAG_IF_0, BMI160::SELF_TEST, buff); + printBlock(imu, BMI160::NV_CONF, BMI160::STEP_CONF_1, buff); + printRegister(imu, BMI160::CMD); + printf("\n"); +} + + +//***************************************************************************** +void printRegister(BMI160 &imu, BMI160::Registers reg) +{ + uint8_t data; + if(imu.readRegister(reg, &data) == BMI160::NO_ERROR) + { + printf("IMU Register 0x%02x = 0x%02x\n", reg, data); + } + else + { + printf("Failed to read register\n"); + } +} + + +//***************************************************************************** +void printBlock(BMI160 &imu, BMI160::Registers startReg, BMI160::Registers stopReg, uint8_t *buff) +{ + uint8_t numBytes = ((stopReg - startReg) + 1); + uint8_t offset = static_cast<uint8_t>(startReg); + + if(imu.readBlock(startReg, stopReg, buff) == BMI160::NO_ERROR) + { + for(uint8_t idx = offset; idx < (numBytes + offset); idx++) + { + printf("IMU Register 0x%02x = 0x%02x\n", idx, buff[idx - offset]); + } + } + else + { + printf("Failed to read block\n"); + } +} + + +//***************************************************************************** +int readBatteryRaw(uint16_t *data) +{ + static bool init = false; + int rtnVal = E_NULL_PTR; + + if(!init) + { + if(ADC_Init() == E_NO_ERROR) + { + init = true; + } + } + + if(init) + { + ADC_StartConvert(ADC_CH_0_DIV_5, 1, 0); + rtnVal = ADC_GetData(data); + } + + return rtnVal; +} + + +//***************************************************************************** +float getBatteryVolts(uint16_t data) +{ + return((((0x03FF & data) * 6.0F)/1023.0F)); +}