Testing MMA7455L using SPI.
Revision 0:d342154843ce, committed 2010-07-23
- Comitter:
- espresso3389
- Date:
- Fri Jul 23 11:21:39 2010 +0000
- Commit message:
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
| mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Fri Jul 23 11:21:39 2010 +0000
@@ -0,0 +1,197 @@
+// Testing MMA7455L SPI
+#include "mbed.h"
+
+SPI spi(p5, p6, p7);
+DigitalOut cs(p19);
+InterruptIn int1(p15), int2(p16);
+Serial pc(USBTX, USBRX);
+DigitalOut led1(LED1), led2(LED2), led3(LED3);
+
+int read(int reg) {
+ cs = 0;
+ int v = spi.write(reg << 1);
+ cs = 1;
+ return v;
+}
+
+void write(int reg, int val) {
+ cs = 0;
+ spi.write(0x80 | (reg << 1));
+ spi.write(val);
+ cs = 1;
+}
+
+int read10(int reg) {
+ cs = 0;
+ int v = spi.write(reg << 1);
+ v |= spi.write((reg + 1) << 1) << 8;
+
+ if(v & 0x200)
+ v = v - 1024;
+
+ cs = 1;
+ return v;
+}
+
+int readSensorDirect(int sensor) {
+ return read10(sensor * 2);
+}
+
+const int SENSBUFSIZE = 100;
+int sensbuf[3][SENSBUFSIZE];
+int sens_ptr = 0;
+
+void reset()
+{
+ for(int i = 0; i < 3; i++)
+ {
+ int offset = readSensorDirect(i);
+ write(0x10 + i * 2, offset * 2);
+ }
+ memset(sensbuf, 0, sizeof(sensbuf));
+}
+
+void accumulate()
+{
+ for(int i = 0; i < 3; i++)
+ sensbuf[i][sens_ptr] = readSensorDirect(i);
+ sens_ptr++;
+ if(sens_ptr == SENSBUFSIZE)
+ sens_ptr = 0;
+}
+
+int readSensor(int sensor)
+{
+ int* buf = sensbuf[sensor];
+ int a = 0;
+ for(int i = 0; i < SENSBUFSIZE; i++)
+ a += buf[i];
+ return a;
+}
+
+void int1_raised() {
+ pc.printf("1\n");
+ //pc.printf("1: %06d,%06d,%06d\n", readX(), readY(), readZ());
+}
+
+void int2_raised() {
+ pc.printf("2\n");
+ //pc.printf("2: %06d,%06d,%06d\n", readX(), readY(), readZ());
+}
+
+const int INDSIZE = 5;
+const int FULLSIZE = INDSIZE * 2 + 1;
+
+void bar(char* ind, int v)
+{
+ memcpy(ind, "..........|.........." + (10 - INDSIZE), FULLSIZE);
+ if(v < 0)
+ {
+ char* p = ind + INDSIZE - 1;
+ for(int i = 0; i < INDSIZE; i++)
+ {
+ if(v) *p = '#';
+ p--;
+ v /= 5;
+ }
+ }
+ else
+ {
+ char* p = ind + INDSIZE + 1;
+ for(int i = 0; i < INDSIZE; i++)
+ {
+ if(v) *p = '#';
+ p++;
+ v /= 8;
+ }
+ }
+}
+
+int main() {
+
+ wait_ms(300);
+
+ spi.format(8, 0);
+ spi.frequency(1 * 1000* 1000);
+
+ // Device ID
+ read(0xf);
+ pc.printf("WHOAMI: %02X\n", read(0xf));
+
+ // $16: Mode Control Register
+ // 0x0: Standby Mode
+ // 0x1: Measurement Mode
+ // 0x2: Level Detection Mode
+ // 0x3: Pulse Detection
+ int mode = 0x2;
+
+ // 0x0: 8g
+ // 0x8: 4g
+ // 0x4: 2g
+ int glv = 0x0;
+
+ read(0x16);
+ write(0x16, glv | mode);
+ pc.printf("Mode Control Register: %02X\n", read(0x16));
+
+ // Optimal Settings for Freefall using Level Detection
+ // 1. THOPT=0 Absolute Condition
+ // 2. ZDA=0 Enable Z, YDA=0 Enable Y, XDA=0 Enable X
+ write(0x18, read(0x18) & 0x87);
+ // 3. Negative AND Logia Set LDPL
+ write(0x19, read(0x19) & 0x1);
+ // 4. Set Threshold = 1 g
+ write(0x1a, 0x10);
+
+ /*
+ // Optimal Settings for Motion using Level Detection
+ // 1. THOPT=0 Absolute Condition
+ // 2. ZDA=1 Disable Z, YDA=0 Enable Y, XDA=0 Enable X
+ write(0x18, (read(0x18) & 0x87) | 0x20);
+ // 3. Positive OR Logic Clear LDPL
+ write(0x19, read(0x19) & 0xfe);
+ // Set Threshold to 2 g
+ write(0x1a, 0x20);
+ */
+
+ /*
+ // Optimal Settings for Single Pulse Detection
+ // 1. Positive OR Logic PDPL=0
+ write(0x19, read(0x19) & 0xfd);
+ // 2. X,Y,Z enabled
+ write(0x18, read(0x18) & 0x87);
+ // 3. PDTH (Pulse Threshold) set to 4 g
+ write(0x1b, 0x40);
+ // 4. PD (Pulse Duration) set to 8 ms
+ write(0x1c, 0x80);
+ */
+
+ int1.rise(int1_raised);
+ int2.rise(int2_raised);
+
+ reset();
+ for(int i = 0;; i++)
+ {
+ wait_us(100);
+ accumulate();
+
+ int x = readSensor(0);
+ int y = readSensor(1);
+ int z = readSensor(2);
+ led1 = x / 100;
+ led2 = y / 100;
+ led3 = z / 100;
+
+ if (i % 100 == 0)
+ {
+ char buf[FULLSIZE * 3 + 3];
+ memset(buf, ' ', FULLSIZE * 3 + 2);
+ buf[FULLSIZE * 3 + 2] = 0;
+ bar(buf, x);
+ bar(buf + FULLSIZE + 1, y);
+ bar(buf + (FULLSIZE + 1) * 2, z);
+
+ pc.printf("P:%s\n", buf);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Jul 23 11:21:39 2010 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/9114680c05da
Takashi Kawasaki