Questa è la versione deifinitiva del codice del Lab2_I2C e del lab3_SPI (nell'altra c'era un commento sbagliato è do dovuto ripubblicarla)

Dependencies:   MMA8451Q mbed

Fork of Codice_Lab2_I2C_Lab3_SPI by SDI 2014/2015

Revision:
1:944348c50dd6
Parent:
0:4317f4b1a4b3
Child:
2:53521a18c3de
--- a/main.cpp	Wed Jan 14 11:29:52 2015 +0000
+++ b/main.cpp	Thu Jan 15 21:45:52 2015 +0000
@@ -41,11 +41,17 @@
 //FREAD=1 // attiva modalità fast read, per campionare con 8bit ed avere risoluzione di 8 bit
 //ACTIVE=0 // setta l'avccelerometro in standby per settare anche altri  registri
 
+char FF_MT_CFG = 0x15; //registera addres del FF_MT_CFG (Frefall/Motionn Configuration register (Read/Write)
+char INT_SOURCE = 0x0C;// register adderess del INT_SOURCE ( System Interrupt Status Register)
+// if SRC_FF_MT=1 indicates that the frefall/motion function interrupt is active.
+// This bit is asserted whenever "EA" bit i the FF_MT_SRC register is asserted adn the FF_MT interrupt has 
+// been enabled
+char FF_MT_SRC = 0x16; // register address del FF_MT_SRC (Frefall/Motion Source Register
 
 
 int main(void)
 {
-    
+    printf("inizio \n");
     //impostazione dei registri con scrittura Single Byte Write
     
     // setta impostazioni su CTRL_REG_1
@@ -70,8 +76,16 @@
     i2c.stop();    
 
     // setta impostazioni su CTRL_REG_3
-    data=0x00; //imposta data con le impostazioni del CTRL_REG_3 attineti alle gestioni dell'interupt in modalità sleep
+    data=0x08; //imposta data con le impostazioni del CTRL_REG_3 attineti alle gestioni dell'interupt in modalità sleep
     // vedi data-sheet
+    //Bit 7-> FIFO GATE   = 0 
+    //Bit 6-> WAKE_TRANS  = 0
+    //Bit 5-> WAKE_LNDRPT = 0
+    //Bit 4-> WAKE_PULSE  = 0         
+    //Bit 3-> WAKE_FF_MT  = 1 Frefall/Motion function interrupt can wake up !
+    //Bit 2-> don't care
+    //Bit 1-> IPOL  = 0
+    //Bit 0-> PP_OD = 0
     i2c.start(); // dai lo start
     i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
     i2c.write(CTRL_REG_3); // scrivi l'indirizzo del CTRL_REG_3
@@ -79,32 +93,32 @@
     i2c.stop();    
 
     // setta impostazioni su CTRL_REG_4
-    data=0x00; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt
+    data=0x04; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt
+    // vedi data-sheet
     // vedi data-sheet
+    //Bit 7-> IN_EN_ASLP    = 0 ; se = 1 Auto-SLEEP/WAKE interrupt enabled
+    //Bit 6-> INT_EN_FIFO   = 0
+    //Bit 5-> INT_EN_TRANS  = 0
+    //Bit 4-> INT_EN_LNDPRT = 0         
+    //Bit 3-> INT_EN_PULSE  = 0  
+    //Bit 2-> INT_EN_FF_MT  = 1 Freefall/Motion interrupt enabled
+    //Bit 1-> don't care    = 0
+    //Bit 0-> INT_EN_DRDY   = 0
     i2c.start(); // dai lo start
     i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
     i2c.write(CTRL_REG_4); // scrivi l'indirizzo del CTRL_REG_4
     i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_4
     i2c.stop();    
 
-  // setta impostazioni su CTRL_REG_5
-    data=0x00; //imposta data con le impostazioni del CTRL_REG_5 attineti alle gestioni dell'interupt in modalità sleep
+  // setta impostazioni su CTRL_REG_5 (NON UTILIZZATO!)
+    data=0x00; //imposta data con le impostazioni del CTRL_REG_5 attineti alle gestioni dell'interupt nei pin
     // vedi data-sheet
     i2c.start(); // dai lo start
     i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
     i2c.write(CTRL_REG_5); // scrivi l'indirizzo del CTRL_REG_5
     i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_5
     i2c.stop();   
-    
-    // setta impostazioni su CTRL_REG_5
-    data=0x00; //imposta data con le impostazioni del CTRL_REG_5 attineti alle gestioni dell'interupt in modalità sleep
-    // vedi data-sheet
-    i2c.start(); // dai lo start
-    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
-    i2c.write(CTRL_REG_5); // scrivi l'indirizzo del CTRL_REG_5
-    i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_5
-    i2c.stop();    
-    
+        
     // setta impostazioni su XYZ_DATA_CFG
     data=0x00; //imposta data con le impostazioni del XYZ_DATA_CFG attineti alla dinamica che si vuole acquisire (+-2g)
     // FS1=FS0=0 imposta la dinamica +-2g 
@@ -113,6 +127,23 @@
     i2c.write(XYZ_DATA_CFG); // scrivi l'indirizzo del XYZ_DATA_CFG
     i2c.write(data); // scrivi il "data" contenete le impostazioni del XYZ_DATA_CFG
     i2c.stop();  
+
+    // setta impostazioni su FF_MT_CFG (Frefall/Motion Configuration Register (Read/Write)
+    data=0xF8; //imposta data con le impostazioni del FF_MT_SRC attineti quando vogliamo svegliare il dispositivo dal wake
+    //Bit 7-> ELE  = 1 ;event flag latch enabled in FF_MT_SRC 
+    //Bit 6-> OAE  = 1 ;Motion Flag (OR combination)
+    //Bit 5-> ZEFE = 1 ;se = 0 asse Z event dection disabled ; se = 1 asse X raise event flag on measured acceleration value beyond present threshold
+    //Bit 4-> YEFE = 1 ;se = 0 asse Y event dection disabled ; se = 1 asse Y raise event flag on measured acceleration value beyond present threshold         
+    //Bit 3-> XEFE = 1 ;se = 0 asse X event dection disabled ; se = 1 asse X raise event flag on measured acceleration value beyond present threshold
+    //Bit 2-> = 0  don't care
+    //Bit 1-> = 0  don't care
+    //Bit 0-> = 0  don't care
+    i2c.start(); // dai lo start
+    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+    i2c.write(FF_MT_CFG); // scrivi l'indirizzo del FF_MT_CFG
+    i2c.write(data); // scrivi il "data" contenete le impostazioni del FF_MT_CFG
+    i2c.stop();  
+
   
     //attiva il dispositivo (esce da standby)
     // setta impostazioni su CTRL_REG_1
@@ -138,32 +169,107 @@
     MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
     PwmOut rled(LED1);
     PwmOut gled(LED2);
-    PwmOut bled(LED3);
-
+    PwmOut bled(LED3);    
+    
+        
     printf("MMA8451 ID: %d\n", acc.getWhoAmI());
 
+
+    char stato_FF_MT_SRC  = 0x00 ;
+    char stato_INT_SOURCE = 0x00 ;
     float x_axis, y_axis, z_axis;
     while (true) {
-       // float x, y, z;
-       // x = abs(acc.getAccX());
-       // y = abs(acc.getAccY());
-       // z = abs(acc.getAccZ());
+    printf("sono dentro il while \n");
+    //lettura del registro di stato FF_MT_SRC (read only)
+    //Bit 7-> EA   = 1 one or more event flag has been asserted 
+    //Bit 6-> don't care
+    //Bit 5-> ZHE  
+    //Bit 4-> ZHP  
+    //Bit 3-> YHE           
+    //Bit 2-> YHP  
+    //Bit 1-> XHE 
+    //Bit 0-> XHP 
+    
+    //lettura del registro di stato INT_SOURCE (read only)
+    //Bit 7-> SRC_ASLP   = 1 one or more event flag has been asserted 
+    //Bit 6-> SRC_FIFO
+    //Bit 5-> SRC_TRANS  
+    //Bit 4-> SRC_LNDPRT
+    //Bit 3-> SRC_PULSE    
+    //Bit 2-> SRC_FF_MT 
+    //Bit 1-> DONT'CARE
+    //Bit 0-> SRC_DRDY 
+    
+    //lettura single byte read
+        i2c.start();
+        i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+        i2c.write(INT_SOURCE);  // scrivi l'indirizzo del registro
+        i2c.start();
+        i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+        stato_INT_SOURCE=i2c.read(0);
+        i2c.stop();
+        printf("stato_INT_SOURCE: %1.2d \n", stato_INT_SOURCE);
+    //lettura single byte read
+        i2c.start();
+        i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+        i2c.write(FF_MT_SRC);  // scrivi l'indirizzo del registro
+        i2c.start();
+        i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+        stato_FF_MT_SRC=i2c.read(0);
+        i2c.stop();
+        printf("stato_FF_MT_SRC: %1.2d \n", stato_FF_MT_SRC);
+        //controllo sullo stato
+        // se il flag  SRC_FF_MT==1 (bit 7) del registro INT_SOURCE
+        if (stato_INT_SOURCE &&0x04 == 0x04) {
+        printf("Buongiorno \n");
        //lettura degli assi con lettura Multiple Byte Read   
+       // i2c.start();
+       // i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+       // i2c.write(OUT_X_MSB);  // scrivi l'indirizzo del registro contente l'accelerazione sull'asse X
+       // i2c.start();
+       // i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+       // x_axis=i2c.read(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su x_axis
+       // y_axis=i2c.read(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su y_axis
+       // z_axis=i2c.read(0); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su z_axis
+       // i2c.stop();  
+       
+       //lettura degli assi con lettura Single Byte Read   
+       // asse x 
         i2c.start();
         i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
         i2c.write(OUT_X_MSB);  // scrivi l'indirizzo del registro contente l'accelerazione sull'asse X
         i2c.start();
         i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
-        x_axis=i2c.read(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su x_axis
-        y_axis=i2c.read(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su y_axis
-        z_axis=i2c.read(0); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su z_axis
+        x_axis=i2c.read(0); // scrive bit di NAK (no acknowlodgement) e salva il dato sul bus su x_axis
+        i2c.stop();
+        // asse y
+        i2c.start();
+        i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+        i2c.write(OUT_Y_MSB);  // scrivi l'indirizzo del registro contente l'accelerazione sull'asse Y
+        i2c.start();
+        i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+        y_axis=i2c.read(0); // scrive bit di NAK (no acknowlodgement) e salva il dato sul bus su y_axis
         i2c.stop();
-        
+        // asse Z
+        i2c.start();
+        i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+        i2c.write(OUT_Z_MSB);  // scrivi l'indirizzo del registro contente l'accelerazione sull'asse Z
+        i2c.start();
+        i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+        z_axis=i2c.read(0); // scrive bit di NAK (no acknowlodgement) e salva il dato sul bus su z_axis
+        i2c.stop();  
+       
+        //accendo led
         rled = 1.0f - x_axis/256;
         gled = 1.0f - y_axis/256;
         bled = 1.0f - z_axis/256;
         wait(0.1f);
-        printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x_axis, y_axis, z_axis);
+        //scrivo sulla seriale
+        printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x_axis/256, y_axis/256, z_axis/256);
+        }
+    else {
+        printf("sto ancora dormendo\n");
+         }
     }
 }