Testing MMA7455L using SPI.

Dependencies:   mbed

Committer:
espresso3389
Date:
Fri Jul 23 11:21:39 2010 +0000
Revision:
0:d342154843ce

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
espresso3389 0:d342154843ce 1 // Testing MMA7455L SPI
espresso3389 0:d342154843ce 2 #include "mbed.h"
espresso3389 0:d342154843ce 3
espresso3389 0:d342154843ce 4 SPI spi(p5, p6, p7);
espresso3389 0:d342154843ce 5 DigitalOut cs(p19);
espresso3389 0:d342154843ce 6 InterruptIn int1(p15), int2(p16);
espresso3389 0:d342154843ce 7 Serial pc(USBTX, USBRX);
espresso3389 0:d342154843ce 8 DigitalOut led1(LED1), led2(LED2), led3(LED3);
espresso3389 0:d342154843ce 9
espresso3389 0:d342154843ce 10 int read(int reg) {
espresso3389 0:d342154843ce 11 cs = 0;
espresso3389 0:d342154843ce 12 int v = spi.write(reg << 1);
espresso3389 0:d342154843ce 13 cs = 1;
espresso3389 0:d342154843ce 14 return v;
espresso3389 0:d342154843ce 15 }
espresso3389 0:d342154843ce 16
espresso3389 0:d342154843ce 17 void write(int reg, int val) {
espresso3389 0:d342154843ce 18 cs = 0;
espresso3389 0:d342154843ce 19 spi.write(0x80 | (reg << 1));
espresso3389 0:d342154843ce 20 spi.write(val);
espresso3389 0:d342154843ce 21 cs = 1;
espresso3389 0:d342154843ce 22 }
espresso3389 0:d342154843ce 23
espresso3389 0:d342154843ce 24 int read10(int reg) {
espresso3389 0:d342154843ce 25 cs = 0;
espresso3389 0:d342154843ce 26 int v = spi.write(reg << 1);
espresso3389 0:d342154843ce 27 v |= spi.write((reg + 1) << 1) << 8;
espresso3389 0:d342154843ce 28
espresso3389 0:d342154843ce 29 if(v & 0x200)
espresso3389 0:d342154843ce 30 v = v - 1024;
espresso3389 0:d342154843ce 31
espresso3389 0:d342154843ce 32 cs = 1;
espresso3389 0:d342154843ce 33 return v;
espresso3389 0:d342154843ce 34 }
espresso3389 0:d342154843ce 35
espresso3389 0:d342154843ce 36 int readSensorDirect(int sensor) {
espresso3389 0:d342154843ce 37 return read10(sensor * 2);
espresso3389 0:d342154843ce 38 }
espresso3389 0:d342154843ce 39
espresso3389 0:d342154843ce 40 const int SENSBUFSIZE = 100;
espresso3389 0:d342154843ce 41 int sensbuf[3][SENSBUFSIZE];
espresso3389 0:d342154843ce 42 int sens_ptr = 0;
espresso3389 0:d342154843ce 43
espresso3389 0:d342154843ce 44 void reset()
espresso3389 0:d342154843ce 45 {
espresso3389 0:d342154843ce 46 for(int i = 0; i < 3; i++)
espresso3389 0:d342154843ce 47 {
espresso3389 0:d342154843ce 48 int offset = readSensorDirect(i);
espresso3389 0:d342154843ce 49 write(0x10 + i * 2, offset * 2);
espresso3389 0:d342154843ce 50 }
espresso3389 0:d342154843ce 51 memset(sensbuf, 0, sizeof(sensbuf));
espresso3389 0:d342154843ce 52 }
espresso3389 0:d342154843ce 53
espresso3389 0:d342154843ce 54 void accumulate()
espresso3389 0:d342154843ce 55 {
espresso3389 0:d342154843ce 56 for(int i = 0; i < 3; i++)
espresso3389 0:d342154843ce 57 sensbuf[i][sens_ptr] = readSensorDirect(i);
espresso3389 0:d342154843ce 58 sens_ptr++;
espresso3389 0:d342154843ce 59 if(sens_ptr == SENSBUFSIZE)
espresso3389 0:d342154843ce 60 sens_ptr = 0;
espresso3389 0:d342154843ce 61 }
espresso3389 0:d342154843ce 62
espresso3389 0:d342154843ce 63 int readSensor(int sensor)
espresso3389 0:d342154843ce 64 {
espresso3389 0:d342154843ce 65 int* buf = sensbuf[sensor];
espresso3389 0:d342154843ce 66 int a = 0;
espresso3389 0:d342154843ce 67 for(int i = 0; i < SENSBUFSIZE; i++)
espresso3389 0:d342154843ce 68 a += buf[i];
espresso3389 0:d342154843ce 69 return a;
espresso3389 0:d342154843ce 70 }
espresso3389 0:d342154843ce 71
espresso3389 0:d342154843ce 72 void int1_raised() {
espresso3389 0:d342154843ce 73 pc.printf("1\n");
espresso3389 0:d342154843ce 74 //pc.printf("1: %06d,%06d,%06d\n", readX(), readY(), readZ());
espresso3389 0:d342154843ce 75 }
espresso3389 0:d342154843ce 76
espresso3389 0:d342154843ce 77 void int2_raised() {
espresso3389 0:d342154843ce 78 pc.printf("2\n");
espresso3389 0:d342154843ce 79 //pc.printf("2: %06d,%06d,%06d\n", readX(), readY(), readZ());
espresso3389 0:d342154843ce 80 }
espresso3389 0:d342154843ce 81
espresso3389 0:d342154843ce 82 const int INDSIZE = 5;
espresso3389 0:d342154843ce 83 const int FULLSIZE = INDSIZE * 2 + 1;
espresso3389 0:d342154843ce 84
espresso3389 0:d342154843ce 85 void bar(char* ind, int v)
espresso3389 0:d342154843ce 86 {
espresso3389 0:d342154843ce 87 memcpy(ind, "..........|.........." + (10 - INDSIZE), FULLSIZE);
espresso3389 0:d342154843ce 88 if(v < 0)
espresso3389 0:d342154843ce 89 {
espresso3389 0:d342154843ce 90 char* p = ind + INDSIZE - 1;
espresso3389 0:d342154843ce 91 for(int i = 0; i < INDSIZE; i++)
espresso3389 0:d342154843ce 92 {
espresso3389 0:d342154843ce 93 if(v) *p = '#';
espresso3389 0:d342154843ce 94 p--;
espresso3389 0:d342154843ce 95 v /= 5;
espresso3389 0:d342154843ce 96 }
espresso3389 0:d342154843ce 97 }
espresso3389 0:d342154843ce 98 else
espresso3389 0:d342154843ce 99 {
espresso3389 0:d342154843ce 100 char* p = ind + INDSIZE + 1;
espresso3389 0:d342154843ce 101 for(int i = 0; i < INDSIZE; i++)
espresso3389 0:d342154843ce 102 {
espresso3389 0:d342154843ce 103 if(v) *p = '#';
espresso3389 0:d342154843ce 104 p++;
espresso3389 0:d342154843ce 105 v /= 8;
espresso3389 0:d342154843ce 106 }
espresso3389 0:d342154843ce 107 }
espresso3389 0:d342154843ce 108 }
espresso3389 0:d342154843ce 109
espresso3389 0:d342154843ce 110 int main() {
espresso3389 0:d342154843ce 111
espresso3389 0:d342154843ce 112 wait_ms(300);
espresso3389 0:d342154843ce 113
espresso3389 0:d342154843ce 114 spi.format(8, 0);
espresso3389 0:d342154843ce 115 spi.frequency(1 * 1000* 1000);
espresso3389 0:d342154843ce 116
espresso3389 0:d342154843ce 117 // Device ID
espresso3389 0:d342154843ce 118 read(0xf);
espresso3389 0:d342154843ce 119 pc.printf("WHOAMI: %02X\n", read(0xf));
espresso3389 0:d342154843ce 120
espresso3389 0:d342154843ce 121 // $16: Mode Control Register
espresso3389 0:d342154843ce 122 // 0x0: Standby Mode
espresso3389 0:d342154843ce 123 // 0x1: Measurement Mode
espresso3389 0:d342154843ce 124 // 0x2: Level Detection Mode
espresso3389 0:d342154843ce 125 // 0x3: Pulse Detection
espresso3389 0:d342154843ce 126 int mode = 0x2;
espresso3389 0:d342154843ce 127
espresso3389 0:d342154843ce 128 // 0x0: 8g
espresso3389 0:d342154843ce 129 // 0x8: 4g
espresso3389 0:d342154843ce 130 // 0x4: 2g
espresso3389 0:d342154843ce 131 int glv = 0x0;
espresso3389 0:d342154843ce 132
espresso3389 0:d342154843ce 133 read(0x16);
espresso3389 0:d342154843ce 134 write(0x16, glv | mode);
espresso3389 0:d342154843ce 135 pc.printf("Mode Control Register: %02X\n", read(0x16));
espresso3389 0:d342154843ce 136
espresso3389 0:d342154843ce 137 // Optimal Settings for Freefall using Level Detection
espresso3389 0:d342154843ce 138 // 1. THOPT=0 Absolute Condition
espresso3389 0:d342154843ce 139 // 2. ZDA=0 Enable Z, YDA=0 Enable Y, XDA=0 Enable X
espresso3389 0:d342154843ce 140 write(0x18, read(0x18) & 0x87);
espresso3389 0:d342154843ce 141 // 3. Negative AND Logia Set LDPL
espresso3389 0:d342154843ce 142 write(0x19, read(0x19) & 0x1);
espresso3389 0:d342154843ce 143 // 4. Set Threshold = 1 g
espresso3389 0:d342154843ce 144 write(0x1a, 0x10);
espresso3389 0:d342154843ce 145
espresso3389 0:d342154843ce 146 /*
espresso3389 0:d342154843ce 147 // Optimal Settings for Motion using Level Detection
espresso3389 0:d342154843ce 148 // 1. THOPT=0 Absolute Condition
espresso3389 0:d342154843ce 149 // 2. ZDA=1 Disable Z, YDA=0 Enable Y, XDA=0 Enable X
espresso3389 0:d342154843ce 150 write(0x18, (read(0x18) & 0x87) | 0x20);
espresso3389 0:d342154843ce 151 // 3. Positive OR Logic Clear LDPL
espresso3389 0:d342154843ce 152 write(0x19, read(0x19) & 0xfe);
espresso3389 0:d342154843ce 153 // Set Threshold to 2 g
espresso3389 0:d342154843ce 154 write(0x1a, 0x20);
espresso3389 0:d342154843ce 155 */
espresso3389 0:d342154843ce 156
espresso3389 0:d342154843ce 157 /*
espresso3389 0:d342154843ce 158 // Optimal Settings for Single Pulse Detection
espresso3389 0:d342154843ce 159 // 1. Positive OR Logic PDPL=0
espresso3389 0:d342154843ce 160 write(0x19, read(0x19) & 0xfd);
espresso3389 0:d342154843ce 161 // 2. X,Y,Z enabled
espresso3389 0:d342154843ce 162 write(0x18, read(0x18) & 0x87);
espresso3389 0:d342154843ce 163 // 3. PDTH (Pulse Threshold) set to 4 g
espresso3389 0:d342154843ce 164 write(0x1b, 0x40);
espresso3389 0:d342154843ce 165 // 4. PD (Pulse Duration) set to 8 ms
espresso3389 0:d342154843ce 166 write(0x1c, 0x80);
espresso3389 0:d342154843ce 167 */
espresso3389 0:d342154843ce 168
espresso3389 0:d342154843ce 169 int1.rise(int1_raised);
espresso3389 0:d342154843ce 170 int2.rise(int2_raised);
espresso3389 0:d342154843ce 171
espresso3389 0:d342154843ce 172 reset();
espresso3389 0:d342154843ce 173 for(int i = 0;; i++)
espresso3389 0:d342154843ce 174 {
espresso3389 0:d342154843ce 175 wait_us(100);
espresso3389 0:d342154843ce 176 accumulate();
espresso3389 0:d342154843ce 177
espresso3389 0:d342154843ce 178 int x = readSensor(0);
espresso3389 0:d342154843ce 179 int y = readSensor(1);
espresso3389 0:d342154843ce 180 int z = readSensor(2);
espresso3389 0:d342154843ce 181 led1 = x / 100;
espresso3389 0:d342154843ce 182 led2 = y / 100;
espresso3389 0:d342154843ce 183 led3 = z / 100;
espresso3389 0:d342154843ce 184
espresso3389 0:d342154843ce 185 if (i % 100 == 0)
espresso3389 0:d342154843ce 186 {
espresso3389 0:d342154843ce 187 char buf[FULLSIZE * 3 + 3];
espresso3389 0:d342154843ce 188 memset(buf, ' ', FULLSIZE * 3 + 2);
espresso3389 0:d342154843ce 189 buf[FULLSIZE * 3 + 2] = 0;
espresso3389 0:d342154843ce 190 bar(buf, x);
espresso3389 0:d342154843ce 191 bar(buf + FULLSIZE + 1, y);
espresso3389 0:d342154843ce 192 bar(buf + (FULLSIZE + 1) * 2, z);
espresso3389 0:d342154843ce 193
espresso3389 0:d342154843ce 194 pc.printf("P:%s\n", buf);
espresso3389 0:d342154843ce 195 }
espresso3389 0:d342154843ce 196 }
espresso3389 0:d342154843ce 197 }