syouichi imamori
/
MulticopterQuadX
Quad X Type Multicopter
Diff: I2cPeripherals/I2cPeripherals.cpp
- Revision:
- 0:cca1c4e84da4
- Child:
- 2:59ac9df97701
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/I2cPeripherals/I2cPeripherals.cpp Thu Jul 11 19:18:44 2013 +0000 @@ -0,0 +1,232 @@ +#include "mbed.h" +#include "I2cPeripherals.h" + +I2cPeripherals::I2cPeripherals(PinName sda, PinName scl): _i2c(sda,scl) +{ + _i2c.frequency(400000); + LCD_contrast = 60; +} + +void I2cPeripherals::start(char I2cAddr,int contrast) +{ + LCD_contrast = contrast; + start(I2cAddr); +} + +void I2cPeripherals::start(char I2cAddr) +{ + char tx[2]; + + switch (I2cAddr) { + case ST7032_ADDR: //I2C LCD + LCD_addr = I2cAddr; + LCD_data = 0x40; + tx[0] = 0x00; + tx[1] = 0x38; + _i2c.write(I2cAddr,tx,2); + tx[1] = 0x39; + _i2c.write(I2cAddr,tx,2); + tx[1] = 0x1F; + _i2c.write(I2cAddr,tx,2); + tx[1] = 0x70 | (LCD_contrast & 0x0F); + _i2c.write(I2cAddr,tx,2); + tx[1] = 0x5C | ((LCD_contrast >> 4) & 0x03); + _i2c.write(I2cAddr,tx,2); + tx[1] = 0x6A; + _i2c.write(I2cAddr,tx,2); + wait(0.3); + tx[1] = 0x38; + _i2c.write(I2cAddr,tx,2); // function set + tx[1] = 0x0C; + _i2c.write(I2cAddr,tx,2); // Display On + break; + case ACM1602_ADDR: //I2C LCD + LCD_addr = I2cAddr; + LCD_data = 0x80; + wait(0.015); + tx[0] = 0x00; + tx[1] = 0x01; + _i2c.write(I2cAddr,tx,2); + wait(0.005); + tx[1] = 0x38; + _i2c.write(I2cAddr,tx,2); + wait(0.005); + tx[1] = 0x0F; + _i2c.write(I2cAddr,tx,2); + wait(0.005); + tx[1] = 0x06; + _i2c.write(I2cAddr,tx,2); + wait(0.005); + break; + + case ITG3200_ADDR0: //gyro + case ITG3200_ADDR1: + Gyro_addr = I2cAddr; + Gyro_data = 0x1D; + tx[0] = 0x16; + tx[1] = 0x18; // 0x1D + _i2c.write(I2cAddr,tx,2); + tx[0] = 0x3E; + tx[1] = 0x01; + _i2c.write(I2cAddr,tx,2); + wait_ms(100); + break; + + case L3GD20_ADDR0: //gyro + case L3GD20_ADDR1: + Gyro_addr = I2cAddr; + Gyro_data = 0x28; + tx[0] = 0x20; + tx[1] = 0xFF; + _i2c.write(I2cAddr,tx,2); + tx[0] = 0x21; + tx[1] = 0x09; + _i2c.write(I2cAddr,tx,2); + tx[0] = 0x23; + tx[1] = 0xF0; + _i2c.write(I2cAddr,tx,2); + break; + + case LDXL345_ADDR0: //accelametor + case LDXL345_ADDR1: + Accel_addr = I2cAddr; + Accel_data = 0x32; + tx[0] = 0x2D; + tx[1] = 0x00; + _i2c.write(I2cAddr,tx,2); + tx[0] = 0x31; + tx[1] = 0x08; //full range 08:2g 09:4g 0A:8g 0B:16g + _i2c.write(I2cAddr,tx,2); + tx[0] = 0x2C; + tx[1] = 0x0C; //out rate 0xC:400Hz 0xD:800Hz + _i2c.write(I2cAddr,tx,2); + tx[0] = 0x2D; + tx[1] = 0x08; + _i2c.write(I2cAddr,tx,2); + break; + + case LPS331AP_ADDR0: //barometor + case LPS331AP_ADDR1: + barometor_addr = I2cAddr; + barometor_data = 0x2B; + tx[0] = 0x10; //RES_CNF + tx[1] = 0x19; + _i2c.write(I2cAddr,tx,2); + tx[0] = 0x20; // CTL_REG1 + tx[1] = 0x80; // power on + _i2c.write(I2cAddr,tx,2); + tx[0]= 0x21; // CTL_REG2 + tx[1]= 0x01; // one shot start + _i2c.write(I2cAddr,tx,2); + break; + } +} + +int I2cPeripherals::_putc(int value) { + _i2c.start(); + _i2c.write(LCD_addr); + _i2c.write(LCD_data); + _i2c.write(value); + _i2c.stop(); + return value; +} + +int I2cPeripherals::_getc() { + return -1; +} + +void I2cPeripherals::cls() +{ + char tx[2] = { 0x00, 0x01 }; + _i2c.write(LCD_addr,tx,2); +} + +void I2cPeripherals::locate(int clm,int row) +{ + char tx[2]; + + tx[0] = 0x00; + tx[1] = 0x80 + (row * 0x40) + clm; + _i2c.write(LCD_addr,tx,2); + +} + +int I2cPeripherals::angular(int *x,int *y,int *z) +{ + char rx[6]; + char tx[1]; + tx[0] = Gyro_data | 0x80; + if ( _i2c.write(Gyro_addr,tx,1,true) != 0 ) { + x=y=z=0; + return false; + } + _i2c.read(Gyro_addr,rx,6); + *x = short(rx[0] << 8 | (uint8_t)rx[1]); + *y = short(rx[2] << 8 | (uint8_t)rx[3]); + *z = short(rx[4] << 8 | (uint8_t)rx[5]); + return true; +} +int I2cPeripherals::Acceleration(int *x,int *y,int *z) +{ + //AXDL345 Data Read + char rx[6]; + char tx[1]; + tx[0] = Accel_data | 0x80; + if ( _i2c.write(Accel_addr,tx,1,true) != 0 ) { + x=y=z=0; + return false; + } + _i2c.read(Accel_addr,rx,6); + *y = -short(rx[1] << 8 | (uint8_t)rx[0]); + *x = short(rx[3] << 8 | (uint8_t)rx[2]); + *z = short(rx[5] << 8 | (uint8_t)rx[4]); + return true; +} + +int I2cPeripherals::pressure() +{ + char tx[2]; + char rx[3]; + int press; + + tx[0]= 0x21; + rx[0] = 0; + if ( _i2c.write(barometor_addr,tx,1,true) != 0 ) + return 0; + _i2c.read (barometor_addr,rx,1); + while( rx[0]&0x01 ) { + wait(0.0001); + _i2c.write(barometor_addr,tx,1,true); + _i2c.read (barometor_addr,rx,1); + } + + tx[0]= 0x28 | 0x80; + _i2c.write(barometor_addr,tx,1,true); + _i2c.read (barometor_addr,rx,3); + + tx[0]= 0x21; // CTL_REG2 + tx[1]= 0x01; // one shot start + _i2c.write(barometor_addr, tx, 2); + + press =int( rx[2]<<16 | rx[1]<<8 | rx[0] ); + return press; +} + + +//Update-Methode +int I2cPeripherals::temperature() +{ + char tx[1]; + char rx[2]; + int temp; + + tx[0]= 0x2B | 0x80; + if ( _i2c.write(barometor_addr,tx,1,true) != 0 ) + return 0; + _i2c.read (barometor_addr,rx,2); + + temp = short(rx[1]<<8 | rx[0]); + return temp; +}; + +