
Questa è la versione deifinitiva del codice del Lab2_I2C e del lab3_SPI (nell'altra c'era un commento sbagliato è do dovuto ripubblicarla)
Fork of Codice_Lab2_I2C_Lab3_SPI by
Diff: main.cpp
- Revision:
- 3:f8f4a33c7aa2
- Parent:
- 2:53521a18c3de
- Child:
- 4:c40acfb63133
--- a/main.cpp Sat Jan 17 09:27:25 2015 +0000 +++ b/main.cpp Tue Jan 20 11:09:06 2015 +0000 @@ -1,10 +1,15 @@ #include "mbed.h" #include "MMA8451Q.h" #include "I2C.h" +#include "SPI.h" +#include "DigitalIn.h" + +//--prova-------------------------------------------- +//PinName const INT1 = PTA14 ; //pin interrupt +//PinName const INT2 = PTA15 ; //pin interrupt +//--prova-------------------------------------------- #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) -//PinName const INT1 = PTA14 ; //pin interrupt -//PinName const INT2 = PTA15 ; //pin interrupt PinName const SDA = PTE25; PinName const SCL = PTE24; #elif defined (TARGET_KL05Z) @@ -17,32 +22,45 @@ #error TARGET NOT DEFINED #endif -#define MMA8451_I2C_ADDRESS (0x1d<<1) +//--RELATIVI ALLA COMUNICAZIONE SPI------ +PinName const mosi = PTD2; //mosi SPI1_mosi +PinName const miso = PTD3; //miso SPI1_miso +PinName const sck = PTD1; //sck SPI1_sck +PinName const pcs0 = PTD0; //pcs0 SPI1_pcs0 +//--RELATIVI ALLA COMUNICAZIONE SPI------ - +#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 + // SCL I2C clock line pin +//--prova------------------------------------------------------------ +//instanzia e inizializza oggetti int1 e int2 della classe DigitalIn +DigitalIn int1(INT1); //inizializza int1 +DigitalIn int2(INT2); //inizializza int2 +//--prova------------------------------------------------------------ -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) +//registri da impostare char CTRL_REG_1 = 0x2A ; //read/write // register address del CTRL_REG_1 char CTRL_REG_2 = 0x2B ; //read/write // register address del CTRL_REG_2 char CTRL_REG_3 = 0x2C ; //read/write // register address del CTRL_REG_3 char CTRL_REG_4 = 0x2D ; //read/write // register address del CTRL_REG_4 -char CTRL_REG_5 = 0x2E ; //read/write // register address del CTRL_REG_5 -char data = 0x00 ; // inizalizza la variabile data con le impostazioni da scrivere su CTRL_REG_1 char OUT_X_MSB = 0x01 ; //read only // parte più significativa del registro contenete l'accelerazione sull'asse x char OUT_Y_MSB = 0x03 ; //read only // parte più significativa del registro contenete l'accelerazione sull'asse y char OUT_Z_MSB = 0x05 ; //read only // parte più significativa del registro contenete l'accelerazione sull'asse z char XYZ_DATA_CFG = 0x0E; //read/write // register address del XYZ_DATA_CFG -char FF_MT_CFG = 0x15; //read/write // registera addres del FF_MT_CFG (Frefall/Motionn Configuration register (Read/Write) -char INT_SOURCE = 0x0C; //read only // register adderess del INT_SOURCE ( System Interrupt Status Register) -char FF_MT_SRC = 0x16; //read only // register address del FF_MT_SRC (Frefall/Motion Source Register char ASLP_COUNT= 0x29; //read/write // register address SLEEP TIME-OUT COUNTER -char WHO_AM_I = 0x0D; //read only // register address WHO_AM_I dice chi è ? char SYSMOD = 0x0B; //read only // register address SYSMOD System Mode Register +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 data = 0x00 ; // inizalizza la variabile data con le impostazioni da scrivere su CTRL_REG_1 + +//--registri aggiunti e settati per prova ------------------------------------------------------------------ +char CTRL_REG_5 = 0x2E ; //read/write // register address del CTRL_REG_5 +char FF_MT_CFG = 0x15; //read/write // registera addres del FF_MT_CFG (Frefall/Motionn Configuration register +char FF_MT_THS = 0x17; //read/write // register address del FF_MT_THS Freefall and Motion Threshold +char FF_MT_COUNT = 0x18; //read/write //register address del FF_MT_COUNT Debounce Register +//--registri aggiunti e settati per prova --------------------------------------------------------------------- int main(void) { @@ -50,22 +68,27 @@ //impostazione dei registri con scrittura Single Byte Write // setta impostazioni su CTRL_REG_1 - //data = 0x58 ; //->F_READ=0; acquisisco cmq un solo byte - //data= 0x02;//solo F_READ=1; - data = 0x5A ; // setta la variabile data con le impostazioni da scrivere su CTRL_REG_1 + data = 0x58 ; // setta la variabile data con le impostazioni da scrivere su CTRL_REG_1 //Bit 7-> ASLP_RATE1 = 0 //Bit 6-> ASLP_RATE0 = 1 -> // Il sample rate in sleep è 6.25 Hz vedi AN070 //Bit 5-> DR2 = 0 //Bit 4-> DR1 = 1 //Bit 3-> DR0 = 1 -> // Il sample rate in wake è 100 Hz vedi AN070 //Bit 2-> LNOISE = 0 - //Bit 1-> F_READ = 1 -> //Faste read is enabled, acquissco un solo byte! + //Bit 1-> F_READ = 0 -> //Faste read is enabled, acquissco un solo byte! //Bit 0-> ACTIVE = 0 -> //Mette il dispositivo in standby per settare gli altri registri 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(); + //NOTE: + //La modalità "FAST READ", che si attiva asserendo il bit F_READ, può non essere impostata perchè + //per campionare il dato con risoluzione 8 bit è sufficente leggere solo la parte + //significativa del dato contenuta nei registri OUT_MSB_X, Y e Z. + //Cambio la frequenz di campionamento, valore dell'ODR (Over Sampling Ratio), + //dalla modalità sleep alla modalità wake (in modo da accorgermi di essere in wake) + // setta impostazioni su CTRL_REG_2 data=0x04; //imposta data con le impostazioni del CTRL_REG_2 @@ -82,14 +105,13 @@ i2c.stop(); // setta impostazioni su CTRL_REG_3 - //data=0x18; //imposta data con le impostazioni del CTRL_REG_3 attineti alle gestioni dell'interupt in modalità sleep - data=0x40; //imposta solo il wake_trans + data=0x68; //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 ->0 oppure a 1 non cambia! - //Bit 5-> WAKE_LNDRPT = 0 - //Bit 4-> WAKE_PULSE = 1 - //Bit 3-> WAKE_FF_MT = 1 (if=0disabled!) Frefall/Motion function interrupt can wake up ! + //Bit 6-> WAKE_TRANS = 1 + //Bit 5-> WAKE_LNDRPT = 1 + //Bit 4-> WAKE_PULSE = 0 + //Bit 3-> WAKE_FF_MT = 1 //Bit 2-> don't care //Bit 1-> IPOL = 0 //Bit 0-> PP_OD = 0 @@ -100,39 +122,21 @@ i2c.stop(); // setta impostazioni su CTRL_REG_4 - //data=0x8C; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt - data=0x80; // imposta solo l'Auto-SLEEP/WAKE interrupt + data=0xB5; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt // vedi data-sheet //Bit 7-> IN_EN_ASLP = 1 ; se = 1 Auto-SLEEP/WAKE interrupt enabled -> vedi AN070 //Bit 6-> INT_EN_FIFO = 0 - //Bit 5-> INT_EN_TRANS = 0 - //Bit 4-> INT_EN_LNDPRT = 0 - //Bit 3-> INT_EN_PULSE = 1 Pulse interrupt enabled -> vedi AN070 - //Bit 2-> INT_EN_FF_MT = 1 Freefall/Motion interrupt enabled -> vedi AN070 + //Bit 5-> INT_EN_TRANS = 1 + //Bit 4-> INT_EN_LNDPRT = 1 + //Bit 3-> INT_EN_PULSE = 0 + //Bit 2-> INT_EN_FF_MT = 1 //Bit 1-> don't care = 0 - //Bit 0-> INT_EN_DRDY = 0 + //Bit 0-> INT_EN_DRDY = 1 ;// abilito data ready per motivi di logica interna pur no usandolo 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=0x80; //imposta data con le impostazioni del CTRL_REG_5 attineti alle gestioni dell'interupt nei pin - // vedi data-sheet - //Bit 7-> INT_CFG_ASLP = 1 route the auto-sleep interrupt to INT1 ->vedi AN070 - //Bit 6-> INT_CFG_FIFO = 0 - //Bit 5-> INT_CFG_TRANS = 0 - //Bit 4-> INT_CFG_LNDPRT = 0 - //Bit 3-> INT_CFG_PULSE = 0 route the pulse interrupt to INT1 ->vedi AN070 - //Bit 2-> INT_CFG_FF_MT = 0 route the Motion and Orientation interrupt to INT1 ->vedi AN070 - //Bit 1-> DON'T CARE = 0 - //Bit 0-> INT_CFG_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_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) @@ -143,11 +147,40 @@ i2c.write(data); // scrivi il "data" contenete le impostazioni del XYZ_DATA_CFG i2c.stop(); + //setta impostazioni su ASLP_COUNT + data=0x0F; //->impostato da me valore max + //data=0x01; //impostato da me valore min + //data=0x04; //imposta data con le impostazioni del ASLP_COUNT -> impostato dal professore!!! + i2c.start(); // dai lo start + i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura + i2c.write(ASLP_COUNT); // scrivi l'indirizzo del ASLP_COUNT + i2c.write(data); // scrivi il "data" contenete le impostazioni del ASLP_COUNT + i2c.stop(); + +//---registri impostati per prova --------------------------------- + + + // setta impostazioni su CTRL_REG_5 + data=0x81; //imposta data con le impostazioni del CTRL_REG_5 attineti alle gestioni dell'interupt nei pin + // vedi data-sheet + //Bit 7-> INT_CFG_ASLP = 1 route the auto-sleep interrupt to INT1 ->vedi AN074 + //Bit 6-> INT_CFG_FIFO = 0 + //Bit 5-> INT_CFG_TRANS = 0 + //Bit 4-> INT_CFG_LNDPRT = 0 + //Bit 3-> INT_CFG_PULSE = 0 route the pulse interrupt to INT2 ->vedi AN074 + //Bit 2-> INT_CFG_FF_MT = 0 route the Motion and Orientation interrupt to INT2 ->vedi AN074 + //Bit 1-> DON'T CARE = 0 + //Bit 0-> INT_CFG_DRDY = 1 route the data-ready interrupt to INT1 ->vedi AN074 + 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 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 - data=0x00; //non imposta nulla + 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 = 0 ;Motion Flag (if=1 OR combination) (if=1 AND combination) + //Bit 6-> OAE = 1 ;Motion Flag (if=1 OR combination) (if=1 AND 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 @@ -159,245 +192,227 @@ 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(); - //setta impostazioni su ASLP_COUNT - data=0xF0; //->impostato da me valore max - //data=0x01; //impostato da me valore min - //data=0x04; //imposta data con le impostazioni del ASLP_COUNT -> impostato dal professore!!! + + + // setta impostazioni su FF_MT_THS (Read/Write) + data=0x04; //imposta data con le impostazioni del FF_MT_THS i2c.start(); // dai lo start i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura - i2c.write(ASLP_COUNT); // scrivi l'indirizzo del ASLP_COUNT - i2c.write(data); // scrivi il "data" contenete le impostazioni del ASLP_COUNT + i2c.write(FF_MT_THS); // scrivi l'indirizzo del FF_MT_THS + i2c.write(data); // scrivi il "data" contenete le impostazioni del FF_MT_THS + i2c.stop(); + + // setta impostazioni su FF_MT_COUNT (Read/Write) + data=0x08; //imposta data con le impostazioni del FF_MT_COUNT + i2c.start(); // dai lo start + i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura + i2c.write(FF_MT_COUNT); // scrivi l'indirizzo del FF_MT_COUNT + i2c.write(data); // scrivi il "data" contenete le impostazioni del FF_MT_COUNT i2c.stop(); +//---registri impostati per prova --------------------------------- + + //!!! attiva il dispositivo (esce da standby) !!! // setta impostazioni su CTRL_REG_1 - data=0x5B ; // mette a 1 il bit ACTIVE e lascia invariati gli altri (già impostati) - i2c.start(); // dai lo start + data=0x5B ; // 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.write(data); // scrivi il "data" in le impostazioni del CTRL_REG_1 i2c.stop(); - - MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); + //PER ACCENDERE LED PwmOut rled(LED1); PwmOut gled(LED2); PwmOut bled(LED3); + //verifica della corretta scrittura dei registri, mediante lettura Single Byte Read - char who_am_i = 0x00; - //lettura single byte read del registro WHO_AM_I - i2c.start(); - i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura - i2c.write(WHO_AM_I); // scrivi l'indirizzo del registro + //lettura single byte read del registro CTRL_REG_1 + char ctrl_reg_1 = 0x00; i2c.start(); - i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read - who_am_i=i2c.read(0); - i2c.stop(); - printf("mi chiamo: %1.2x \n", who_am_i); - - - char ctrl_reg_1 = 0x00; - //lettura single byte read del registro CTRL_REG_1 - i2c.start(); - i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura + i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura i2c.write(CTRL_REG_1); // scrivi l'indirizzo del registro i2c.start(); - i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read + i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read ctrl_reg_1=i2c.read(0); i2c.stop(); - printf("CTRL_REG_1: %1.2x \n", ctrl_reg_1); + printf("CTRL_REG_1: %1.2x \n", ctrl_reg_1); // in esadecimale + //lettura single byte read del registro CTRL_REG_2 char ctrl_reg_2 = 0x00; - //lettura single byte read del registro CTRL_REG_2 i2c.start(); - i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura + i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura i2c.write(CTRL_REG_2); // scrivi l'indirizzo del registro i2c.start(); - i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read + i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read ctrl_reg_2=i2c.read(0); i2c.stop(); - printf("CTRL_REG_2: %1.2x \n", ctrl_reg_2); + printf("CTRL_REG_2: %1.2x \n", ctrl_reg_2); //in esadecimale - char ctrl_reg_3 = 0x00; //lettura single byte read del registro CTRL_REG_3 + char ctrl_reg_3 = 0x00; i2c.start(); - i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura + i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura i2c.write(CTRL_REG_3); // scrivi l'indirizzo del registro i2c.start(); - i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read + i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read ctrl_reg_3=i2c.read(0); i2c.stop(); - printf("CTRL_REG_3: %1.2x \n", ctrl_reg_3); + printf("CTRL_REG_3: %1.2x \n", ctrl_reg_3); //in esadecimale + //lettura single byte read del registro CTRL_REG_4 char ctrl_reg_4 = 0x00; - //lettura single byte read del registro CTRL_REG_4 i2c.start(); - i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura + i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura i2c.write(CTRL_REG_4); // scrivi l'indirizzo del registro i2c.start(); - i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read + i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read ctrl_reg_4=i2c.read(0); i2c.stop(); - printf("CTRL_REG_4: %1.2x \n", ctrl_reg_4); - - char ctrl_reg_5 = 0x00; - //lettura single byte read del registro CTRL_REG_5 - i2c.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 registro - i2c.start(); - i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read - ctrl_reg_5=i2c.read(0); - i2c.stop(); - printf("CTRL_REG_5: %1.2x \n", ctrl_reg_5); - - char ff_mt_cfg = 0x00; - //lettura single byte read del registro FF_MT_CFG - i2c.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 registro + printf("CTRL_REG_4: %1.2x \n", ctrl_reg_4); //in esadecimale + + //lettura single byte read del registro ASLP_COUNT + char aslp_count = 0x00; i2c.start(); - i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read - ff_mt_cfg=i2c.read(0); - i2c.stop(); - printf("FF_MT_CFG: %1.2x \n", ff_mt_cfg); - - - char int_source = 0x00; - //lettura single byte read del registro INT_SOURCE - 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 - int_source=i2c.read(0); - i2c.stop(); - printf("INT_SOURCE: %1.2x \n", int_source); - - char aslp_count = 0x00; - //lettura single byte read del registro ASLP_COUNT - i2c.start(); - i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura + i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura i2c.write(ASLP_COUNT); // scrivi l'indirizzo del registro i2c.start(); - i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read + i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read aslp_count=i2c.read(0); i2c.stop(); - printf("ASLP_COUNT: %1.2x \n", aslp_count); - - + printf("ASLP_COUNT: %1.2x \n", aslp_count); //in esadecimale + char sysmod = 0x00; - char stato_FF_MT_SRC = 0x00 ; - char stato_INT_SOURCE = 0x00 ; float x_axis, y_axis, z_axis; + //int int1_value = 0; + //int int2_value = 0; while (true) { - printf("sono dentro il while \n"); - printf("SYSMOD_pre_lettura: %1.2x \n", sysmod); - //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 - 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 + printf("SYSMOD_pre_read: %1.2x \n", sysmod); + wait(0.1); + //lettura dello stato dell'accelerometro wake o sleep + // lettura single Byte Read contenuto di SYSMOD System Mode Register + // Bit 7-> FGERR + // Bit 6-> FGT_4 + // Bit 5-> FGT_3 + // Bit 4-> FGT_2 + // Bit 3-> FGT_1 + // Bit 2-> FGT_0 + // Bit 1-> SYSMOD1 + // Bit 0-> SYSMOD0 + // SYSMOD[1:0] + // System Mode. Default value: 00. + // 00: STANDBY mode + // 01: WAKE mode + // 10: SLEEP mode 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 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 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.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura + i2c.write(SYSMOD); // 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.2x \n", stato_FF_MT_SRC); - // lettura single Byte Read contenuto di SYSMOD System Mode Register - //Bit 7-> FGERR - //Bit 6-> FGT_4 - //Bit 5-> FGT_3 - //Bit 4-> FGT_2 - //Bit 3-> FGT_1 - //Bit 2-> FGT_0 - //Bit 1-> SYSMOD1 - //Bit 0-> SYSMOD0 - // SYSMOD[1:0] - // System Mode. Default value: 00. - // 00: STANDBY mode - // 01: WAKE mode - // 10: SLEEP mode - i2c.start(); - i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura - i2c.write(SYSMOD); // scrivi l'indirizzo del registro - i2c.start(); - i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read + i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read sysmod=i2c.read(0); i2c.stop(); - printf("SYSMOD_post_lettura: %1.2x \n", sysmod); - //controllo sullo stato - // se il flag SRC_FF_MT==1 (bit 7) del registro INT_SOURCE - //if (stato_INT_SOURCE &&0x04 == 0x04) { - //printf("INT1: %1.2x \n", INT1); - //printf("INT2: %1.2x \n", INT2); + printf("SYSMOD_post_read: %1.2x \n", sysmod); wait(0.1f); - if (sysmod &0x02 ==0x02) { // if SYSMOD1,SYSMOD0 = 1,0 - wait(0.1f); - printf("Sto dormendo sono in auto-sleep , SYSMOD: %1.2x \n",sysmod); - rled = 0.0f; - gled = 0.0f; - bled = 0.0f; + if ( (sysmod &0x02) == 0x02) { // if SYSMOD1,SYSMOD0 = 1,0 + wait(0.1f); + printf("I'm sleeping , SYSMOD: %1.2x \n",sysmod); + rled = 0.0f; + gled = 0.0f; + bled = 0.0f; + //---prova------------------------------------------------ + //mette il dispositivo in standby + //setta impostazioni su CTRL_REG_1 + data=0x5A ; // 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(); + //attiva il dispositivo + //setta impostazioni su CTRL_REG_1 + data=0x5B ; // 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(); + //int1_value=int1.read(); + //int2_value=int2.read(); + //printf("INT1_sleep: %1.2d \n",INT1); + //printf("INT2_sleep: %1.2d \n",INT2); + //---prova------------------------------------------------ + } //chiusra del if - if (sysmod &0x01 ==0x01){ // if SYSMOD1,SYSMOD0 = 0,1 - printf("Buongiorno motion and rotation mi hanno sveliato, , SYSMOD: %1.2x \n", sysmod); - //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(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); - //scrivo sulla seriale - printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x_axis/64, y_axis/64, z_axis/64); - } //chiusura secondo if - }//chiusura del while -}//chiusura del main + if ( (sysmod &0x01) ==0x01){ // if SYSMOD1,SYSMOD0 = 0,1 + //---prova------------------------------------------------- + //int1_value=int1.read; + //int2_value=int2.read; + //printf("INT1_wake: %1.2d \n",INT1); + //printf("INT2_wake: %1.2d \n",INT2); + //---prova------------------------------------------------- + wait(0.1f); + printf("Good morning! , SYSMOD: %1.2x \n", sysmod); + //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(0); // scrive bit di NAK (non 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 (non 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 (non 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; + //scrivo sulla seriale + printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x_axis/64, y_axis/64, z_axis/64); + + //SCRIVO DATI SU DISPLAY A SETTE SEGMENTI MEDIANTE SPI + //comunicazione con SPI + int bits = 8; + int mode = 1; + spi.format(bits,mode);//definisce formato spi con 16 bit e pol=0 e pha=1 + //di default la frequenza è 1MHz + + char character; + char lettura; + int i; + while(1) + { + int command_wr=128; //comando per la scrittura (10000DDD), di default nella locazione DDD=000 + //int command_rd=0; //comando per la lettura (00000DDD), dib default nella locazione DDD=000 + //for(i=0;i<7;i++) + //{ + //character=(char)(65+i); + //scrittura + slave_select.write(0); + spi.write(133); + spi.write(3); + slave_select.write(1); + printf("Carattere in ingresso %c\n",character); + //command_wr++; + // } + + } //close 2nd if + }//close while +}//close main