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:
0:4317f4b1a4b3
Child:
1:944348c50dd6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jan 14 11:29:52 2015 +0000
@@ -0,0 +1,169 @@
+#include "mbed.h"
+#include "MMA8451Q.h"
+#include "I2C.h"
+
+#if   defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
+PinName const SDA = PTE25;
+PinName const SCL = PTE24;
+#elif defined (TARGET_KL05Z)
+PinName const SDA = PTB4;
+PinName const SCL = PTB3;
+#elif defined (TARGET_K20D50M)
+PinName const SDA = PTB1;
+PinName const SCL = PTB0;
+#else
+  #error TARGET NOT DEFINED
+#endif
+
+#define MMA8451_I2C_ADDRESS (0x1d<<1)
+
+
+//instanzia e inizializza oggettto i2c della clase I2C
+I2C i2c(SDA,SCL); // SDA I2C data line pin  
+                //  SCL I2C clock line pin  
+
+
+char address_wr = 0x3A ; //byte per eseguire lettura: address_device + bit_wr(W=0)
+char address_rd = 0x3B ; //byte per eseguire scrittura: address_device + bit_rd(R=1)
+char CTRL_REG_1 = 0x2A ; // register address del CTRL_REG_1
+char CTRL_REG_2 = 0x2B ; // register address del CTRL_REG_2
+char CTRL_REG_3 = 0x2C ; // register address del CTRL_REG_3
+char CTRL_REG_4 = 0x2D ; // register address del CTRL_REG_4
+char CTRL_REG_5 = 0x2E ; // register address del CTRL_REG_5
+char data = 0xFA ; // inizalizza la variabile data con le impostazioni da scrivere su CTRL_REG_1
+char OUT_X_MSB = 0x01 ; // parte più significativa del registro contenete l'accelerazione sull'asse x 
+char OUT_Y_MSB = 0x03 ; // parte più significativa del registro contenete l'accelerazione sull'asse y
+char OUT_Z_MSB = 0x05 ; // parte più significativa del registro contenete l'accelerazione sull'asse z
+char XYZ_DATA_CFG = 0x0E;// register address del XYZ_DATA_CFG
+//ASLP_RATE0 = ASLP_RATE1 = 1 \\ per settare modalità campionamento in sleep a f=1.56Hz
+//DR2=DR1=DR0 =1 \\ per settare campionamento in wake a f=1.56Hz
+//LNOISE=0 //non attiva ridzuione del rumore (tanto la frequenza di campionamento è bassa)
+//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
+
+
+
+int main(void)
+{
+    
+    //impostazione dei registri con scrittura Single Byte Write
+    
+    // setta impostazioni su CTRL_REG_1
+    i2c.start(); // dai lo start
+    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+    i2c.write(CTRL_REG_1); // scrivi l'indirizzo del CTRL_REG_1
+    i2c.write(data); // scrivi il "data" già inizializzato con le impostazioni del CTRL_REG_1
+    i2c.stop();
+    
+    // setta impostazioni su CTRL_REG_2
+    data=0x04; //imposta data con le impostazioni del CTRL_REG_2
+    //ST=0 disabilita il self-test
+    //RST=0 disabilita modalità reset
+    //bit 5 don't care
+    //SMODS0=SMODS1=0 setta la modalità oversampling_mode = normal , quando è in modalità in sleep    
+    //SLPE=1 abilita l'autosleep
+    //MODS0=MODS1=0 setta la modalità oversampling_mode = normal , quando è in modalità in active   
+    i2c.start(); // dai lo start
+    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+    i2c.write(CTRL_REG_2); // scrivi l'indirizzo del CTRL_REG_2
+    i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_2
+    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
+    // 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_3); // scrivi l'indirizzo del CTRL_REG_3
+    i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_3
+    i2c.stop();    
+
+    // setta impostazioni su CTRL_REG_4
+    data=0x00; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt
+    // 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_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
+    // 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 
+    i2c.start(); // dai lo start
+    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+    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();  
+  
+    //attiva il dispositivo (esce da standby)
+    // setta impostazioni su CTRL_REG_1
+    data=0xFB ; // mette a 1 il bit ACTIVE e lascia invariati gli altri (già impostati)
+    i2c.start(); // dai lo start
+    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+    i2c.write(CTRL_REG_1); // scrivi l'indirizzo del CTRL_REG_1
+    i2c.write(data); // scrivi il "data" in le impostazioni del CTRL_REG_1
+    i2c.stop();
+
+    //lettura degli assi con lettura Multiple Byte Read   
+    //float x_axis, y_axis, z_axis;
+    //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.write(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su x_axis
+    //y_axis=i2c.write(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su y_axis
+    //z_axis=i2c.write(0); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su z_axis
+    //i2c.stop();
+        
+    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
+    PwmOut rled(LED1);
+    PwmOut gled(LED2);
+    PwmOut bled(LED3);
+
+    printf("MMA8451 ID: %d\n", acc.getWhoAmI());
+
+    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());
+       //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();
+        
+        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);
+    }
+}
+