Rodrigo Miguez / Mbed 2 deprecated i2c_acelerometro

Dependencies:   BLE_API mbed nRF51822 circular_buffer

main.cpp

Committer:
agufal
Date:
2016-01-20
Revision:
4:a743917cd04c
Parent:
3:80ceedd5ffac
Child:
5:d5dba5370918

File content as of revision 4:a743917cd04c:

#include "mbed.h"

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

DigitalOut EN(p16);

/*
 * Direccion del acelerometro: 0x55
 * Como la direccion ocupa 7 bits + bit de R/W, en teoria seria 0xAA o 0xAB,
 * pero no estamos seguros de si esa transformacion se hace directamente al
 * llamar a write() y read() o lo tenemos que poner nosotros a mano.
 *
 * 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 la señal de Stop
 */
int main(){
    
    const char WRITE_ADDRESS = 0xAA; // 0xAA
    const char READ_ADDRESS = 0xAA; // 0xAB, 0x1D
    
    char data_write[2];
    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;
    
    pc.printf("Starting\n");
    
    i2c.frequency(100000); // Min: 0kHz, Max: 400kHz
    
    /* 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
     */
    EN = 0; // SHUTDOWN Mode
    wait(0.1);
   
    while(1){
        
        pc.printf("-----------------------------------------\n");
        
        EN = 1; // ACTIVE Mode -> STANDBY Mode
        
        data_write[0] = 0x00; // Direccion del registro STATUS
        
        i2c.start();
        
         // Como con write ya mandamos la direccion, hacemos los dos primeros pasos a la vez.
        i2c.write(WRITE_ADDRESS, data_write, 1, true);
    
        i2c.read(READ_ADDRESS, data_read, 7, true); // El true indica repeated start condition
        
        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: %i\n", ch0);
        
        if (ch0 < 0x00FF)
            led2 = 0;
        else
            led2 = 1;
            
        // Y 
        int ch1 =(data_read[3] << 6) | data_read[4] >> 2;
        
        pc.printf("Y: %i\n", ch1);
            
        if(ch1 < 0x00FF) 
            led3 = 0;
        else
            led3 = 1;
        
        // Z 
        int ch2 =(data_read[5] << 6) | data_read[6] >> 2;
        
        pc.printf("Z: %i\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);
    }
    
    /*i2c.write(0xAA, data_write, 1);
    
    char data_read[7];
    i2c.read(0xAB, data_read, 7, true);
    
    if(data_read[0] == 0)
        led1 = 0;
    
    if(data_read[1] == 0)
        led2 = 0;
        
    if(data_read[2] == 0)
        led3 = 0;
        
    if(data_read[3] == 0)
        led4 = 0;
    
    i2c.stop();*/
    
    //data_write[0] = 0x01;
    //data_write[1] = 0x00;
    //i2c.start();
    //int status = i2c.write(addr,data_write, 2);
    
    /*if (status != 0) { // Error
        while (1) {
            
        }
    } */
 
    //bool haPasado = false;
 
    //i2c.frequency(200000);
 
    /*while(1){
      
        i2c.start();
        
        wait(0.5);
      
        int status = i2c.read(addr, data_read, 3);
        
        if (status == 0)
            haPasado = true;
        
        if (!haPasado)
            led4 = !led4;
            
        i2c.stop();
      
    }*/
      //i2c.start();
      /*data_write[0] = 0x00;
      i2c.write(addr, data_write, 1,1);
      
      i2c.read(addr, data_read, 2,0);
      
      int ch0 =(data_read[0]<<8) | data_read[1];
      
      if (ch0 < 0x001FF){
             
             led1 = 0;
             led2 = 1;
             led3 = 1;
        }
        else if (ch0 > 0x001FF && ch0 < 0x0FFF) {
            
            led1 = 1;
            led2 = 0;
            led3 = 1;
            
        }
        else {
            led1 = 1;
            led2 = 1;
            led3 = 0;   
        }
      
      //pc.printf("channel 0: %x,%x \n", data_read[0], data_read[1]);
      
      wait(0.5);
      
      //i2c.stop();
    }    */   
}