This is my quadcopter prototype software, still in development!

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers bma180.cpp Source File

bma180.cpp

00001 #include "bma180.h"
00002  
00003 #define ID         0x00
00004 #define VERSION    0x01
00005 #define XaccLSB    0x02
00006 #define XaccMSB    0x03
00007 #define YaccLSB    0x04
00008 #define YaccMSB    0x05
00009 #define ZaccLSB    0x06
00010 #define ZaccMSB    0x07
00011 #define CTRL_REG0  0x0D
00012 #define CTRL_REG1  0x0E
00013 #define CTRL_REG2  0x0F
00014 #define RESET      0x10
00015 #define BW         0x20
00016 #define CTRL_REG3  0x21
00017 #define CTRL_REG4  0x22
00018 #define DIS_I2C    0x27
00019 #define MODE       0x30
00020 #define RANGE      0x35
00021  
00022 #include "mbed.h"
00023  
00024 BMA180::BMA180(SPI& spi, PinName cs): _spi(spi), _cs(cs) {
00025     _spi.format(8,3);
00026     _spi.frequency(10000000);
00027         
00028 }
00029  
00030 void BMA180::readX() {
00031     _cs = 0;  
00032     _spi.write(XaccLSB | 0x80);
00033     data[0] = _spi.write(XaccMSB | 0x80);
00034     data[1] = _spi.write(XaccMSB | 0x80);
00035     _cs = 1;
00036     xi = (data[1]<<6) | (data[0]>>2);
00037 }
00038 void BMA180::readY() {
00039     _cs = 0; 
00040     _spi.write(YaccLSB | 0x80);
00041     data[2] = _spi.write(YaccMSB | 0x80);
00042     data[3] = _spi.write(YaccMSB | 0x80);
00043     _cs = 1;
00044     yi = (data[3]<<6) | (data[2]>>2);
00045 }
00046 void BMA180::readZ() {
00047     _cs = 0; 
00048     _spi.write(ZaccLSB | 0x80);
00049     data[4] = _spi.write(ZaccMSB | 0x80);
00050     data[5] = _spi.write(ZaccMSB | 0x80);
00051     _cs = 1;
00052     zi = (data[5]<<6) | (data[4]>>2);
00053 }
00054 void BMA180::readRaw() {
00055     _cs = 0; 
00056     _spi.write(XaccLSB | 0x80);
00057     data[0] = _spi.write(0x80);
00058     data[1] = _spi.write(0x80);
00059     data[2] = _spi.write(0x80);
00060     data[3] = _spi.write(0x80);
00061     data[4] = _spi.write(0x80);
00062     data[5] = _spi.write(0x80);
00063     _cs = 1;
00064     x = (data[1]<<6) | (data[0]>>2);
00065     if(x>=0x2000)
00066         {
00067             x -= 0x4000;
00068             xi = x;
00069         }
00070     else
00071         {    
00072             xi = x;
00073         }
00074     x/=0x2000;
00075     y = (data[3]<<6) | (data[2]>>2);
00076     if(y>=0x2000)
00077         {
00078             y -= 0x4000;
00079             yi =y;
00080         }
00081     else
00082         {
00083             yi = y;
00084         }
00085     y/=0x2000;
00086     z = (data[5]<<6) | (data[4]>>2);
00087     if(z>=0x2000)
00088         {
00089             z -= 0x4000;
00090             zi =z;
00091         }
00092     else
00093         {
00094             zi=z;
00095         }
00096     z/=0x2000;
00097 }
00098 char BMA180::write(char address,char data) {
00099      address &= 0x7F;
00100      _cs = 0;
00101      _spi.write(address);
00102      _spi.write(data);
00103      _cs = 1;
00104      return 1;
00105 }
00106 char BMA180::read(char address) {
00107     char data;
00108     address |= 0x80;
00109     _cs = 0;
00110     _spi.write(address);
00111     data = _spi.write(0xFF);
00112     _cs = 1;
00113     return data;
00114 }
00115 void BMA180::softReset() {
00116     _cs = 0; wait_us(2);
00117     _spi.write(RESET & 0x7F); wait_us(2);
00118     _spi.write(0xB6); 
00119     _cs = 1; wait_us(2);
00120 }   
00121 void BMA180::range(int r) {
00122     char byte;
00123     
00124     byte = read(CTRL_REG0);                         //unlock image writing
00125     _cs = 0; wait_us(2);
00126     _spi.write(CTRL_REG0 & 0x7F);
00127     _spi.write(byte | 0x10);
00128     _cs = 1; wait_us(2);
00129     
00130     byte = read(RANGE);                             //set the range of acceleromter
00131     byte &= 0xF1; 
00132     if(r>6)
00133         byte |= 0x02;
00134     else 
00135         byte |= (r<<1);
00136     _cs = 0; wait_us(2);
00137     _spi.write(RANGE & 0x7F);
00138     _spi.write(byte);
00139     _cs = 1; wait_us(2);
00140     
00141     byte = read(CTRL_REG0);                         //lock image writing
00142     _cs = 0; wait_us(2);
00143     _spi.write(CTRL_REG0 & 0x7F);
00144     _spi.write(byte & 0xEF);
00145     _cs = 1; wait_us(2);
00146 }
00147 void BMA180::bw(int r){
00148     char byte;
00149     
00150     byte = read(CTRL_REG0);                         //unlock image writing
00151     _cs = 0; wait_us(2);
00152     _spi.write(CTRL_REG0 & 0x7F);
00153     _spi.write(byte | 0x10);
00154     _cs = 1; wait_us(2);
00155     
00156     byte = read(BW);                                //bandwidth of acc
00157     byte &= 0x0F;
00158     if (r>9)
00159         byte |= 0x70;
00160     else
00161         byte |= (r<<4);    
00162     _cs = 0; wait_us(2);
00163     _spi.write(BW & 0x7F);
00164     _spi.write(byte);
00165     _cs = 1; wait_us(2);
00166     
00167     byte = read(CTRL_REG0);                         //lock image writing
00168     _cs = 0; wait_us(2);
00169     _spi.write(CTRL_REG0 & 0x7F); 
00170     _spi.write(byte & 0xEF); 
00171     _cs = 1; wait_us(2);
00172 }
00173     
00174 void BMA180::init() {
00175     char byte;
00176     wait_us(10000);
00177     byte = read(CTRL_REG0);                         //unlock image writing
00178     _cs = 0; wait_us(2);
00179     _spi.write(CTRL_REG0 & 0x7F); 
00180     _spi.write(byte | 0x10); 
00181     _cs = 1; wait_us(2);
00182      
00183     byte = read(DIS_I2C);                           //disable I2C
00184     _cs = 0; wait_us(2);
00185     _spi.write(DIS_I2C & 0x7F);
00186     _spi.write(byte | 0x01);
00187     _cs = 1; wait_us(2);
00188     
00189     byte = read(MODE);                              //mode of acc
00190     _cs = 0; wait_us(2);
00191     _spi.write(MODE & 0x7F);
00192     _spi.write(byte & 0xFC);
00193     _cs = 1; wait_us(2);
00194         
00195     byte = read(CTRL_REG0);                         //lock image writing
00196     _cs = 0; wait_us(2);
00197     _spi.write(CTRL_REG0 & 0x7F); 
00198     _spi.write(byte & 0xEF);
00199     _cs = 1; wait_us(2);
00200 }