First Revision of BMA180 accelerometer to read X, Y, and Z acceleration

Dependents:   BMA180_1 BMA180_2 BMA180_3 BMA180_4

Files at this revision

API Documentation at this revision

Comitter:
jsermita
Date:
Wed Aug 01 20:27:16 2012 +0000
Commit message:
First revision of a BMA180 accelerometer library to read X, Y, and Z acceleration.

Changed in this revision

BMA180.cpp Show annotated file Show diff for this revision Revisions of this file
BMA180.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r ff755cb08068 BMA180.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BMA180.cpp	Wed Aug 01 20:27:16 2012 +0000
@@ -0,0 +1,153 @@
+#include "mbed.h"
+#include "BMA180.h"
+
+Serial pc(USBTX, USBRX); // tx, rx
+
+BMA180::BMA180(PinName sdi, PinName sdo, PinName sck, PinName csb, PinName interrupt) : _csb(csb), _interrupt(interrupt), spi(sdi, sdo, sck){
+             // mosi, miso, sclk
+    _csb = 1;
+    _interrupt = 0;
+}
+
+int BMA180::validate(char id, char ver) {
+    char readID;
+    int value = 0;
+    
+    readID = readReg(id);
+    
+    if(readID == 3) {
+        value = 1;
+    } else {
+        pc.printf("Lost Connection");
+        value = -1;
+    }
+    return value;
+}
+
+void BMA180::initBMA180(void) {
+    char readVersion, readID;
+    char byte; 
+    
+    readID = readReg(CHIPID);
+    readVersion = readReg(VERSION);
+    
+    if(readID == 3) {
+        pc.printf("Connected to BMA180\n\r");
+        pc.printf("BMA180 Version: %d\n\r", readVersion);
+        
+        reset();                                           
+    
+        byte = readReg(CTRL_REG0);     
+        byte |= 0x10;                                           // Set bit4 to 1 to enable self test and unlock image writing
+        writeReg(CTRL_REG0, byte);    
+    
+        byte = readReg(DIS_I2C);                               // Read register
+        //pc.printf("\n\rDisable I2C Before: %0.3X ", byte);
+        byte |= 0x01;                                          // Set bit0 to 1 for only SPI
+        writeReg(DIS_I2C, byte);                               // Set SPI and disable I2C as per pg 31 of datasheet
+        byte = readReg(RANGE);
+        //pc.printf("After: %0.3X", byte);
+    
+        byte = readReg(RANGE);                                 // Read register
+        //pc.printf("\n\rRange Before: %0.3X ", byte);
+        byte &= 0xFB;                                          // Set bit3,2,1 to 010 for 2g
+        byte |= 0x02;
+        writeReg(RANGE, byte);
+        byte = readReg(RANGE);
+        //pc.printf("After: %0.3X", byte);
+    
+        byte = readReg(CTRL_REG3);
+        //pc.printf("\n\rRegister 3 Before: %0.3X ", byte);
+        byte |= 0x02;                                           // Set bit1 to 1 to enable new data interrupts
+        byte |= 0x40;                                           // Set bit6 to 1 to enable slope mode
+        byte |= 0x80;                                           // Set bit6 to 1 to enable slope alert
+        writeReg(CTRL_REG3, byte);
+        //pc.printf("After: %0.3X", byte);
+        pc.printf("Interrupt is enabled.");
+    
+        byte = readReg(CTRL_REG0);
+        byte &= 0xEF;                                           // Set bit4 to 0 to disable self test and lock image writing
+        writeReg(CTRL_REG0, byte);
+        
+        pc.printf("\n\rBMA initialization complete.\n\r");
+        
+    } else {
+        pc.printf("Not connected to BMA180! ReadVersion:  %d ReadID:  %d\n\r", readVersion, readID);
+    }      
+}
+
+void BMA180::reset(void) {
+    writeReg(RESET, 0xB6);
+    wait_ms(10);
+    pc.printf("Soft Reset, EEPROM Copied\n\r");
+}
+
+void BMA180::readAxis(void) {
+    int x_msb, y_msb, z_msb;
+    char x_lsb, y_lsb, z_lsb;
+    short ax, ay, az;
+    float afx, afy, afz;
+    
+    x_lsb = readReg(ACCXLSB);                              // Read X LSB register
+    x_msb = readReg(ACCXMSB);                              // Read X MSB register
+    ax = (x_msb << 8) | x_lsb;                             // Concatinate X MSB and LSB
+    ax = ax >> 2;                                          // Remove unused first 2 LSB (16 bits to 14 bits)
+    afx = (float)ax*3/16384;                               
+    
+    y_lsb = readReg(ACCYLSB);                              // Read Y LSB register
+    y_msb = readReg(ACCYMSB);                              // Read Y MSB register
+    ay = (y_msb << 8) | y_lsb;                             // Concatinate Y MSB and LSB
+    ay = ay >> 2;                                          // Remove unused first 2 LSB
+    afy = (float)ay*3/16384;
+                                
+    z_lsb = readReg(ACCZLSB);                              // Read Z LSB register
+    z_msb = readReg(ACCZMSB);                              // Read Z MSB register
+    az = (z_msb << 8) | z_lsb;                             // Concatinate Z MSB and LSB
+    az = az >> 2;                                          // Remove unused first 2 LSB
+    afz = (float)az*3/16384;
+                             
+    
+    pc.printf("\n\rX: %05f Y: %05f Z: %05f", afx, afy, afz);
+}
+
+void BMA180::writeReg(uint8_t address, char data) {
+    address &= 0x7F;                                        // Set bit7 to 0 for write mode
+    _csb = 0;                                               // Select the device
+    wait_us(2);
+    spi.write(address);                                     // Send to data register location
+    wait_us(2);
+    spi.write(data);                                        // Send value to register
+    wait_us(2);
+    _csb = 1;                                               // Deselect the device
+}
+
+char BMA180::readReg(uint8_t address) {
+    char byte;
+
+    address |= 0x80;                                        // Set bit7 to 1 for read mode
+    _csb = 0;                                               // Select the device
+    wait_us(2);
+    spi.write(address);                                     // Send to data register location
+    wait_us(2);
+    byte = spi.write(address);                              // Get data
+    wait_us(2);
+    _csb = 1;                                               // Deselect the device
+    wait_us(2);
+    return byte;
+}
+
+void BMA180::disInt(void) {
+    char byte;
+    
+    byte = readReg(CTRL_REG0);     
+    byte |= 0x10;                                           // Set bit4 to 1 to enable self test and unlock image writing
+    writeReg(CTRL_REG0, byte);
+    
+    byte = readReg(CTRL_REG3);                              // Unlock image writing
+    byte &= 0xFD;                                           // Set bit1 to 0 to disable interrupt
+    writeReg(CTRL_REG3, byte);
+        
+    byte = readReg(CTRL_REG0);
+    byte &= 0xEF;                                           // Set bit4 to 0 to disable self test and lock image writing
+    writeReg(CTRL_REG0, byte);
+}
diff -r 000000000000 -r ff755cb08068 BMA180.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BMA180.h	Wed Aug 01 20:27:16 2012 +0000
@@ -0,0 +1,39 @@
+#include "mbed.h"
+#ifndef MBED_BMA180_H
+#define MBED_BMA180_H
+
+/******************DEFINED REGISTERS******************/
+#define CHIPID              0x00
+#define VERSION         0x01
+#define ACCXLSB         0x02
+#define ACCXMSB         0x03
+#define ACCYLSB         0x04
+#define ACCYMSB         0x05
+#define ACCZLSB         0x06
+#define ACCZMSB         0x07
+#define TEMP            0x08
+#define CTRL_REG0       0x0D
+#define BWTCS           0x20
+#define DIS_I2C         0x27    // bit0 must be 1 for SPI
+#define CTRL_REG3       0x21    // bit1 = new_data_int
+#define RESET           0x10    // soft reset
+#define RANGE           0x35    // 2g = 010
+
+class BMA180 {
+public:
+    BMA180(PinName _sdi, PinName _sdo, PinName _sck, PinName _cs, PinName _interrupt);
+    int validate(char idAddress, char verAddress);
+    void initBMA180(void);
+    void reset(void);
+    void readAxis(void);
+    void writeReg(uint8_t address, char data);
+    char readReg(uint8_t address);
+    void disInt(void);
+
+private:
+    SPI spi;
+    DigitalOut _csb;
+    DigitalOut _interrupt;
+};
+
+#endif
\ No newline at end of file