This is my quadcopter prototype software, still in development!
quadv3/bma180.cpp
- Committer:
- Anaesthetix
- Date:
- 2013-07-23
- Revision:
- 1:ac68f0368a77
- Parent:
- 0:978110f7f027
File content as of revision 1:ac68f0368a77:
#include "bma180.h" #define ID 0x00 #define VERSION 0x01 #define XaccLSB 0x02 #define XaccMSB 0x03 #define YaccLSB 0x04 #define YaccMSB 0x05 #define ZaccLSB 0x06 #define ZaccMSB 0x07 #define CTRL_REG0 0x0D #define CTRL_REG1 0x0E #define CTRL_REG2 0x0F #define RESET 0x10 #define BW 0x20 #define CTRL_REG3 0x21 #define CTRL_REG4 0x22 #define DIS_I2C 0x27 #define MODE 0x30 #define RANGE 0x35 #include "mbed.h" BMA180::BMA180(SPI& spi, PinName cs): _spi(spi), _cs(cs) { _spi.format(8,3); _spi.frequency(10000000); } void BMA180::readX() { _cs = 0; _spi.write(XaccLSB | 0x80); data[0] = _spi.write(XaccMSB | 0x80); data[1] = _spi.write(XaccMSB | 0x80); _cs = 1; xi = (data[1]<<6) | (data[0]>>2); } void BMA180::readY() { _cs = 0; _spi.write(YaccLSB | 0x80); data[2] = _spi.write(YaccMSB | 0x80); data[3] = _spi.write(YaccMSB | 0x80); _cs = 1; yi = (data[3]<<6) | (data[2]>>2); } void BMA180::readZ() { _cs = 0; _spi.write(ZaccLSB | 0x80); data[4] = _spi.write(ZaccMSB | 0x80); data[5] = _spi.write(ZaccMSB | 0x80); _cs = 1; zi = (data[5]<<6) | (data[4]>>2); } void BMA180::readRaw() { _cs = 0; _spi.write(XaccLSB | 0x80); data[0] = _spi.write(0x80); data[1] = _spi.write(0x80); data[2] = _spi.write(0x80); data[3] = _spi.write(0x80); data[4] = _spi.write(0x80); data[5] = _spi.write(0x80); _cs = 1; x = (data[1]<<6) | (data[0]>>2); if(x>=0x2000) { x -= 0x4000; xi = x; } else { xi = x; } x/=0x2000; y = (data[3]<<6) | (data[2]>>2); if(y>=0x2000) { y -= 0x4000; yi =y; } else { yi = y; } y/=0x2000; z = (data[5]<<6) | (data[4]>>2); if(z>=0x2000) { z -= 0x4000; zi =z; } else { zi=z; } z/=0x2000; } char BMA180::write(char address,char data) { address &= 0x7F; _cs = 0; _spi.write(address); _spi.write(data); _cs = 1; return 1; } char BMA180::read(char address) { char data; address |= 0x80; _cs = 0; _spi.write(address); data = _spi.write(0xFF); _cs = 1; return data; } void BMA180::softReset() { _cs = 0; wait_us(2); _spi.write(RESET & 0x7F); wait_us(2); _spi.write(0xB6); _cs = 1; wait_us(2); } void BMA180::range(int r) { char byte; byte = read(CTRL_REG0); //unlock image writing _cs = 0; wait_us(2); _spi.write(CTRL_REG0 & 0x7F); _spi.write(byte | 0x10); _cs = 1; wait_us(2); byte = read(RANGE); //set the range of acceleromter byte &= 0xF1; if(r>6) byte |= 0x02; else byte |= (r<<1); _cs = 0; wait_us(2); _spi.write(RANGE & 0x7F); _spi.write(byte); _cs = 1; wait_us(2); byte = read(CTRL_REG0); //lock image writing _cs = 0; wait_us(2); _spi.write(CTRL_REG0 & 0x7F); _spi.write(byte & 0xEF); _cs = 1; wait_us(2); } void BMA180::bw(int r){ char byte; byte = read(CTRL_REG0); //unlock image writing _cs = 0; wait_us(2); _spi.write(CTRL_REG0 & 0x7F); _spi.write(byte | 0x10); _cs = 1; wait_us(2); byte = read(BW); //bandwidth of acc byte &= 0x0F; if (r>9) byte |= 0x70; else byte |= (r<<4); _cs = 0; wait_us(2); _spi.write(BW & 0x7F); _spi.write(byte); _cs = 1; wait_us(2); byte = read(CTRL_REG0); //lock image writing _cs = 0; wait_us(2); _spi.write(CTRL_REG0 & 0x7F); _spi.write(byte & 0xEF); _cs = 1; wait_us(2); } void BMA180::init() { char byte; wait_us(10000); byte = read(CTRL_REG0); //unlock image writing _cs = 0; wait_us(2); _spi.write(CTRL_REG0 & 0x7F); _spi.write(byte | 0x10); _cs = 1; wait_us(2); byte = read(DIS_I2C); //disable I2C _cs = 0; wait_us(2); _spi.write(DIS_I2C & 0x7F); _spi.write(byte | 0x01); _cs = 1; wait_us(2); byte = read(MODE); //mode of acc _cs = 0; wait_us(2); _spi.write(MODE & 0x7F); _spi.write(byte & 0xFC); _cs = 1; wait_us(2); byte = read(CTRL_REG0); //lock image writing _cs = 0; wait_us(2); _spi.write(CTRL_REG0 & 0x7F); _spi.write(byte & 0xEF); _cs = 1; wait_us(2); }