Esta versión v6 pasa a ser el nuevo master. Funciona correctamente
Dependencies: ADXL345 Display1602 MSCFileSystem SDFileSystem mbed FATFileSystem
Diff: BMA180.cpp
- Revision:
- 0:a5367bd4e404
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BMA180.cpp Tue May 20 15:11:16 2014 +0000 @@ -0,0 +1,317 @@ +/** + * @author Jose L. Escalona (virtualmech) + */ + +#include "BMA180.h" + +BMA180::BMA180(PinName mosi, PinName miso, PinName sck, PinName cs) : spi_(mosi, miso, sck), nCS_(cs) + { + nCS_ = 1; + + wait_us(500); + + 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 + + + // SET RANGO // + + byte= read_reg(RANGE); // read + byte &= 0xF1; // set to 0 all 3 bits related to range + byte |= 0x02; // Rango +- 1.5g + write_reg(RANGE, byte); // Set RANGO, page 27 + + // SET FILTER BAND WITH // + + byte= read_reg(FILTER_BW); // read + byte &= 0x0F; // set to 0 all 4 bits related to filter + byte |= 0x70; // Filtro 1200 Hz (luego resulta ser un filtro de 472 Hz por ultra-low noise, ver p. 28 de datas sheet) + write_reg(FILTER_BW, byte); // Set BW, page 27 + + // SET NOISE Y POWER (mode_config)// + + byte= read_reg(NOISE_POWER); // read + byte &= 0xFC; // set to 0 all 2 bits related to mode configuration + byte |= 0x01; // Ultra low noise + write_reg(NOISE_POWER, byte); // Set mode_config, page 28 + + //------------------------- + //byte = read_reg(CTRL_REG3); + //byte |= 0x02; // set bit 1 enable interrupt + //byte |= 0x40; // set bit 6 slope mode + //byte |= 0x80; // set bit 7 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 BMA180::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"); +} + +void BMA180::ReadAccels_BMA180(int* Acc) { + 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 + + Acc[0] = ax; + Acc[1] = ay; + Acc[2] = az; +} + +//-----------------READ OUT the X-Y-Z values--------------- + +void BMA180::write_reg(uint8_t address, char data) { + address &= 0x7F; //Force a write (bit 7=0) + nCS_ = 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); + nCS_ = 1; + wait_us(2); +} + +char BMA180::read_reg(uint8_t address) { + char byte; + address |= 0x80; //Force a read (bit 7=1) + nCS_ = 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); + nCS_ = 1; + wait_us(2); + return byte; +} + +void BMA180::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 "); +} + +void BMA180::AcelerometroSleep(void) //OJO, NO ESTOY SEGURO DE QUE ESTA FUNCION ESTÉ BIEN IMPLEMENTADA +{ + char byte; + + byte = read_reg(0x0D); + byte &= 0xFD; + byte |= 0x02; + write_reg(0x0D, byte); +} +void BMA180::AcelerometroWakeUp(void) //OJO, NO ESTOY SEGURO DE QUE ESTA FUNCION ESTÉ BIEN IMPLEMENTADA +{ + char byte; + + byte = read_reg(0x0D); + byte &= 0xFD; + write_reg(0x0D, byte); +} + +void BMA180::AcelerometroLeeOffsets(int * offSet) //Lee los valores de los 3 offsets: x, y, z +{ + char x_lsb, x_msb; + char y_lsb, y_msb; + char z_lsb, z_msb; + signed short offx, offy, offz; + + offx = 0; + offy = 0; + offz = 0; + + x_msb = read_reg(0x38); + y_msb = read_reg(0x39); + z_msb = read_reg(0x3A); + + x_lsb = read_reg(0x35); + y_lsb = read_reg(0x36) << 4; + z_lsb = read_reg(0x36); + + //------------X---------------- + offx = (x_msb << 8) | x_lsb ; // combineer msb en lsb + offx = offx >> 4; // Get rid of 4 non-value bits in LSB + //------------Y---------------- + offy = (y_msb << 8) | y_lsb; // combineer msb en lsb + offy = offy >> 4; // Get rid of 4 non-value bits in LSB + //------------Z---------------- + offz = (z_msb << 8) | z_lsb; // combineer msb en lsb + offz = offz >> 4; // Get rid of 4 non-value bits in LSB + + offSet[0] = offx; + offSet[1] = offy; + offSet[2] = offz; +} + + +void BMA180::AcelerometroEscribeOffsets(char * offSet) //Escribe los valores de los 3 offsets: x, y, z +{ + ////////////////////////// + // Unlock image writing // + ////////////////////////// + + 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 + + char x_lsb, x_msb; + char y_lsb, y_msb; + char z_lsb, z_msb; + char reg_x, reg_yz; + + + x_msb = offSet[0]; + y_msb = offSet[1]; + z_msb = offSet[2]; + + x_lsb = offSet[3]; + y_lsb = offSet[4]; + z_lsb = offSet[5]; + + + // offset_finetuning to 11 + char fine_tu; + fine_tu = read_reg(0x22); + fine_tu &= 0xFC; + fine_tu |= 0x01; + write_reg(0x22,fine_tu); + + /////////////////////////////// + /// ESTABLECE EL OFFSET EN X // + /////////////////////////////// + + //Enable offset X + fine_tu = read_reg(0x0E); + fine_tu &= 0x7F; + fine_tu |= 0x80; + write_reg(0x0E,fine_tu); + + write_reg(0x38,x_msb); + + //Set X + reg_x = read_reg(0x35); + reg_x &= 0x0F; + x_lsb = x_lsb << 4; + reg_x |= x_lsb; + write_reg(0x35,reg_x); + + //Disable offset X y Enable Y + fine_tu &= 0x7F; + fine_tu |= 0x40; + write_reg(0x0E,fine_tu); + + /////////////////////////////// + /// ESTABLECE EL OFFSET EN Y // + /////////////////////////////// + + write_reg(0x39,y_msb); + + reg_yz = read_reg(0x36); + reg_yz &= 0xF0; + reg_yz |= y_lsb; + write_reg(0x36,reg_yz); + + //Disable offset Y y Enable Z + fine_tu &= 0xBF; + fine_tu |= 0x20; + write_reg(0x0E,fine_tu); + + /////////////////////////////// + /// ESTABLECE EL OFFSET EN Z // + /////////////////////////////// + + write_reg(0x3A,z_msb); + + reg_yz &= 0x0F; + reg_yz |= z_lsb << 4; + write_reg(0x36,reg_yz); + + //Disable offset Z + fine_tu &= 0xDF; + write_reg(0x0E,fine_tu); + + // offset_finetuning to 01 + fine_tu = read_reg(0x22); + fine_tu &= 0xFC; + fine_tu |= 0x01; + write_reg(0x22,fine_tu); + + //////////////////////// + // Lock image writing // + //////////////////////// + + byte = read_reg(CTRL_REG0); // Lock image writing + byte &= 0xEF; // REset bit 4 + write_reg(CTRL_REG0,byte); // Have to set ee_w to +} \ No newline at end of file