MBA180 sensor SPI (four wire connection) with interrupt demo. Fifty samples are read, stored in a array and presented.

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
GerritPathuis
Date:
Sat Dec 18 11:13:09 2010 +0000
Commit message:
Revision 0.0 (16-12-2010)

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
diff -r 000000000000 -r 8ce1608bb6f8 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Dec 18 11:13:09 2010 +0000
@@ -0,0 +1,198 @@
+#include "mbed.h"
+#define BMA180_ID       0x00
+#define VERSION         0x01
+#define ACCXLSB         0x02
+#define ACCXMSB         0x03
+#define ACCYLSB         0x04
+#define ACCYMSB         0x05
+#define ACCZLSB         0x06
+#define ACCZMSB         0x07
+#define CTRL_REG0       0x0D
+#define DIS_I2C         0x27    // bit 0 must be 1 for SPI
+#define CTRL_REG3       0x21    // bit 1= new_data_int
+#define RESET           0x10    // soft reset
+
+/*-------------Hardware connections-------------
+By Gerrit Pathuis (gpa@quicknet.nl)
+MBA180 breakour board (sparkfun) is used
+VIO----- mbed Vout (3.3 Volt)
+SDI----- mbed mosi (p5)
+SDO----- mbed miso (p6)
+SCK----- mbed sck  (p7)
+CS------ mbed (p8)          // chip select
+INT----- mbed (p9)          // MBA give a interrupt when ready
+GND----- mbed GND (0 Volt)
+VDO----- mbed Vout (3.3 Volt)
+there are no additional external components used
+//----------------------------------------------*/
+
+SPI spi(p5,p6,p7); //mosi, miso, sclk
+DigitalOut cs(p8);
+InterruptIn event(p9);
+
+Serial pc(USBTX, USBRX); // tx, rx
+void init_SPI_BMA180(void);
+void soft_reset(void);
+void trigger(void);
+void new_data(void);
+void write_bits(char u);
+void write_reg(uint8_t address, char data);
+char read_reg(uint8_t address);
+void disable_int(void);
+
+struct sample {                 // reserve spave for 1000 samples
+    signed short x;
+    signed short y;
+    signed short z;
+    signed short t;
+} vib[1000+1];
+
+int sample_cnt;
+
+int main() {
+    int pp;
+    float xx, yy, zz;
+
+    init_SPI_BMA180();          // init the sensor
+    sample_cnt =0;              // start the counter
+    pc.printf("Start lurking  ");
+    while (sample_cnt <50) {
+        event.rise(&trigger);
+    }
+    disable_int();              // switch the BMA180 off
+    pc.printf("\n\r\nPresent the data\n\r");
+    for (pp=0; pp<50; pp +=1)  {
+        // 2^14 = 16384
+        // Range is +/1 2.0 G versnelling
+        xx = vib[pp].x/16384.0*4.0;
+        yy = vib[pp].y/16384.0*4.0;
+        zz = vib[pp].z/16384.0*4.0;
+        pc.printf("Sample %2d, Acc X= %0.4f, Y= %0.4f, Z= %0.4f \n\r", pp, xx, yy, zz);
+    }
+}
+
+void init_SPI_BMA180(void) {
+    char readVersion, readID;
+    char byte;
+    // Setup the spi for 8 bit data, high steady state clock,
+    // second edge capture, with a 10MHz clock rate
+
+    spi.frequency(10000000);        // 10 mHz page 59 of the BMA180 datasheet
+    spi.format(8,3);                // Not conform !!! page 58 of the BMA180 datasheet)
+    wait_ms(100);
+    readID = read_reg(BMA180_ID);
+    readVersion = read_reg(VERSION);
+    pc.printf("\n\r");
+    if (readID == 3) {
+        pc.printf("Connected to BMA180\n\r");
+        pc.printf("BMA180 Version %d\n\r", readVersion);
+    } else
+        pc.printf("Sorry not connected to BMA180 !!!\n\r", readID);
+
+    soft_reset();   // to copy EEprom into volatile area
+
+    //---------------------------
+    byte = read_reg(CTRL_REG0);             // Unlock image writing
+    byte |= 0x10;                           // Set bit 4
+    write_reg(CTRL_REG0,byte);              // Have to set ee_w to
+    //------------------------
+    byte= read_reg(DIS_I2C);                // read
+    byte |= 0x01;                           // set bit0 to 1, SPI only
+    write_reg(DIS_I2C, byte);               // Set spi, disable i2c, page 31
+    //-------------------------
+    byte = read_reg(CTRL_REG3);
+    byte |= 0x02;                           // set bit 1 enable interrupt
+    byte |= 0x40;                           // set bit 6 slope mode
+    byte |= 0x80;                           // set bit 6 slope alert
+    write_reg(CTRL_REG3,byte);              //
+    pc.printf("Enable interrupt bis is set ");
+    //------------------------------
+    byte = read_reg(CTRL_REG0);             // Lock image writing
+    byte &= 0xEF;                           // REset  bit 4
+    write_reg(CTRL_REG0,byte);              // Have to set ee_w to
+    //-------------------------------------------------------------------------------------
+    pc.printf("\n\rBMA init done    \n\r");
+}
+
+void soft_reset(void) {
+    // Write a soft reset
+    // to copy EEprom into volatile area, see mid page 22
+    write_reg(RESET, 0xB6);             // page 48
+    wait_ms(10);                        // wait 10 ms, see page 49
+    pc.printf("Soft reset, EEPROM copied    \n\r");
+}
+
+//-----------------READ OUT the X-Y-Z values---------------
+void trigger(void) {
+    char x_lsb, x_msb;
+    char y_lsb, y_msb;
+    char z_lsb, z_msb;
+    signed short ax, ay, az;
+
+    //------------X----------------
+    x_lsb = read_reg(ACCXLSB);
+    x_msb = read_reg(ACCXMSB);
+    ax = (x_msb << 8) |  x_lsb ;   // combineer msb en lsb
+    ax = ax >> 2;                  // Get rid of two non-value bits in LSB
+    //------------Y----------------
+    y_lsb = read_reg(ACCYLSB);
+    y_msb = read_reg(ACCYMSB);
+    ay = (y_msb << 8) | y_lsb;     // combineer msb en lsb
+    ay = ay >> 2;                  // Get rid of two non-value bits in LSB
+    //------------Z----------------
+    z_lsb = read_reg(ACCZLSB);
+    z_msb = read_reg(ACCZMSB);
+    az = (z_msb << 8) |  z_lsb;    //  combineer msb en lsb
+    az = az >> 2;                  // Get rid of two non-value bits in LSB
+
+    //----------shift into the array---------------------
+    vib[sample_cnt].x= ax;
+    vib[sample_cnt].y= ay;
+    vib[sample_cnt].z= az;
+    //---------counter------------
+    sample_cnt += 1;
+}
+
+void write_reg(uint8_t address, char data) {
+    address &= 0x7F;                        //Force a write (bit 7=0)
+    cs=0;                                   //Select SPI device
+    wait_us(2);
+    spi.write(address);                     //Send register location
+    wait_us(2);
+    spi.write(data);                        //Send value to record into register
+    wait_us(2);
+    cs=1;
+    wait_us(2);
+}
+
+char read_reg(uint8_t address) {
+    char byte;
+    address |= 0x80;                        //Force a read (bit 7=1)
+    cs=0;
+    wait_us(2);                             //Select SPI device
+    spi.write(address);                     //Send register location
+    wait_us(2);
+    byte=spi.write(0xFF);                   //Get the data
+    wait_us(2);
+    cs=1;
+    wait_us(2);
+    return byte;
+}
+
+void disable_int(void) {
+    char byte;
+    byte = read_reg(CTRL_REG0);             // Unlock image writing
+    byte |= 0x10;                           // Set bit 4
+    write_reg(CTRL_REG0,byte);              // Have to set ee_w to
+    //-------------------------
+    byte = read_reg(CTRL_REG3);
+    byte &= 0xFD;                           // REset bit 1 enable interrupt
+    write_reg(CTRL_REG3,byte);              //
+    pc.printf("\n\rDisable interrupt bis is set ");
+    //------------------------------
+    byte = read_reg(CTRL_REG0);             // Lock image writing
+    byte &= 0xEF;                           // REset  bit 4
+    write_reg(CTRL_REG0,byte);              // Have to set ee_w to
+    pc.printf("\n\rMBA180 in now switched off ");
+}
+
diff -r 000000000000 -r 8ce1608bb6f8 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Dec 18 11:13:09 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/e2ac27c8e93e