Rodrigo Miguez / Mbed 2 deprecated i2c_acelerometro

Dependencies:   BLE_API mbed nRF51822 circular_buffer

Revision:
4:a743917cd04c
Parent:
3:80ceedd5ffac
Child:
5:d5dba5370918
diff -r 80ceedd5ffac -r a743917cd04c main.cpp
--- a/main.cpp	Mon Jan 18 16:26:04 2016 +0000
+++ b/main.cpp	Wed Jan 20 10:48:50 2016 +0000
@@ -8,60 +8,112 @@
 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;
     
-    i2c.frequency(400000);
+    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){
         
-        data_write[0] = 0x00;
+        pc.printf("-----------------------------------------\n");
+        
+        EN = 1; // ACTIVE Mode -> STANDBY Mode
+        
+        data_write[0] = 0x00; // Direccion del registro STATUS
         
         i2c.start();
         
-        i2c.write(0xAB, data_write, 1);
+         // 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
         
-        char data_read[7];
-        i2c.read(0xAA, 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;
         
-        if(ch0 < 0x00FF) //X 
+        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) //Y 
+        if(ch1 < 0x00FF) 
             led3 = 0;
         else
             led3 = 1;
         
+        // Z 
         int ch2 =(data_read[5] << 6) | data_read[6] >> 2;
         
-        if(ch2 < 0x00FF) //Z 
+        pc.printf("Z: %i\n", ch2);
+        
+        if(ch2 < 0x00FF) 
             led4 = 0;
         else
             led4 = 1;
             
-        /*led1 = 1;
-        led2 = 1;
-        led3 = 1;
-        led4 = 1;*/
             
+        i2c.read(0); // Enviamos un NACK (Espero)
         i2c.stop();
         
-        wait(0.2);
+        EN = 0; // SHUTDOWN Mode
+        
+        wait(0.1);
     }
     
     /*i2c.write(0xAA, data_write, 1);