Rodrigo Miguez / Mbed 2 deprecated i2c_acelerometro

Dependencies:   BLE_API mbed nRF51822 circular_buffer

Committer:
agufal
Date:
Wed Jan 20 11:36:30 2016 +0000
Revision:
5:d5dba5370918
Parent:
4:a743917cd04c
Child:
6:fa74a43cae81
A?adidos comentarios

Who changed what in which revision?

UserRevisionLine numberNew contents of line
agufal 0:c123bc196680 1 #include "mbed.h"
agufal 0:c123bc196680 2
agufal 0:c123bc196680 3 I2C i2c(p30, p7);
agufal 0:c123bc196680 4 Serial pc(p9, p11);
agufal 0:c123bc196680 5 //LEDS
agufal 0:c123bc196680 6 DigitalOut led2(LED2);
agufal 0:c123bc196680 7 DigitalOut led1(LED1);
agufal 0:c123bc196680 8 DigitalOut led3(LED3);
agufal 0:c123bc196680 9 DigitalOut led4(LED4);
agufal 0:c123bc196680 10
agufal 5:d5dba5370918 11 /*****************************************************************************
agufal 5:d5dba5370918 12 * El acelerometro tiene una maquina de estados basandose en enable
agufal 5:d5dba5370918 13 * Pagina 11
agufal 5:d5dba5370918 14 * http://www.element14.com/community/servlet/JiveServlet/previewBody/54565-102-1-273580/Datasheet_MMA8491Q.pdf
agufal 5:d5dba5370918 15 *****************************************************************************/
agufal 4:a743917cd04c 16 DigitalOut EN(p16);
agufal 4:a743917cd04c 17
agufal 4:a743917cd04c 18 /*
agufal 5:d5dba5370918 19 * Direccion del acelerometro: 0x55 << 1 = 0xAA
agufal 4:a743917cd04c 20 *
agufal 4:a743917cd04c 21 * Segun el datasheet los pasos son:
agufal 4:a743917cd04c 22 * - Mandar un Start Condition, direccion 0x55 y bit de R/W a 0 para indicar escritura. El esclavo manda un ACK
agufal 4:a743917cd04c 23 * - Transmitir la direccion del registro a leer. El esclavo manda un ACK
agufal 4:a743917cd04c 24 * - Transmitir un Repeated Start Condition y luego "direccionar?" al acelerometro con bit de R/W a 1 (lectura del registro)
agufal 4:a743917cd04c 25 * - El esclavo manda un ACK y transmite los datos del registro indicado
agufal 5:d5dba5370918 26 * - Transmitir un NACK y la señal de Stop
agufal 5:d5dba5370918 27 *
agufal 5:d5dba5370918 28 * Los rangos de datos para cada eje son:
agufal 5:d5dba5370918 29 *
agufal 5:d5dba5370918 30 * | Range ±8g
agufal 5:d5dba5370918 31 * 14-bit Data | (1 mg/count)
agufal 5:d5dba5370918 32 * ___________________|_______________
agufal 5:d5dba5370918 33 * 01 1111 1111 1111 | +8.000g
agufal 5:d5dba5370918 34 * 01 1111 1111 1110 | +7.998g
agufal 5:d5dba5370918 35 * ... | ...
agufal 5:d5dba5370918 36 * 00 0000 0000 0000 | 0.000g
agufal 5:d5dba5370918 37 * 11 1111 1111 1111 | -0.001g
agufal 5:d5dba5370918 38 * ... | ...
agufal 5:d5dba5370918 39 * 10 0000 0000 0001 | -7.998g
agufal 5:d5dba5370918 40 * 10 0000 0000 0000 | -8.000g
agufal 4:a743917cd04c 41 */
agufal 0:c123bc196680 42 int main(){
agufal 0:c123bc196680 43
agufal 5:d5dba5370918 44 const char ACCEL_ADDRESS = 0xAA;
agufal 4:a743917cd04c 45
agufal 0:c123bc196680 46 char data_write[2];
agufal 4:a743917cd04c 47 char data_read[7];
agufal 4:a743917cd04c 48
agufal 4:a743917cd04c 49 data_read[0] = 0;
agufal 4:a743917cd04c 50 data_read[1] = 0;
agufal 4:a743917cd04c 51 data_read[2] = 0;
agufal 4:a743917cd04c 52 data_read[3] = 0;
agufal 4:a743917cd04c 53 data_read[4] = 0;
agufal 4:a743917cd04c 54 data_read[5] = 0;
agufal 4:a743917cd04c 55 data_read[6] = 0;
agufal 0:c123bc196680 56
agufal 0:c123bc196680 57 led1 = 1;
agufal 0:c123bc196680 58 led2 = 1;
agufal 0:c123bc196680 59 led3 = 1;
agufal 0:c123bc196680 60 led4 = 1;
agufal 0:c123bc196680 61
agufal 4:a743917cd04c 62 pc.printf("Starting\n");
agufal 4:a743917cd04c 63
agufal 4:a743917cd04c 64 i2c.frequency(100000); // Min: 0kHz, Max: 400kHz
agufal 5:d5dba5370918 65
agufal 4:a743917cd04c 66 EN = 0; // SHUTDOWN Mode
agufal 4:a743917cd04c 67 wait(0.1);
Alexisfdi 3:80ceedd5ffac 68
Alexisfdi 3:80ceedd5ffac 69 while(1){
Alexisfdi 3:80ceedd5ffac 70
agufal 4:a743917cd04c 71 pc.printf("-----------------------------------------\n");
agufal 4:a743917cd04c 72
agufal 4:a743917cd04c 73 EN = 1; // ACTIVE Mode -> STANDBY Mode
agufal 4:a743917cd04c 74
agufal 5:d5dba5370918 75 /*****************************************************************************
agufal 5:d5dba5370918 76 * Direccion del registro STATUS
agufal 5:d5dba5370918 77 *
agufal 5:d5dba5370918 78 * El registro status cambia diferentes bits para informar de si hay
agufal 5:d5dba5370918 79 * nuevos datos y estan disponibles (1 - Si, 0 - No):
agufal 5:d5dba5370918 80 *
agufal 5:d5dba5370918 81 * ZYXDR : Hay nuevos datos en alguno de los tres ejes
agufal 5:d5dba5370918 82 * ZDR : Hay datos para el eje Z
agufal 5:d5dba5370918 83 * YDR : Hay datos para el eje Y
agufal 5:d5dba5370918 84 * XDR : Hay datos para el eje X
agufal 5:d5dba5370918 85 *
agufal 5:d5dba5370918 86 * El formato del byte es:
agufal 5:d5dba5370918 87 * 0 0 0 0 ZYXDR ZDR YDR XDR
agufal 5:d5dba5370918 88 *****************************************************************************/
agufal 5:d5dba5370918 89 data_write[0] = 0x00;
Alexisfdi 3:80ceedd5ffac 90
Alexisfdi 3:80ceedd5ffac 91 i2c.start();
Alexisfdi 3:80ceedd5ffac 92
agufal 4:a743917cd04c 93 // Como con write ya mandamos la direccion, hacemos los dos primeros pasos a la vez.
agufal 5:d5dba5370918 94 i2c.write(ACCEL_ADDRESS, data_write, 1, true);
agufal 4:a743917cd04c 95
agufal 5:d5dba5370918 96 i2c.read(ACCEL_ADDRESS, data_read, 7, true);
Alexisfdi 3:80ceedd5ffac 97
agufal 4:a743917cd04c 98 pc.printf("Status: %i\n", data_read[0]);
Alexisfdi 3:80ceedd5ffac 99
Alexisfdi 3:80ceedd5ffac 100 if(data_read[0] == 0)
Alexisfdi 3:80ceedd5ffac 101 led1 = 0;
agufal 4:a743917cd04c 102 else
agufal 4:a743917cd04c 103 led1 = 1;
Alexisfdi 3:80ceedd5ffac 104
agufal 4:a743917cd04c 105 // X
Alexisfdi 3:80ceedd5ffac 106 int ch0 =(data_read[1] << 6) | data_read[2] >> 2;
Alexisfdi 3:80ceedd5ffac 107
agufal 4:a743917cd04c 108 pc.printf("X: %i\n", ch0);
agufal 4:a743917cd04c 109
agufal 4:a743917cd04c 110 if (ch0 < 0x00FF)
Alexisfdi 3:80ceedd5ffac 111 led2 = 0;
Alexisfdi 3:80ceedd5ffac 112 else
Alexisfdi 3:80ceedd5ffac 113 led2 = 1;
Alexisfdi 3:80ceedd5ffac 114
agufal 4:a743917cd04c 115 // Y
Alexisfdi 3:80ceedd5ffac 116 int ch1 =(data_read[3] << 6) | data_read[4] >> 2;
agufal 4:a743917cd04c 117
agufal 4:a743917cd04c 118 pc.printf("Y: %i\n", ch1);
Alexisfdi 3:80ceedd5ffac 119
agufal 4:a743917cd04c 120 if(ch1 < 0x00FF)
Alexisfdi 3:80ceedd5ffac 121 led3 = 0;
Alexisfdi 3:80ceedd5ffac 122 else
Alexisfdi 3:80ceedd5ffac 123 led3 = 1;
Alexisfdi 3:80ceedd5ffac 124
agufal 4:a743917cd04c 125 // Z
Alexisfdi 3:80ceedd5ffac 126 int ch2 =(data_read[5] << 6) | data_read[6] >> 2;
Alexisfdi 3:80ceedd5ffac 127
agufal 4:a743917cd04c 128 pc.printf("Z: %i\n", ch2);
agufal 4:a743917cd04c 129
agufal 4:a743917cd04c 130 if(ch2 < 0x00FF)
Alexisfdi 3:80ceedd5ffac 131 led4 = 0;
Alexisfdi 3:80ceedd5ffac 132 else
Alexisfdi 3:80ceedd5ffac 133 led4 = 1;
Alexisfdi 3:80ceedd5ffac 134
agufal 4:a743917cd04c 135 i2c.read(0); // Enviamos un NACK (Espero)
Alexisfdi 3:80ceedd5ffac 136 i2c.stop();
Alexisfdi 3:80ceedd5ffac 137
agufal 4:a743917cd04c 138 EN = 0; // SHUTDOWN Mode
agufal 4:a743917cd04c 139
agufal 4:a743917cd04c 140 wait(0.1);
agufal 5:d5dba5370918 141
Alexisfdi 3:80ceedd5ffac 142 }
agufal 0:c123bc196680 143 }