Rodrigo Miguez / Mbed 2 deprecated i2c_acelerometro

Dependencies:   BLE_API mbed nRF51822 circular_buffer

Committer:
agufal
Date:
Wed Jan 20 10:48:50 2016 +0000
Revision:
4:a743917cd04c
Parent:
3:80ceedd5ffac
Child:
5:d5dba5370918
- Agregados comentarios; - Nos faltaba poner un digital out ENABLE para que empezara a recoger datos; - La direccion es 0xAA siempre, porque el read y el write hacen "address | 0/1"; - Organizada un poco la salida del usb; - Parece que funciona!!!

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 4:a743917cd04c 11 DigitalOut EN(p16);
agufal 4:a743917cd04c 12
agufal 4:a743917cd04c 13 /*
agufal 4:a743917cd04c 14 * Direccion del acelerometro: 0x55
agufal 4:a743917cd04c 15 * Como la direccion ocupa 7 bits + bit de R/W, en teoria seria 0xAA o 0xAB,
agufal 4:a743917cd04c 16 * pero no estamos seguros de si esa transformacion se hace directamente al
agufal 4:a743917cd04c 17 * llamar a write() y read() o lo tenemos que poner nosotros a mano.
agufal 4:a743917cd04c 18 *
agufal 4:a743917cd04c 19 * Segun el datasheet los pasos son:
agufal 4:a743917cd04c 20 * - Mandar un Start Condition, direccion 0x55 y bit de R/W a 0 para indicar escritura. El esclavo manda un ACK
agufal 4:a743917cd04c 21 * - Transmitir la direccion del registro a leer. El esclavo manda un ACK
agufal 4:a743917cd04c 22 * - Transmitir un Repeated Start Condition y luego "direccionar?" al acelerometro con bit de R/W a 1 (lectura del registro)
agufal 4:a743917cd04c 23 * - El esclavo manda un ACK y transmite los datos del registro indicado
agufal 4:a743917cd04c 24 * - Transmitir la señal de Stop
agufal 4:a743917cd04c 25 */
agufal 0:c123bc196680 26 int main(){
agufal 0:c123bc196680 27
agufal 4:a743917cd04c 28 const char WRITE_ADDRESS = 0xAA; // 0xAA
agufal 4:a743917cd04c 29 const char READ_ADDRESS = 0xAA; // 0xAB, 0x1D
agufal 4:a743917cd04c 30
agufal 0:c123bc196680 31 char data_write[2];
agufal 4:a743917cd04c 32 char data_read[7];
agufal 4:a743917cd04c 33
agufal 4:a743917cd04c 34 data_read[0] = 0;
agufal 4:a743917cd04c 35 data_read[1] = 0;
agufal 4:a743917cd04c 36 data_read[2] = 0;
agufal 4:a743917cd04c 37 data_read[3] = 0;
agufal 4:a743917cd04c 38 data_read[4] = 0;
agufal 4:a743917cd04c 39 data_read[5] = 0;
agufal 4:a743917cd04c 40 data_read[6] = 0;
agufal 0:c123bc196680 41
agufal 0:c123bc196680 42 led1 = 1;
agufal 0:c123bc196680 43 led2 = 1;
agufal 0:c123bc196680 44 led3 = 1;
agufal 0:c123bc196680 45 led4 = 1;
agufal 0:c123bc196680 46
agufal 4:a743917cd04c 47 pc.printf("Starting\n");
agufal 4:a743917cd04c 48
agufal 4:a743917cd04c 49 i2c.frequency(100000); // Min: 0kHz, Max: 400kHz
agufal 4:a743917cd04c 50
agufal 4:a743917cd04c 51 /* El acelerometro tiene una maquina de estados basandose en enable
agufal 4:a743917cd04c 52 * Pagina 11
agufal 4:a743917cd04c 53 * http://www.element14.com/community/servlet/JiveServlet/previewBody/54565-102-1-273580/Datasheet_MMA8491Q.pdf
agufal 4:a743917cd04c 54 */
agufal 4:a743917cd04c 55 EN = 0; // SHUTDOWN Mode
agufal 4:a743917cd04c 56 wait(0.1);
Alexisfdi 3:80ceedd5ffac 57
Alexisfdi 3:80ceedd5ffac 58 while(1){
Alexisfdi 3:80ceedd5ffac 59
agufal 4:a743917cd04c 60 pc.printf("-----------------------------------------\n");
agufal 4:a743917cd04c 61
agufal 4:a743917cd04c 62 EN = 1; // ACTIVE Mode -> STANDBY Mode
agufal 4:a743917cd04c 63
agufal 4:a743917cd04c 64 data_write[0] = 0x00; // Direccion del registro STATUS
Alexisfdi 3:80ceedd5ffac 65
Alexisfdi 3:80ceedd5ffac 66 i2c.start();
Alexisfdi 3:80ceedd5ffac 67
agufal 4:a743917cd04c 68 // Como con write ya mandamos la direccion, hacemos los dos primeros pasos a la vez.
agufal 4:a743917cd04c 69 i2c.write(WRITE_ADDRESS, data_write, 1, true);
agufal 4:a743917cd04c 70
agufal 4:a743917cd04c 71 i2c.read(READ_ADDRESS, data_read, 7, true); // El true indica repeated start condition
Alexisfdi 3:80ceedd5ffac 72
agufal 4:a743917cd04c 73 pc.printf("Status: %i\n", data_read[0]);
Alexisfdi 3:80ceedd5ffac 74
Alexisfdi 3:80ceedd5ffac 75 if(data_read[0] == 0)
Alexisfdi 3:80ceedd5ffac 76 led1 = 0;
agufal 4:a743917cd04c 77 else
agufal 4:a743917cd04c 78 led1 = 1;
Alexisfdi 3:80ceedd5ffac 79
agufal 4:a743917cd04c 80 // X
Alexisfdi 3:80ceedd5ffac 81 int ch0 =(data_read[1] << 6) | data_read[2] >> 2;
Alexisfdi 3:80ceedd5ffac 82
agufal 4:a743917cd04c 83 pc.printf("X: %i\n", ch0);
agufal 4:a743917cd04c 84
agufal 4:a743917cd04c 85 if (ch0 < 0x00FF)
Alexisfdi 3:80ceedd5ffac 86 led2 = 0;
Alexisfdi 3:80ceedd5ffac 87 else
Alexisfdi 3:80ceedd5ffac 88 led2 = 1;
Alexisfdi 3:80ceedd5ffac 89
agufal 4:a743917cd04c 90 // Y
Alexisfdi 3:80ceedd5ffac 91 int ch1 =(data_read[3] << 6) | data_read[4] >> 2;
agufal 4:a743917cd04c 92
agufal 4:a743917cd04c 93 pc.printf("Y: %i\n", ch1);
Alexisfdi 3:80ceedd5ffac 94
agufal 4:a743917cd04c 95 if(ch1 < 0x00FF)
Alexisfdi 3:80ceedd5ffac 96 led3 = 0;
Alexisfdi 3:80ceedd5ffac 97 else
Alexisfdi 3:80ceedd5ffac 98 led3 = 1;
Alexisfdi 3:80ceedd5ffac 99
agufal 4:a743917cd04c 100 // Z
Alexisfdi 3:80ceedd5ffac 101 int ch2 =(data_read[5] << 6) | data_read[6] >> 2;
Alexisfdi 3:80ceedd5ffac 102
agufal 4:a743917cd04c 103 pc.printf("Z: %i\n", ch2);
agufal 4:a743917cd04c 104
agufal 4:a743917cd04c 105 if(ch2 < 0x00FF)
Alexisfdi 3:80ceedd5ffac 106 led4 = 0;
Alexisfdi 3:80ceedd5ffac 107 else
Alexisfdi 3:80ceedd5ffac 108 led4 = 1;
Alexisfdi 3:80ceedd5ffac 109
Alexisfdi 3:80ceedd5ffac 110
agufal 4:a743917cd04c 111 i2c.read(0); // Enviamos un NACK (Espero)
Alexisfdi 3:80ceedd5ffac 112 i2c.stop();
Alexisfdi 3:80ceedd5ffac 113
agufal 4:a743917cd04c 114 EN = 0; // SHUTDOWN Mode
agufal 4:a743917cd04c 115
agufal 4:a743917cd04c 116 wait(0.1);
Alexisfdi 3:80ceedd5ffac 117 }
agufal 2:96f52163ca48 118
Alexisfdi 3:80ceedd5ffac 119 /*i2c.write(0xAA, data_write, 1);
agufal 2:96f52163ca48 120
agufal 2:96f52163ca48 121 char data_read[7];
agufal 2:96f52163ca48 122 i2c.read(0xAB, data_read, 7, true);
agufal 2:96f52163ca48 123
agufal 2:96f52163ca48 124 if(data_read[0] == 0)
agufal 2:96f52163ca48 125 led1 = 0;
agufal 0:c123bc196680 126
agufal 2:96f52163ca48 127 if(data_read[1] == 0)
agufal 2:96f52163ca48 128 led2 = 0;
agufal 2:96f52163ca48 129
agufal 2:96f52163ca48 130 if(data_read[2] == 0)
agufal 2:96f52163ca48 131 led3 = 0;
agufal 2:96f52163ca48 132
agufal 2:96f52163ca48 133 if(data_read[3] == 0)
agufal 2:96f52163ca48 134 led4 = 0;
agufal 2:96f52163ca48 135
Alexisfdi 3:80ceedd5ffac 136 i2c.stop();*/
agufal 2:96f52163ca48 137
agufal 2:96f52163ca48 138 //data_write[0] = 0x01;
agufal 2:96f52163ca48 139 //data_write[1] = 0x00;
agufal 2:96f52163ca48 140 //i2c.start();
agufal 2:96f52163ca48 141 //int status = i2c.write(addr,data_write, 2);
agufal 2:96f52163ca48 142
agufal 2:96f52163ca48 143 /*if (status != 0) { // Error
agufal 0:c123bc196680 144 while (1) {
agufal 2:96f52163ca48 145
agufal 0:c123bc196680 146 }
agufal 2:96f52163ca48 147 } */
agufal 2:96f52163ca48 148
agufal 2:96f52163ca48 149 //bool haPasado = false;
agufal 2:96f52163ca48 150
agufal 2:96f52163ca48 151 //i2c.frequency(200000);
agufal 0:c123bc196680 152
agufal 0:c123bc196680 153 /*while(1){
agufal 2:96f52163ca48 154
agufal 2:96f52163ca48 155 i2c.start();
agufal 2:96f52163ca48 156
agufal 2:96f52163ca48 157 wait(0.5);
agufal 2:96f52163ca48 158
agufal 2:96f52163ca48 159 int status = i2c.read(addr, data_read, 3);
agufal 2:96f52163ca48 160
agufal 2:96f52163ca48 161 if (status == 0)
agufal 2:96f52163ca48 162 haPasado = true;
agufal 2:96f52163ca48 163
agufal 2:96f52163ca48 164 if (!haPasado)
agufal 2:96f52163ca48 165 led4 = !led4;
agufal 2:96f52163ca48 166
agufal 2:96f52163ca48 167 i2c.stop();
agufal 2:96f52163ca48 168
agufal 2:96f52163ca48 169 }*/
agufal 0:c123bc196680 170 //i2c.start();
agufal 2:96f52163ca48 171 /*data_write[0] = 0x00;
agufal 0:c123bc196680 172 i2c.write(addr, data_write, 1,1);
agufal 0:c123bc196680 173
agufal 0:c123bc196680 174 i2c.read(addr, data_read, 2,0);
agufal 0:c123bc196680 175
agufal 0:c123bc196680 176 int ch0 =(data_read[0]<<8) | data_read[1];
agufal 0:c123bc196680 177
agufal 0:c123bc196680 178 if (ch0 < 0x001FF){
agufal 0:c123bc196680 179
agufal 0:c123bc196680 180 led1 = 0;
agufal 0:c123bc196680 181 led2 = 1;
agufal 0:c123bc196680 182 led3 = 1;
agufal 0:c123bc196680 183 }
agufal 0:c123bc196680 184 else if (ch0 > 0x001FF && ch0 < 0x0FFF) {
agufal 0:c123bc196680 185
agufal 0:c123bc196680 186 led1 = 1;
agufal 0:c123bc196680 187 led2 = 0;
agufal 0:c123bc196680 188 led3 = 1;
agufal 0:c123bc196680 189
agufal 0:c123bc196680 190 }
agufal 0:c123bc196680 191 else {
agufal 0:c123bc196680 192 led1 = 1;
agufal 0:c123bc196680 193 led2 = 1;
agufal 0:c123bc196680 194 led3 = 0;
agufal 0:c123bc196680 195 }
agufal 0:c123bc196680 196
agufal 0:c123bc196680 197 //pc.printf("channel 0: %x,%x \n", data_read[0], data_read[1]);
agufal 0:c123bc196680 198
agufal 0:c123bc196680 199 wait(0.5);
agufal 0:c123bc196680 200
agufal 0:c123bc196680 201 //i2c.stop();
agufal 0:c123bc196680 202 } */
agufal 0:c123bc196680 203 }