Projet_S5 / Mbed 2 deprecated Repo_Noeud_Mobile_refactor

Dependencies:   mbed-rtos mbed

Fork of Repo_Noeud_Mobile by Projet_S5

Accelerometer/MMA8452Q.cpp

Committer:
groygirard
Date:
2015-03-05
Revision:
8:51f6c8f59449
Parent:
6:fd1bf5563299
Child:
11:a9fbf205233a
Child:
12:ebb08773dbdb

File content as of revision 8:51f6c8f59449:

#include "MMA8452Q.h"
Serial a_pc(USBTX, USBRX);
I2C i2c(p28, p27);

Accel::Accel()
{
    nack = 1;
}

uint8_t Accel::get_WHO_AM_I()
{
    char cmd = WHO_AM_I;
    char data[2] = {0x00, 0x00};
    nack = i2c.write(W_ADDR, &cmd, 1, true); //send a request to WHO_AM_I register, we expect 0x2a, or 42, the answer to the universe.
    wait(SPEED);
    if (!nack) {
        nack = i2c.read(R_ADDR, data, 1);
        wait(SPEED);
        if (!nack) {
            if(data[0] == CTRL_REG1) {
                a_pc.printf("I2C communication succes: Module MMA8452 online\r\n");
            }
        } else {
            a_pc.printf("I2C communication fail: Module MMA8452 offline\r\n");
            a_pc.getc();
            return 1;
        }
    }
    return 0;
}

uint8_t Accel::set_CTRL_REG1()
{
    char cmd[2];
    cmd[0] = CTRL_REG1;
    cmd[1] = 0x01; //byte to enable the device

    nack = i2c.write(W_ADDR, cmd, 2, true); //comand to enable the device
    wait(SPEED);
    if (!nack) {
        a_pc.printf("I2C communication success: CTRL_REG1 configured\r\n");
    } else {
        a_pc.printf("I2C communication fail: Could not configure CTRL_REG1\r\n");
        a_pc.getc();
        return 1;
    }
    return 0;
}

uint8_t Accel::init_MMA8452()
{
    Serial a_pc(USBTX, USBRX);
    a_pc.printf("\r\n\r\n================================================\r\n\r\n");
    a_pc.printf("Accelerometer I2C interface: Initialization sequence starting...\r\n");

    get_WHO_AM_I();
    set_CTRL_REG1();

    return 0;
}

uint8_t Accel::get_axis_values()
{
    char cmd = X_OUT_MSB;
    char data[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    accel_t a_data;

    nack = i2c.write(W_ADDR, &cmd, 1, true); //request the data in the 6 out registers
    wait(SPEED);
    if (!nack) {
        nack = i2c.read(R_ADDR, data, 6); //receive the data from the 6 out registers
        wait(SPEED);
        a_data.x = (data[0] << 4) + (data[1] >> 4);
        a_data.y = (data[2] << 4) + (data[3] >> 4);
        a_data.z = (data[4] << 4) + (data[5] >> 4);

        if (!nack) {
            a_pc.printf("I2C Communication success: Data received %#X; %#X; %#X;\r\n", a_data.x, a_data.y, a_data.z);
        }
    } else {
        a_pc.printf("I2C communcation fail: Command %#X at address %#X\n", cmd, W_ADDR);
        a_pc.getc();
        return 1;
    }
    return 0;
}