Rodrigo Miguez / Mbed 2 deprecated i2c_acelerometro

Dependencies:   BLE_API mbed nRF51822 circular_buffer

main.cpp

Committer:
agufal
Date:
2016-01-21
Revision:
6:fa74a43cae81
Parent:
5:d5dba5370918
Child:
7:e4f89c858e61

File content as of revision 6:fa74a43cae81:

/*
 * Esto es para la placa Xtrinsic-Sense Board de element14, mas
 * concretamente para el acelerometro MMA8491Q
 */
#include "mbed.h"

I2C i2c(p30, p7);
Serial pc(p9, p11);
//LEDS
DigitalOut led2(LED2);
DigitalOut led1(LED1);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

/***************************************************************************** 
 * El acelerometro tiene una maquina de estados basandose en enable
 * Pagina 11
 * http://www.element14.com/community/servlet/JiveServlet/previewBody/54565-102-1-273580/Datasheet_MMA8491Q.pdf
 *****************************************************************************/
DigitalOut EN(p16);

/*
 * Direccion del acelerometro: 0x55 << 1 = 0xAA
 *
 * Segun el datasheet los pasos son:
 *   - Mandar un Start Condition, direccion 0x55 y bit de R/W a 0 para indicar escritura. El esclavo manda un ACK
 *   - Transmitir la direccion del registro a leer. El esclavo manda un ACK
 *   - Transmitir un Repeated Start Condition y luego "direccionar?" al acelerometro con bit de R/W a 1 (lectura del registro)
 *   - El esclavo manda un ACK y transmite los datos del registro indicado
 *   - Transmitir un NACK y la señal de Stop
 *
 * Los rangos de datos para cada eje son:
 *
 *                     |   Range ±8g
 *     14-bit Data     |   (1 mg/count)
 *  ___________________|_______________
 *  01 1111 1111 1111  |   +8.000g
 *  01 1111 1111 1110  |   +7.998g
 *        ...          |     ...
 *  00 0000 0000 0000  |    0.000g
 *  11 1111 1111 1111  |   -0.001g
 *        ...          |     ...
 *  10 0000 0000 0001  |   -7.998g
 *  10 0000 0000 0000  |   -8.000g
 */
int main(){
    
  /*  
    0x3FFF  -0.001g
    0x2001  -7.998g
    0x2000  -8.000g
    
    0x1FFF   8.000g
    0x1FFE   7.998g
    0x0000   0.000g
    
    */
    
    const char ACCEL_ADDRESS = 0xAA;
    
    char data_write[1];
    char data_read[7];
    
    data_read[0] = 0;
    data_read[1] = 0;
    data_read[2] = 0;
    data_read[3] = 0;
    data_read[4] = 0;
    data_read[5] = 0;
    data_read[6] = 0; 
    
    led1 = 1;
    led2 = 1;
    led3 = 1;
    led4 = 1;
    
    i2c.frequency(100000); // Min: 0kHz, Max: 400kHz

    EN = 0; // SHUTDOWN Mode
    wait(0.1);
   
    while(1){
        
        pc.printf("-----------------------------------------\n");
        
        EN = 1; // ACTIVE Mode -> STANDBY Mode
        
/*****************************************************************************
 * Direccion del registro STATUS
 * 
 * El registro status cambia diferentes bits para informar de si hay
 * nuevos datos y estan disponibles (1 - Si, 0 - No):
 *
 * ZYXDR : Hay nuevos datos en alguno de los tres ejes
 * ZDR : Hay datos para el eje Z
 * YDR : Hay datos para el eje Y
 * XDR : Hay datos para el eje X
 * 
 * El formato del byte es:
 * 0 0 0 0 ZYXDR ZDR YDR XDR
 *****************************************************************************/
        data_write[0] = 0x00;
        
        i2c.start();
        
         // Como con write ya mandamos la direccion, hacemos los dos primeros pasos a la vez.
        i2c.write(ACCEL_ADDRESS, data_write, 1, true);
    
        i2c.read(ACCEL_ADDRESS, data_read, 7, true);
        
        pc.printf("Status: %i\n", data_read[0]);
        
        if(data_read[0] == 0)
            led1 = 0;
        else
            led1 = 1;
        
        // X 
        int ch0 = (data_read[1] << 6) | data_read[2] >> 2;
        
        pc.printf("X: %x\n", ch0);
        
        if (ch0 < 0x00FF)
            led2 = 0;
        else
            led2 = 1;
            
        // Y 
        int ch1 = (data_read[3] << 6) | data_read[4] >> 2;
        
        pc.printf("Y: %x\n", ch1);
            
        if(ch1 < 0x00FF) 
            led3 = 0;
        else
            led3 = 1;
        
        // Z 
        int ch2 = (data_read[5] << 6) | data_read[6] >> 2;
        
        pc.printf("Z: %x\n", ch2);
        
        if(ch2 < 0x00FF) 
            led4 = 0;
        else
            led4 = 1;
            
        i2c.read(0); // Enviamos un NACK (Espero)
        i2c.stop();
        
        EN = 0; // SHUTDOWN Mode
        
        wait(0.1);
        
    }
}