Takashi Kawasaki
/
mma7455l_test
Testing MMA7455L using SPI.
main.cpp@0:d342154843ce, 2010-07-23 (annotated)
- Committer:
- espresso3389
- Date:
- Fri Jul 23 11:21:39 2010 +0000
- Revision:
- 0:d342154843ce
Who changed what in which revision?
User | Revision | Line number | New 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 | } |