A mbed-os v5 driver for BM1422AGMV (3 axis magnetic sensor, made by Rohm).
Dependents: rohm-SensorShield-example mbed_blinky
BM1422AGMV.cpp@0:203311da9813, 2019-02-18 (annotated)
- 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?
User | Revision | Line number | New 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, ®, 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, ®, 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 | } |