summaryrefslogtreecommitdiff
path: root/bsp/lpc55sxx/Libraries/drivers/drv_mma8562.c
blob: f0a0a168d7f92546ad057aad37637e30ddcb5023 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/*
 * Copyright (c) 2006-2023, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2019-07-22     Magicoe      The first version for LPC55S6x
 */

#include <rthw.h>
#include <rtdevice.h>
#include <rtthread.h>

#include "rtconfig.h"
#include "drv_mma8562.h"

enum _mma8562_i2c_constants
{
    kMMA8562_ADDR = 0x1D,
    kMMA8562_ADDR_With_SAO_Set = kMMA8562_ADDR | 1
};

#define MMA8562_I2CBUS_NAME  "i2c4"

static struct rt_i2c_bus_device *mma8562_i2c_bus;

////////////////////////////////////////////////////////////////////////////////
// Code
////////////////////////////////////////////////////////////////////////////////


rt_err_t mma8562_read_reg(rt_uint8_t reg, rt_uint8_t len, rt_uint8_t *buf)
{
    struct rt_i2c_msg msgs[2];

    msgs[0].addr  = kMMA8562_ADDR;
    msgs[0].flags = RT_I2C_WR;
    msgs[0].buf   = &reg;
    msgs[0].len   = 1;

    msgs[1].addr  = kMMA8562_ADDR;
    msgs[1].flags = RT_I2C_RD;
    msgs[1].buf   = buf;
    msgs[1].len   = len;

    if (rt_i2c_transfer(mma8562_i2c_bus, msgs, 2) == 2)
    {
        return RT_EOK;
    }
    else
    {
        return -RT_ERROR;
    }
}

rt_err_t mma8562_write_reg(rt_uint8_t reg, rt_uint8_t data)
{
    rt_uint8_t buf[2];

    buf[0] = reg;
    buf[1] = data;

    if (rt_i2c_master_send(mma8562_i2c_bus, kMMA8562_ADDR, 0, buf ,2) == 2)
    {
        return RT_EOK;
    }
    else
    {
        return -RT_ERROR;
    }
}

#ifdef RT_USING_FINSH
#include <finsh.h>
#include <rtdevice.h>

void get_mma8562(uint8_t data)
{
    volatile acceleration_t accel;

    uint8_t ucVal1 = 0;
    uint8_t ucVal2 = 0;
    uint8_t ucStatus = 0;

    do {
       mma8562_read_reg(kMMA8562_STATUS, 1, &ucStatus);
    } while (!(ucStatus & 0x08));

    mma8562_read_reg(kMMA8562_OUT_X_MSB, 1, &ucVal1);
    mma8562_read_reg(kMMA8562_OUT_X_LSB, 1, &ucVal2);

    accel.x = ucVal1*256 +ucVal2;

    mma8562_read_reg(kMMA8562_OUT_Y_MSB, 1, &ucVal1);
    mma8562_read_reg(kMMA8562_OUT_Y_LSB, 1, &ucVal2);
    accel.y = ucVal1*256 +ucVal2;

    mma8562_read_reg(kMMA8562_OUT_Z_MSB, 1, &ucVal1);
    mma8562_read_reg(kMMA8562_OUT_Z_LSB, 1, &ucVal2);
    accel.z = ucVal1*256 +ucVal2;

    rt_kprintf("*** MMA8562 X %d, Y %d, Z %d\r\n", (accel.x), (accel.y), (accel.z) );
}
FINSH_FUNCTION_EXPORT(get_mma8562, get mma8562. e.g: get_mma8562(0))
#endif

int mma8562_hw_init(void)
{
    // Init the I2C port.
    // Should be init in startup
    uint8_t val = 0;

    mma8562_i2c_bus = rt_i2c_bus_device_find(MMA8562_I2CBUS_NAME);  /*  */

    // Read WHO_AM_I register.
    mma8562_read_reg(kMMA8562_WHO_AM_I, 1, &val);
    if (val != kMMA8562_WHO_AM_I_Device_ID)
    {
        rt_kprintf("MMA8562: Unexpected result from WHO_AM_I (0x%02x)\n", val);
        return RT_ERROR;
    }

    /*  please refer to the "example FXOS8700CQ Driver Code" in FXOS8700 datasheet. */
    /*  write 0000 0000 = 0x00 to accelerometer control register 1 */
    /*  standby */
    /*  [7-1] = 0000 000 */
    /*  [0]: active=0 */
    val = 0;
    mma8562_write_reg( kMMA8562_CTRL_REG1, val);

    /*  write 0000 0001= 0x01 to XYZ_DATA_CFG register */
    /*  [7]: reserved */
    /*  [6]: reserved */
    /*  [5]: reserved */
    /*  [4]: hpf_out=0 */
    /*  [3]: reserved */
    /*  [2]: reserved */
    /*  [1-0]: fs=01 for accelerometer range of +/-4g range with 0.488mg/LSB */
    /*  databyte = 0x01; */
    val = 0x01;
    mma8562_write_reg(kMMA8562_XYZ_DATA_CFG, val);

    /*  write 0000 1101 = 0x0D to accelerometer control register 1 */
    /*  [7-6]: aslp_rate=00 */
    /*  [5-3]: dr=001 for 200Hz data rate (when in hybrid mode) */
    /*  [2]: lnoise=1 for low noise mode */
    /*  [1]: f_read=0 for normal 16 bit reads */
    /*  [0]: active=1 to take the part out of standby and enable sampling */
    /*   databyte = 0x0D; */
    val = 0x0D;
    mma8562_write_reg(kMMA8562_CTRL_REG1, val);

    return 0;
}

INIT_DEVICE_EXPORT(mma8562_hw_init);


////////////////////////////////////////////////////////////////////////////////
// EOF
////////////////////////////////////////////////////////////////////////////////