Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
I2cPeripherals/I2cPeripherals.cpp@0:cca1c4e84da4, 2013-07-11 (annotated)
- Committer:
- komaida424
- Date:
- Thu Jul 11 19:18:44 2013 +0000
- Revision:
- 0:cca1c4e84da4
- Child:
- 2:59ac9df97701
version1.03
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| komaida424 | 0:cca1c4e84da4 | 1 | #include "mbed.h" |
| komaida424 | 0:cca1c4e84da4 | 2 | #include "I2cPeripherals.h" |
| komaida424 | 0:cca1c4e84da4 | 3 | |
| komaida424 | 0:cca1c4e84da4 | 4 | I2cPeripherals::I2cPeripherals(PinName sda, PinName scl): _i2c(sda,scl) |
| komaida424 | 0:cca1c4e84da4 | 5 | { |
| komaida424 | 0:cca1c4e84da4 | 6 | _i2c.frequency(400000); |
| komaida424 | 0:cca1c4e84da4 | 7 | LCD_contrast = 60; |
| komaida424 | 0:cca1c4e84da4 | 8 | } |
| komaida424 | 0:cca1c4e84da4 | 9 | |
| komaida424 | 0:cca1c4e84da4 | 10 | void I2cPeripherals::start(char I2cAddr,int contrast) |
| komaida424 | 0:cca1c4e84da4 | 11 | { |
| komaida424 | 0:cca1c4e84da4 | 12 | LCD_contrast = contrast; |
| komaida424 | 0:cca1c4e84da4 | 13 | start(I2cAddr); |
| komaida424 | 0:cca1c4e84da4 | 14 | } |
| komaida424 | 0:cca1c4e84da4 | 15 | |
| komaida424 | 0:cca1c4e84da4 | 16 | void I2cPeripherals::start(char I2cAddr) |
| komaida424 | 0:cca1c4e84da4 | 17 | { |
| komaida424 | 0:cca1c4e84da4 | 18 | char tx[2]; |
| komaida424 | 0:cca1c4e84da4 | 19 | |
| komaida424 | 0:cca1c4e84da4 | 20 | switch (I2cAddr) { |
| komaida424 | 0:cca1c4e84da4 | 21 | case ST7032_ADDR: //I2C LCD |
| komaida424 | 0:cca1c4e84da4 | 22 | LCD_addr = I2cAddr; |
| komaida424 | 0:cca1c4e84da4 | 23 | LCD_data = 0x40; |
| komaida424 | 0:cca1c4e84da4 | 24 | tx[0] = 0x00; |
| komaida424 | 0:cca1c4e84da4 | 25 | tx[1] = 0x38; |
| komaida424 | 0:cca1c4e84da4 | 26 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 27 | tx[1] = 0x39; |
| komaida424 | 0:cca1c4e84da4 | 28 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 29 | tx[1] = 0x1F; |
| komaida424 | 0:cca1c4e84da4 | 30 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 31 | tx[1] = 0x70 | (LCD_contrast & 0x0F); |
| komaida424 | 0:cca1c4e84da4 | 32 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 33 | tx[1] = 0x5C | ((LCD_contrast >> 4) & 0x03); |
| komaida424 | 0:cca1c4e84da4 | 34 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 35 | tx[1] = 0x6A; |
| komaida424 | 0:cca1c4e84da4 | 36 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 37 | wait(0.3); |
| komaida424 | 0:cca1c4e84da4 | 38 | tx[1] = 0x38; |
| komaida424 | 0:cca1c4e84da4 | 39 | _i2c.write(I2cAddr,tx,2); // function set |
| komaida424 | 0:cca1c4e84da4 | 40 | tx[1] = 0x0C; |
| komaida424 | 0:cca1c4e84da4 | 41 | _i2c.write(I2cAddr,tx,2); // Display On |
| komaida424 | 0:cca1c4e84da4 | 42 | break; |
| komaida424 | 0:cca1c4e84da4 | 43 | case ACM1602_ADDR: //I2C LCD |
| komaida424 | 0:cca1c4e84da4 | 44 | LCD_addr = I2cAddr; |
| komaida424 | 0:cca1c4e84da4 | 45 | LCD_data = 0x80; |
| komaida424 | 0:cca1c4e84da4 | 46 | wait(0.015); |
| komaida424 | 0:cca1c4e84da4 | 47 | tx[0] = 0x00; |
| komaida424 | 0:cca1c4e84da4 | 48 | tx[1] = 0x01; |
| komaida424 | 0:cca1c4e84da4 | 49 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 50 | wait(0.005); |
| komaida424 | 0:cca1c4e84da4 | 51 | tx[1] = 0x38; |
| komaida424 | 0:cca1c4e84da4 | 52 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 53 | wait(0.005); |
| komaida424 | 0:cca1c4e84da4 | 54 | tx[1] = 0x0F; |
| komaida424 | 0:cca1c4e84da4 | 55 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 56 | wait(0.005); |
| komaida424 | 0:cca1c4e84da4 | 57 | tx[1] = 0x06; |
| komaida424 | 0:cca1c4e84da4 | 58 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 59 | wait(0.005); |
| komaida424 | 0:cca1c4e84da4 | 60 | break; |
| komaida424 | 0:cca1c4e84da4 | 61 | |
| komaida424 | 0:cca1c4e84da4 | 62 | case ITG3200_ADDR0: //gyro |
| komaida424 | 0:cca1c4e84da4 | 63 | case ITG3200_ADDR1: |
| komaida424 | 0:cca1c4e84da4 | 64 | Gyro_addr = I2cAddr; |
| komaida424 | 0:cca1c4e84da4 | 65 | Gyro_data = 0x1D; |
| komaida424 | 0:cca1c4e84da4 | 66 | tx[0] = 0x16; |
| komaida424 | 0:cca1c4e84da4 | 67 | tx[1] = 0x18; // 0x1D |
| komaida424 | 0:cca1c4e84da4 | 68 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 69 | tx[0] = 0x3E; |
| komaida424 | 0:cca1c4e84da4 | 70 | tx[1] = 0x01; |
| komaida424 | 0:cca1c4e84da4 | 71 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 72 | wait_ms(100); |
| komaida424 | 0:cca1c4e84da4 | 73 | break; |
| komaida424 | 0:cca1c4e84da4 | 74 | |
| komaida424 | 0:cca1c4e84da4 | 75 | case L3GD20_ADDR0: //gyro |
| komaida424 | 0:cca1c4e84da4 | 76 | case L3GD20_ADDR1: |
| komaida424 | 0:cca1c4e84da4 | 77 | Gyro_addr = I2cAddr; |
| komaida424 | 0:cca1c4e84da4 | 78 | Gyro_data = 0x28; |
| komaida424 | 0:cca1c4e84da4 | 79 | tx[0] = 0x20; |
| komaida424 | 0:cca1c4e84da4 | 80 | tx[1] = 0xFF; |
| komaida424 | 0:cca1c4e84da4 | 81 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 82 | tx[0] = 0x21; |
| komaida424 | 0:cca1c4e84da4 | 83 | tx[1] = 0x09; |
| komaida424 | 0:cca1c4e84da4 | 84 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 85 | tx[0] = 0x23; |
| komaida424 | 0:cca1c4e84da4 | 86 | tx[1] = 0xF0; |
| komaida424 | 0:cca1c4e84da4 | 87 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 88 | break; |
| komaida424 | 0:cca1c4e84da4 | 89 | |
| komaida424 | 0:cca1c4e84da4 | 90 | case LDXL345_ADDR0: //accelametor |
| komaida424 | 0:cca1c4e84da4 | 91 | case LDXL345_ADDR1: |
| komaida424 | 0:cca1c4e84da4 | 92 | Accel_addr = I2cAddr; |
| komaida424 | 0:cca1c4e84da4 | 93 | Accel_data = 0x32; |
| komaida424 | 0:cca1c4e84da4 | 94 | tx[0] = 0x2D; |
| komaida424 | 0:cca1c4e84da4 | 95 | tx[1] = 0x00; |
| komaida424 | 0:cca1c4e84da4 | 96 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 97 | tx[0] = 0x31; |
| komaida424 | 0:cca1c4e84da4 | 98 | tx[1] = 0x08; //full range 08:2g 09:4g 0A:8g 0B:16g |
| komaida424 | 0:cca1c4e84da4 | 99 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 100 | tx[0] = 0x2C; |
| komaida424 | 0:cca1c4e84da4 | 101 | tx[1] = 0x0C; //out rate 0xC:400Hz 0xD:800Hz |
| komaida424 | 0:cca1c4e84da4 | 102 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 103 | tx[0] = 0x2D; |
| komaida424 | 0:cca1c4e84da4 | 104 | tx[1] = 0x08; |
| komaida424 | 0:cca1c4e84da4 | 105 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 106 | break; |
| komaida424 | 0:cca1c4e84da4 | 107 | |
| komaida424 | 0:cca1c4e84da4 | 108 | case LPS331AP_ADDR0: //barometor |
| komaida424 | 0:cca1c4e84da4 | 109 | case LPS331AP_ADDR1: |
| komaida424 | 0:cca1c4e84da4 | 110 | barometor_addr = I2cAddr; |
| komaida424 | 0:cca1c4e84da4 | 111 | barometor_data = 0x2B; |
| komaida424 | 0:cca1c4e84da4 | 112 | tx[0] = 0x10; //RES_CNF |
| komaida424 | 0:cca1c4e84da4 | 113 | tx[1] = 0x19; |
| komaida424 | 0:cca1c4e84da4 | 114 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 115 | tx[0] = 0x20; // CTL_REG1 |
| komaida424 | 0:cca1c4e84da4 | 116 | tx[1] = 0x80; // power on |
| komaida424 | 0:cca1c4e84da4 | 117 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 118 | tx[0]= 0x21; // CTL_REG2 |
| komaida424 | 0:cca1c4e84da4 | 119 | tx[1]= 0x01; // one shot start |
| komaida424 | 0:cca1c4e84da4 | 120 | _i2c.write(I2cAddr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 121 | break; |
| komaida424 | 0:cca1c4e84da4 | 122 | } |
| komaida424 | 0:cca1c4e84da4 | 123 | } |
| komaida424 | 0:cca1c4e84da4 | 124 | |
| komaida424 | 0:cca1c4e84da4 | 125 | int I2cPeripherals::_putc(int value) { |
| komaida424 | 0:cca1c4e84da4 | 126 | _i2c.start(); |
| komaida424 | 0:cca1c4e84da4 | 127 | _i2c.write(LCD_addr); |
| komaida424 | 0:cca1c4e84da4 | 128 | _i2c.write(LCD_data); |
| komaida424 | 0:cca1c4e84da4 | 129 | _i2c.write(value); |
| komaida424 | 0:cca1c4e84da4 | 130 | _i2c.stop(); |
| komaida424 | 0:cca1c4e84da4 | 131 | return value; |
| komaida424 | 0:cca1c4e84da4 | 132 | } |
| komaida424 | 0:cca1c4e84da4 | 133 | |
| komaida424 | 0:cca1c4e84da4 | 134 | int I2cPeripherals::_getc() { |
| komaida424 | 0:cca1c4e84da4 | 135 | return -1; |
| komaida424 | 0:cca1c4e84da4 | 136 | } |
| komaida424 | 0:cca1c4e84da4 | 137 | |
| komaida424 | 0:cca1c4e84da4 | 138 | void I2cPeripherals::cls() |
| komaida424 | 0:cca1c4e84da4 | 139 | { |
| komaida424 | 0:cca1c4e84da4 | 140 | char tx[2] = { 0x00, 0x01 }; |
| komaida424 | 0:cca1c4e84da4 | 141 | _i2c.write(LCD_addr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 142 | } |
| komaida424 | 0:cca1c4e84da4 | 143 | |
| komaida424 | 0:cca1c4e84da4 | 144 | void I2cPeripherals::locate(int clm,int row) |
| komaida424 | 0:cca1c4e84da4 | 145 | { |
| komaida424 | 0:cca1c4e84da4 | 146 | char tx[2]; |
| komaida424 | 0:cca1c4e84da4 | 147 | |
| komaida424 | 0:cca1c4e84da4 | 148 | tx[0] = 0x00; |
| komaida424 | 0:cca1c4e84da4 | 149 | tx[1] = 0x80 + (row * 0x40) + clm; |
| komaida424 | 0:cca1c4e84da4 | 150 | _i2c.write(LCD_addr,tx,2); |
| komaida424 | 0:cca1c4e84da4 | 151 | |
| komaida424 | 0:cca1c4e84da4 | 152 | } |
| komaida424 | 0:cca1c4e84da4 | 153 | |
| komaida424 | 0:cca1c4e84da4 | 154 | int I2cPeripherals::angular(int *x,int *y,int *z) |
| komaida424 | 0:cca1c4e84da4 | 155 | { |
| komaida424 | 0:cca1c4e84da4 | 156 | char rx[6]; |
| komaida424 | 0:cca1c4e84da4 | 157 | char tx[1]; |
| komaida424 | 0:cca1c4e84da4 | 158 | tx[0] = Gyro_data | 0x80; |
| komaida424 | 0:cca1c4e84da4 | 159 | if ( _i2c.write(Gyro_addr,tx,1,true) != 0 ) { |
| komaida424 | 0:cca1c4e84da4 | 160 | x=y=z=0; |
| komaida424 | 0:cca1c4e84da4 | 161 | return false; |
| komaida424 | 0:cca1c4e84da4 | 162 | } |
| komaida424 | 0:cca1c4e84da4 | 163 | _i2c.read(Gyro_addr,rx,6); |
| komaida424 | 0:cca1c4e84da4 | 164 | *x = short(rx[0] << 8 | (uint8_t)rx[1]); |
| komaida424 | 0:cca1c4e84da4 | 165 | *y = short(rx[2] << 8 | (uint8_t)rx[3]); |
| komaida424 | 0:cca1c4e84da4 | 166 | *z = short(rx[4] << 8 | (uint8_t)rx[5]); |
| komaida424 | 0:cca1c4e84da4 | 167 | return true; |
| komaida424 | 0:cca1c4e84da4 | 168 | } |
| komaida424 | 0:cca1c4e84da4 | 169 | int I2cPeripherals::Acceleration(int *x,int *y,int *z) |
| komaida424 | 0:cca1c4e84da4 | 170 | { |
| komaida424 | 0:cca1c4e84da4 | 171 | //AXDL345 Data Read |
| komaida424 | 0:cca1c4e84da4 | 172 | char rx[6]; |
| komaida424 | 0:cca1c4e84da4 | 173 | char tx[1]; |
| komaida424 | 0:cca1c4e84da4 | 174 | tx[0] = Accel_data | 0x80; |
| komaida424 | 0:cca1c4e84da4 | 175 | if ( _i2c.write(Accel_addr,tx,1,true) != 0 ) { |
| komaida424 | 0:cca1c4e84da4 | 176 | x=y=z=0; |
| komaida424 | 0:cca1c4e84da4 | 177 | return false; |
| komaida424 | 0:cca1c4e84da4 | 178 | } |
| komaida424 | 0:cca1c4e84da4 | 179 | _i2c.read(Accel_addr,rx,6); |
| komaida424 | 0:cca1c4e84da4 | 180 | *y = -short(rx[1] << 8 | (uint8_t)rx[0]); |
| komaida424 | 0:cca1c4e84da4 | 181 | *x = short(rx[3] << 8 | (uint8_t)rx[2]); |
| komaida424 | 0:cca1c4e84da4 | 182 | *z = short(rx[5] << 8 | (uint8_t)rx[4]); |
| komaida424 | 0:cca1c4e84da4 | 183 | return true; |
| komaida424 | 0:cca1c4e84da4 | 184 | } |
| komaida424 | 0:cca1c4e84da4 | 185 | |
| komaida424 | 0:cca1c4e84da4 | 186 | int I2cPeripherals::pressure() |
| komaida424 | 0:cca1c4e84da4 | 187 | { |
| komaida424 | 0:cca1c4e84da4 | 188 | char tx[2]; |
| komaida424 | 0:cca1c4e84da4 | 189 | char rx[3]; |
| komaida424 | 0:cca1c4e84da4 | 190 | int press; |
| komaida424 | 0:cca1c4e84da4 | 191 | |
| komaida424 | 0:cca1c4e84da4 | 192 | tx[0]= 0x21; |
| komaida424 | 0:cca1c4e84da4 | 193 | rx[0] = 0; |
| komaida424 | 0:cca1c4e84da4 | 194 | if ( _i2c.write(barometor_addr,tx,1,true) != 0 ) |
| komaida424 | 0:cca1c4e84da4 | 195 | return 0; |
| komaida424 | 0:cca1c4e84da4 | 196 | _i2c.read (barometor_addr,rx,1); |
| komaida424 | 0:cca1c4e84da4 | 197 | while( rx[0]&0x01 ) { |
| komaida424 | 0:cca1c4e84da4 | 198 | wait(0.0001); |
| komaida424 | 0:cca1c4e84da4 | 199 | _i2c.write(barometor_addr,tx,1,true); |
| komaida424 | 0:cca1c4e84da4 | 200 | _i2c.read (barometor_addr,rx,1); |
| komaida424 | 0:cca1c4e84da4 | 201 | } |
| komaida424 | 0:cca1c4e84da4 | 202 | |
| komaida424 | 0:cca1c4e84da4 | 203 | tx[0]= 0x28 | 0x80; |
| komaida424 | 0:cca1c4e84da4 | 204 | _i2c.write(barometor_addr,tx,1,true); |
| komaida424 | 0:cca1c4e84da4 | 205 | _i2c.read (barometor_addr,rx,3); |
| komaida424 | 0:cca1c4e84da4 | 206 | |
| komaida424 | 0:cca1c4e84da4 | 207 | tx[0]= 0x21; // CTL_REG2 |
| komaida424 | 0:cca1c4e84da4 | 208 | tx[1]= 0x01; // one shot start |
| komaida424 | 0:cca1c4e84da4 | 209 | _i2c.write(barometor_addr, tx, 2); |
| komaida424 | 0:cca1c4e84da4 | 210 | |
| komaida424 | 0:cca1c4e84da4 | 211 | press =int( rx[2]<<16 | rx[1]<<8 | rx[0] ); |
| komaida424 | 0:cca1c4e84da4 | 212 | return press; |
| komaida424 | 0:cca1c4e84da4 | 213 | } |
| komaida424 | 0:cca1c4e84da4 | 214 | |
| komaida424 | 0:cca1c4e84da4 | 215 | |
| komaida424 | 0:cca1c4e84da4 | 216 | //Update-Methode |
| komaida424 | 0:cca1c4e84da4 | 217 | int I2cPeripherals::temperature() |
| komaida424 | 0:cca1c4e84da4 | 218 | { |
| komaida424 | 0:cca1c4e84da4 | 219 | char tx[1]; |
| komaida424 | 0:cca1c4e84da4 | 220 | char rx[2]; |
| komaida424 | 0:cca1c4e84da4 | 221 | int temp; |
| komaida424 | 0:cca1c4e84da4 | 222 | |
| komaida424 | 0:cca1c4e84da4 | 223 | tx[0]= 0x2B | 0x80; |
| komaida424 | 0:cca1c4e84da4 | 224 | if ( _i2c.write(barometor_addr,tx,1,true) != 0 ) |
| komaida424 | 0:cca1c4e84da4 | 225 | return 0; |
| komaida424 | 0:cca1c4e84da4 | 226 | _i2c.read (barometor_addr,rx,2); |
| komaida424 | 0:cca1c4e84da4 | 227 | |
| komaida424 | 0:cca1c4e84da4 | 228 | temp = short(rx[1]<<8 | rx[0]); |
| komaida424 | 0:cca1c4e84da4 | 229 | return temp; |
| komaida424 | 0:cca1c4e84da4 | 230 | }; |
| komaida424 | 0:cca1c4e84da4 | 231 | |
| komaida424 | 0:cca1c4e84da4 | 232 |