A mbed-os v5 driver for BM1422AGMV (3 axis magnetic sensor, made by Rohm).

Dependents:   rohm-SensorShield-example mbed_blinky

Committer:
Ren Boting
Date:
Mon Feb 18 13:00:55 2019 +0900
Revision:
0:203311da9813
Init commit for mbed os v5 driver, Rohm BM1422AGMV sensor.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ren Boting 0:203311da9813 1 /* Copyright (c) 2015 ARM Ltd., MIT License
Ren Boting 0:203311da9813 2 *
Ren Boting 0:203311da9813 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
Ren Boting 0:203311da9813 4 * and associated documentation files (the "Software"), to deal in the Software without
Ren Boting 0:203311da9813 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
Ren Boting 0:203311da9813 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
Ren Boting 0:203311da9813 7 * Software is furnished to do so, subject to the following conditions:
Ren Boting 0:203311da9813 8 *
Ren Boting 0:203311da9813 9 * The above copyright notice and this permission notice shall be included in all copies or
Ren Boting 0:203311da9813 10 * substantial portions of the Software.
Ren Boting 0:203311da9813 11 *
Ren Boting 0:203311da9813 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
Ren Boting 0:203311da9813 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Ren Boting 0:203311da9813 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
Ren Boting 0:203311da9813 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Ren Boting 0:203311da9813 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Ren Boting 0:203311da9813 17 *
Ren Boting 0:203311da9813 18 */
Ren Boting 0:203311da9813 19
Ren Boting 0:203311da9813 20 #include "mbed.h"
Ren Boting 0:203311da9813 21 #include "BM1422AGMV.h"
Ren Boting 0:203311da9813 22
Ren Boting 0:203311da9813 23 BM1422AGMV::BM1422AGMV(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr)
Ren Boting 0:203311da9813 24 {
Ren Boting 0:203311da9813 25 initialize();
Ren Boting 0:203311da9813 26 }
Ren Boting 0:203311da9813 27
Ren Boting 0:203311da9813 28 BM1422AGMV::BM1422AGMV(I2C &i2c_obj, int addr) : m_i2c(i2c_obj), m_addr(addr)
Ren Boting 0:203311da9813 29 {
Ren Boting 0:203311da9813 30 initialize();
Ren Boting 0:203311da9813 31 }
Ren Boting 0:203311da9813 32
Ren Boting 0:203311da9813 33 BM1422AGMV::~BM1422AGMV()
Ren Boting 0:203311da9813 34 {
Ren Boting 0:203311da9813 35 /* do nothing */
Ren Boting 0:203311da9813 36 }
Ren Boting 0:203311da9813 37
Ren Boting 0:203311da9813 38 void BM1422AGMV::initialize(void)
Ren Boting 0:203311da9813 39 {
Ren Boting 0:203311da9813 40 uint8_t reg;
Ren Boting 0:203311da9813 41 uint8_t buf[3];
Ren Boting 0:203311da9813 42
Ren Boting 0:203311da9813 43 DEBUG_PRINT("BM1422AGMV init started\n\r");
Ren Boting 0:203311da9813 44
Ren Boting 0:203311da9813 45 readRegs(BM1422AGMV_WIA, &reg, 1);
Ren Boting 0:203311da9813 46
Ren Boting 0:203311da9813 47 if ( reg != BM1422AGMV_WIA_VAL) {
Ren Boting 0:203311da9813 48 DEBUG_PRINT("BM1422AGMV initialization error. (WAI %d, not %d)\n\r", buf, BM1422AGMV_WIA);
Ren Boting 0:203311da9813 49 DEBUG_PRINT("Trying to config anyway, in case there is some compatible sensor connected.\n\r");
Ren Boting 0:203311da9813 50 }
Ren Boting 0:203311da9813 51
Ren Boting 0:203311da9813 52 // Step1
Ren Boting 0:203311da9813 53 buf[0] = BM1422AGMV_CNTL1;
Ren Boting 0:203311da9813 54 buf[1] = BM1422AGMV_CNTL1_VAL;
Ren Boting 0:203311da9813 55 writeRegs(buf, 2);
Ren Boting 0:203311da9813 56
Ren Boting 0:203311da9813 57 // Check 12bit or 14bit
Ren Boting 0:203311da9813 58 reg = (BM1422AGMV_CNTL1_VAL & BM1422AGMV_CNTL1_OUT_BIT);
Ren Boting 0:203311da9813 59 if (reg == BM1422AGMV_CNTL1_OUT_BIT) {
Ren Boting 0:203311da9813 60 _sens = BM1422AGMV_14BIT_SENS;
Ren Boting 0:203311da9813 61 } else {
Ren Boting 0:203311da9813 62 _sens = BM1422AGMV_12BIT_SENS;
Ren Boting 0:203311da9813 63 }
Ren Boting 0:203311da9813 64
Ren Boting 0:203311da9813 65 wait(1);
Ren Boting 0:203311da9813 66
Ren Boting 0:203311da9813 67 buf[0] = BM1422AGMV_CNTL4;
Ren Boting 0:203311da9813 68 buf[1] = (BM1422AGMV_CNTL4_VAL >> 8) & 0xFF;
Ren Boting 0:203311da9813 69 buf[2] = (BM1422AGMV_CNTL4_VAL & 0xFF);
Ren Boting 0:203311da9813 70 writeRegs(buf, 3);
Ren Boting 0:203311da9813 71
Ren Boting 0:203311da9813 72 // Step2
Ren Boting 0:203311da9813 73 buf[0] = BM1422AGMV_CNTL2;
Ren Boting 0:203311da9813 74 buf[1] = BM1422AGMV_CNTL2_VAL;
Ren Boting 0:203311da9813 75 writeRegs(buf, 2);
Ren Boting 0:203311da9813 76
Ren Boting 0:203311da9813 77 // Step3
Ren Boting 0:203311da9813 78
Ren Boting 0:203311da9813 79 // Option
Ren Boting 0:203311da9813 80 buf[0] = BM1422AGMV_AVE_A;
Ren Boting 0:203311da9813 81 buf[1] = BM1422AGMV_AVE_A_VAL;
Ren Boting 0:203311da9813 82 writeRegs(buf, 2);
Ren Boting 0:203311da9813 83 }
Ren Boting 0:203311da9813 84
Ren Boting 0:203311da9813 85 void BM1422AGMV::get_rawval(unsigned char *data)
Ren Boting 0:203311da9813 86 {
Ren Boting 0:203311da9813 87 uint8_t reg;
Ren Boting 0:203311da9813 88 uint8_t buf[2];
Ren Boting 0:203311da9813 89
Ren Boting 0:203311da9813 90 // Step 4
Ren Boting 0:203311da9813 91 buf[0] = BM1422AGMV_CNTL3;
Ren Boting 0:203311da9813 92 buf[1] = BM1422AGMV_CNTL3_VAL;
Ren Boting 0:203311da9813 93 writeRegs(buf, 2);
Ren Boting 0:203311da9813 94
Ren Boting 0:203311da9813 95 while(1) {
Ren Boting 0:203311da9813 96 readRegs(BM1422AGMV_STA1, &reg, 1);
Ren Boting 0:203311da9813 97 if ( (reg>>6) == 1) {
Ren Boting 0:203311da9813 98 break;
Ren Boting 0:203311da9813 99 }
Ren Boting 0:203311da9813 100 wait_ms(100);
Ren Boting 0:203311da9813 101 }
Ren Boting 0:203311da9813 102
Ren Boting 0:203311da9813 103 readRegs(BM1422AGMV_DATAX, data, 6);
Ren Boting 0:203311da9813 104 }
Ren Boting 0:203311da9813 105
Ren Boting 0:203311da9813 106 void BM1422AGMV::get_val(float *data)
Ren Boting 0:203311da9813 107 {
Ren Boting 0:203311da9813 108 uint8_t val[6];
Ren Boting 0:203311da9813 109 int16_t mag[3];
Ren Boting 0:203311da9813 110
Ren Boting 0:203311da9813 111 get_rawval(val);
Ren Boting 0:203311da9813 112
Ren Boting 0:203311da9813 113 mag[0] = ((int16_t)val[1] << 8) | (int16_t)(val[0]);
Ren Boting 0:203311da9813 114 mag[1] = ((int16_t)val[3] << 8) | (int16_t)(val[2]);
Ren Boting 0:203311da9813 115 mag[2] = ((int16_t)val[5] << 8) | (int16_t)(val[4]);
Ren Boting 0:203311da9813 116
Ren Boting 0:203311da9813 117 convert_uT(mag, data);
Ren Boting 0:203311da9813 118 }
Ren Boting 0:203311da9813 119
Ren Boting 0:203311da9813 120 void BM1422AGMV::convert_uT(int16_t *rawdata, float *data)
Ren Boting 0:203311da9813 121 {
Ren Boting 0:203311da9813 122 // LSB to uT
Ren Boting 0:203311da9813 123 data[0] = (float)rawdata[0] / _sens;
Ren Boting 0:203311da9813 124 data[1] = (float)rawdata[1] / _sens;
Ren Boting 0:203311da9813 125 data[2] = (float)rawdata[2] / _sens;
Ren Boting 0:203311da9813 126 }
Ren Boting 0:203311da9813 127
Ren Boting 0:203311da9813 128 void BM1422AGMV::readRegs(int addr, uint8_t * data, int len)
Ren Boting 0:203311da9813 129 {
Ren Boting 0:203311da9813 130 int read_nok;
Ren Boting 0:203311da9813 131 char t[1] = {addr};
Ren Boting 0:203311da9813 132
Ren Boting 0:203311da9813 133 m_i2c.write(m_addr, t, 1, true);
Ren Boting 0:203311da9813 134 read_nok = m_i2c.read(m_addr, (char *)data, len);
Ren Boting 0:203311da9813 135 if (read_nok){
Ren Boting 0:203311da9813 136 DEBUG_PRINT("Read fail\n\r");
Ren Boting 0:203311da9813 137 }
Ren Boting 0:203311da9813 138 }
Ren Boting 0:203311da9813 139
Ren Boting 0:203311da9813 140 void BM1422AGMV::writeRegs(uint8_t * data, int len)
Ren Boting 0:203311da9813 141 {
Ren Boting 0:203311da9813 142 m_i2c.write(m_addr, (char *)data, len);
Ren Boting 0:203311da9813 143 }