MBA180 sensor SPI (four wire connection) with interrupt demo. Fifty samples are read, stored in a array and presented.
Diff: main.cpp
- Revision:
- 0:8ce1608bb6f8
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 "); +} +