A mbed-os v5 driver for KX224-1053 (3 axis accelerometer, made by Rohm).
Dependents: rohm-SensorShield-example mbed_blinky
KX224.cpp@1:b226b04d2c21, 2019-02-27 (annotated)
- Committer:
- MACRUM
- Date:
- Wed Feb 27 04:43:05 2019 +0000
- Revision:
- 1:b226b04d2c21
- Parent:
- 0:c447f35ff54a
Disable debug print by default
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Ren Boting | 0:c447f35ff54a | 1 | /***************************************************************************** |
Ren Boting | 0:c447f35ff54a | 2 | KX224_I2C.cpp |
Ren Boting | 0:c447f35ff54a | 3 | |
Ren Boting | 0:c447f35ff54a | 4 | Copyright (c) 2017 ROHM Co.,Ltd. |
Ren Boting | 0:c447f35ff54a | 5 | |
Ren Boting | 0:c447f35ff54a | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy |
Ren Boting | 0:c447f35ff54a | 7 | of this software and associated documentation files (the "Software"), to deal |
Ren Boting | 0:c447f35ff54a | 8 | in the Software without restriction, including without limitation the rights |
Ren Boting | 0:c447f35ff54a | 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
Ren Boting | 0:c447f35ff54a | 10 | copies of the Software, and to permit persons to whom the Software is |
Ren Boting | 0:c447f35ff54a | 11 | furnished to do so, subject to the following conditions: |
Ren Boting | 0:c447f35ff54a | 12 | |
Ren Boting | 0:c447f35ff54a | 13 | The above copyright notice and this permission notice shall be included in |
Ren Boting | 0:c447f35ff54a | 14 | all copies or substantial portions of the Software. |
Ren Boting | 0:c447f35ff54a | 15 | |
Ren Boting | 0:c447f35ff54a | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
Ren Boting | 0:c447f35ff54a | 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
Ren Boting | 0:c447f35ff54a | 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
Ren Boting | 0:c447f35ff54a | 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
Ren Boting | 0:c447f35ff54a | 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
Ren Boting | 0:c447f35ff54a | 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
Ren Boting | 0:c447f35ff54a | 22 | THE SOFTWARE. |
Ren Boting | 0:c447f35ff54a | 23 | * |
Ren Boting | 0:c447f35ff54a | 24 | * KX224-1053 3 axis accelerometer library |
Ren Boting | 0:c447f35ff54a | 25 | * |
Ren Boting | 0:c447f35ff54a | 26 | * @modified by Ren Boting |
Ren Boting | 0:c447f35ff54a | 27 | * @version 1.0 |
Ren Boting | 0:c447f35ff54a | 28 | * @date 18-February-2019 |
Ren Boting | 0:c447f35ff54a | 29 | * |
Ren Boting | 0:c447f35ff54a | 30 | * Library for "KX224-1053 3 axis accelerometer library" |
Ren Boting | 0:c447f35ff54a | 31 | * https://www.rohm.co.jp/sensor-shield-support/accelerometer |
Ren Boting | 0:c447f35ff54a | 32 | * |
Ren Boting | 0:c447f35ff54a | 33 | */ |
Ren Boting | 0:c447f35ff54a | 34 | #include "KX224.h" |
Ren Boting | 0:c447f35ff54a | 35 | |
Ren Boting | 0:c447f35ff54a | 36 | KX224::KX224(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr), _g_sens(4096) |
Ren Boting | 0:c447f35ff54a | 37 | { |
Ren Boting | 0:c447f35ff54a | 38 | } |
Ren Boting | 0:c447f35ff54a | 39 | |
Ren Boting | 0:c447f35ff54a | 40 | KX224::~KX224() |
Ren Boting | 0:c447f35ff54a | 41 | { |
Ren Boting | 0:c447f35ff54a | 42 | } |
Ren Boting | 0:c447f35ff54a | 43 | |
Ren Boting | 0:c447f35ff54a | 44 | uint8_t KX224::initialize(void) |
Ren Boting | 0:c447f35ff54a | 45 | { |
Ren Boting | 0:c447f35ff54a | 46 | char reg ; |
Ren Boting | 0:c447f35ff54a | 47 | uint16_t gsel; |
Ren Boting | 0:c447f35ff54a | 48 | |
Ren Boting | 0:c447f35ff54a | 49 | read(KX224_WHO_AM_I, ®, sizeof(reg)); |
Ren Boting | 0:c447f35ff54a | 50 | DEBUG_PRINT("\r\nKX224_WHO_AMI Register Value = 0x%x\r\n", reg); |
Ren Boting | 0:c447f35ff54a | 51 | |
Ren Boting | 0:c447f35ff54a | 52 | if (reg != KX224_WAI_VAL) { |
Ren Boting | 0:c447f35ff54a | 53 | DEBUG_PRINT("\nCan't find KX224\r\n"); |
Ren Boting | 0:c447f35ff54a | 54 | return 1; |
Ren Boting | 0:c447f35ff54a | 55 | } |
Ren Boting | 0:c447f35ff54a | 56 | |
Ren Boting | 0:c447f35ff54a | 57 | reg = KX224_CNTL1_VAL; |
Ren Boting | 0:c447f35ff54a | 58 | write(KX224_CNTL1, ®); |
Ren Boting | 0:c447f35ff54a | 59 | |
Ren Boting | 0:c447f35ff54a | 60 | reg = KX224_ODCNTL_VAL; |
Ren Boting | 0:c447f35ff54a | 61 | write(KX224_ODCNTL, ®); |
Ren Boting | 0:c447f35ff54a | 62 | |
Ren Boting | 0:c447f35ff54a | 63 | read(KX224_CNTL1, ®, sizeof(reg)); |
Ren Boting | 0:c447f35ff54a | 64 | gsel = reg & KX224_CNTL1_GSELMASK; |
Ren Boting | 0:c447f35ff54a | 65 | |
Ren Boting | 0:c447f35ff54a | 66 | reg |= KX224_CNTL1_PC1; |
Ren Boting | 0:c447f35ff54a | 67 | write(KX224_CNTL1, ®); |
Ren Boting | 0:c447f35ff54a | 68 | |
Ren Boting | 0:c447f35ff54a | 69 | switch(gsel) { |
Ren Boting | 0:c447f35ff54a | 70 | case KX224_CNTL1_GSEL_8G : |
Ren Boting | 0:c447f35ff54a | 71 | // (Equivalent counts) / (Range) = (32768 / 8) |
Ren Boting | 0:c447f35ff54a | 72 | _g_sens = 4096; |
Ren Boting | 0:c447f35ff54a | 73 | break; |
Ren Boting | 0:c447f35ff54a | 74 | |
Ren Boting | 0:c447f35ff54a | 75 | case KX224_CNTL1_GSEL_16G : |
Ren Boting | 0:c447f35ff54a | 76 | // (Equivalent counts) / (Range) = (32768 / 16) |
Ren Boting | 0:c447f35ff54a | 77 | _g_sens = 2048; |
Ren Boting | 0:c447f35ff54a | 78 | break; |
Ren Boting | 0:c447f35ff54a | 79 | |
Ren Boting | 0:c447f35ff54a | 80 | case KX224_CNTL1_GSEL_32G : |
Ren Boting | 0:c447f35ff54a | 81 | // (Equivalent counts) / (Range) = (32768 / 32) |
Ren Boting | 0:c447f35ff54a | 82 | _g_sens = 1024; |
Ren Boting | 0:c447f35ff54a | 83 | break; |
Ren Boting | 0:c447f35ff54a | 84 | |
Ren Boting | 0:c447f35ff54a | 85 | default: |
Ren Boting | 0:c447f35ff54a | 86 | DEBUG_PRINT("\r!!! rgsel value (0x%x) is invalid\r", gsel); |
Ren Boting | 0:c447f35ff54a | 87 | return 2; |
Ren Boting | 0:c447f35ff54a | 88 | } |
Ren Boting | 0:c447f35ff54a | 89 | return 0; |
Ren Boting | 0:c447f35ff54a | 90 | } |
Ren Boting | 0:c447f35ff54a | 91 | |
Ren Boting | 0:c447f35ff54a | 92 | void KX224::get_val(float *data) |
Ren Boting | 0:c447f35ff54a | 93 | { |
Ren Boting | 0:c447f35ff54a | 94 | char val[6]; |
Ren Boting | 0:c447f35ff54a | 95 | uint16_t acc[3]; |
Ren Boting | 0:c447f35ff54a | 96 | // get raw value |
Ren Boting | 0:c447f35ff54a | 97 | read(KX224_XOUT_L, &val[0], 6); |
Ren Boting | 0:c447f35ff54a | 98 | acc[0] = ((int16_t)val[1] << 8) | (int16_t)(val[0]); |
Ren Boting | 0:c447f35ff54a | 99 | acc[1] = ((int16_t)val[3] << 8) | (int16_t)(val[2]); |
Ren Boting | 0:c447f35ff54a | 100 | acc[2] = ((int16_t)val[5] << 8) | (int16_t)(val[4]); |
Ren Boting | 0:c447f35ff54a | 101 | |
Ren Boting | 0:c447f35ff54a | 102 | // Convert LSB to g |
Ren Boting | 0:c447f35ff54a | 103 | data[0] = (float)acc[0] / _g_sens; |
Ren Boting | 0:c447f35ff54a | 104 | data[1] = (float)acc[1] / _g_sens; |
Ren Boting | 0:c447f35ff54a | 105 | data[2] = (float)acc[2] / _g_sens; |
Ren Boting | 0:c447f35ff54a | 106 | } |
Ren Boting | 0:c447f35ff54a | 107 | |
Ren Boting | 0:c447f35ff54a | 108 | void KX224::write(uint8_t memory_address, char *data) |
Ren Boting | 0:c447f35ff54a | 109 | { |
Ren Boting | 0:c447f35ff54a | 110 | char tmp[3]; |
Ren Boting | 0:c447f35ff54a | 111 | tmp[0]=memory_address; |
Ren Boting | 0:c447f35ff54a | 112 | tmp[1]=*data; |
Ren Boting | 0:c447f35ff54a | 113 | m_i2c.write(m_addr, &tmp[0], 2); |
Ren Boting | 0:c447f35ff54a | 114 | } |
Ren Boting | 0:c447f35ff54a | 115 | |
Ren Boting | 0:c447f35ff54a | 116 | void KX224::read(uint8_t memory_address, char *data, int size) |
Ren Boting | 0:c447f35ff54a | 117 | { |
Ren Boting | 0:c447f35ff54a | 118 | char t[1] = {memory_address}; |
Ren Boting | 0:c447f35ff54a | 119 | m_i2c.write(m_addr, t, 1, true); |
Ren Boting | 0:c447f35ff54a | 120 | m_i2c.read(m_addr, data, size); |
Ren Boting | 0:c447f35ff54a | 121 | } |