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.
Dependents: Bracky-MPU6050-DMP
Fork of MPU6050 by
I2Cdev.cpp
00001 // ported from arduino library: https://github.com/jrowberg/i2cdevlib 00002 // written by szymon gaertig (email: szymon@gaertig.com.pl, website: szymongaertig.pl) 00003 // Changelog: 00004 // 2013-01-08 - first release 00005 00006 #include "I2Cdev.h" 00007 00008 #define useDebugSerial 00009 00010 I2Cdev::I2Cdev(PinName i2cSda, PinName i2cScl): i2c(i2cSda,i2cScl), debugSerial(USBTX, USBRX) 00011 { 00012 00013 } 00014 00015 /** Read a single bit from an 8-bit device register. 00016 * @param devAddr I2C slave device address 00017 * @param regAddr Register regAddr to read from 00018 * @param bitNum Bit position to read (0-7) 00019 * @param data Container for single bit value 00020 * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) 00021 * @return Status of read operation (true = success) 00022 */ 00023 int8_t I2Cdev::readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t *data, uint16_t timeout) { 00024 uint8_t b; 00025 uint8_t count = readByte(devAddr, regAddr, &b, timeout); 00026 *data = b & (1 << bitNum); 00027 return count; 00028 } 00029 00030 /** Read a single bit from a 16-bit device register. 00031 * @param devAddr I2C slave device address 00032 * @param regAddr Register regAddr to read from 00033 * @param bitNum Bit position to read (0-15) 00034 * @param data Container for single bit value 00035 * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) 00036 * @return Status of read operation (true = success) 00037 */ 00038 int8_t I2Cdev::readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t *data, uint16_t timeout) { 00039 uint16_t b; 00040 uint8_t count = readWord(devAddr, regAddr, &b, timeout); 00041 *data = b & (1 << bitNum); 00042 return count; 00043 } 00044 00045 /** Read multiple bits from an 8-bit device register. 00046 * @param devAddr I2C slave device address 00047 * @param regAddr Register regAddr to read from 00048 * @param bitStart First bit position to read (0-7) 00049 * @param length Number of bits to read (not more than 8) 00050 * @param data Container for right-aligned value (i.e. '101' read from any bitStart position will equal 0x05) 00051 * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) 00052 * @return Status of read operation (true = success) 00053 */ 00054 int8_t I2Cdev::readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t *data, uint16_t timeout) { 00055 // 01101001 read byte 00056 // 76543210 bit numbers 00057 // xxx args: bitStart=4, length=3 00058 // 010 masked 00059 // -> 010 shifted 00060 uint8_t count, b; 00061 if ((count = readByte(devAddr, regAddr, &b, timeout)) != 0) { 00062 uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); 00063 b &= mask; 00064 b >>= (bitStart - length + 1); 00065 *data = b; 00066 } 00067 return count; 00068 } 00069 00070 /** Read multiple bits from a 16-bit device register. 00071 * @param devAddr I2C slave device address 00072 * @param regAddr Register regAddr to read from 00073 * @param bitStart First bit position to read (0-15) 00074 * @param length Number of bits to read (not more than 16) 00075 * @param data Container for right-aligned value (i.e. '101' read from any bitStart position will equal 0x05) 00076 * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) 00077 * @return Status of read operation (1 = success, 0 = failure, -1 = timeout) 00078 */ 00079 int8_t I2Cdev::readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t *data, uint16_t timeout) { 00080 // 1101011001101001 read byte 00081 // fedcba9876543210 bit numbers 00082 // xxx args: bitStart=12, length=3 00083 // 010 masked 00084 // -> 010 shifted 00085 uint8_t count; 00086 uint16_t w; 00087 if ((count = readWord(devAddr, regAddr, &w, timeout)) != 0) { 00088 uint16_t mask = ((1 << length) - 1) << (bitStart - length + 1); 00089 w &= mask; 00090 w >>= (bitStart - length + 1); 00091 *data = w; 00092 } 00093 return count; 00094 } 00095 /** Read single byte from an 8-bit device register. 00096 * @param devAddr I2C slave device address 00097 * @param regAddr Register regAddr to read from 00098 * @param data Container for byte value read from device 00099 * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) 00100 * @return Status of read operation (true = success) 00101 */ 00102 int8_t I2Cdev::readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint16_t timeout) { 00103 return readBytes(devAddr, regAddr, 1, data, timeout); 00104 } 00105 00106 /** Read single word from a 16-bit device register. 00107 * @param devAddr I2C slave device address 00108 * @param regAddr Register regAddr to read from 00109 * @param data Container for word value read from device 00110 * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) 00111 * @return Status of read operation (true = success) 00112 */ 00113 int8_t I2Cdev::readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, uint16_t timeout) { 00114 return readWords(devAddr, regAddr, 1, data, timeout); 00115 } 00116 00117 /** Read multiple bytes from an 8-bit device register. 00118 * @param devAddr I2C slave device address 00119 * @param regAddr First register regAddr to read from 00120 * @param length Number of bytes to read 00121 * @param data Buffer to store read data in 00122 * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) 00123 * @return Number of bytes read (-1 indicates failure) 00124 */ 00125 int8_t I2Cdev::readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data, uint16_t timeout) 00126 { 00127 char command[1]; 00128 command[0] = regAddr; 00129 char *redData = (char*)malloc(length); 00130 i2c.write(devAddr<<1, command, 1, true); 00131 i2c.read(devAddr<<1, redData, length); 00132 for(int i =0; i < length; i++) { 00133 data[i] = redData[i]; 00134 } 00135 free (redData); 00136 return length; 00137 } 00138 00139 int8_t I2Cdev::readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data, uint16_t timeout) 00140 { 00141 return 0; 00142 } 00143 00144 /** write a single bit in an 8-bit device register. 00145 * @param devAddr I2C slave device address 00146 * @param regAddr Register regAddr to write to 00147 * @param bitNum Bit position to write (0-7) 00148 * @param value New bit value to write 00149 * @return Status of operation (true = success) 00150 */ 00151 bool I2Cdev::writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data) { 00152 uint8_t b; 00153 readByte(devAddr, regAddr, &b); 00154 b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum)); 00155 return writeByte(devAddr, regAddr, b); 00156 } 00157 00158 /** write a single bit in a 16-bit device register. 00159 * @param devAddr I2C slave device address 00160 * @param regAddr Register regAddr to write to 00161 * @param bitNum Bit position to write (0-15) 00162 * @param value New bit value to write 00163 * @return Status of operation (true = success) 00164 */ 00165 bool I2Cdev::writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data) { 00166 uint16_t w; 00167 readWord(devAddr, regAddr, &w); 00168 w = (data != 0) ? (w | (1 << bitNum)) : (w & ~(1 << bitNum)); 00169 return writeWord(devAddr, regAddr, w); 00170 } 00171 00172 /** Write multiple bits in an 8-bit device register. 00173 * @param devAddr I2C slave device address 00174 * @param regAddr Register regAddr to write to 00175 * @param bitStart First bit position to write (0-7) 00176 * @param length Number of bits to write (not more than 8) 00177 * @param data Right-aligned value to write 00178 * @return Status of operation (true = success) 00179 */ 00180 bool I2Cdev::writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data) { 00181 // 010 value to write 00182 // 76543210 bit numbers 00183 // xxx args: bitStart=4, length=3 00184 // 00011100 mask byte 00185 // 10101111 original value (sample) 00186 // 10100011 original & ~mask 00187 // 10101011 masked | value 00188 uint8_t b; 00189 if (readByte(devAddr, regAddr, &b) != 0) { 00190 uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); 00191 data <<= (bitStart - length + 1); // shift data into correct position 00192 data &= mask; // zero all non-important bits in data 00193 b &= ~(mask); // zero all important bits in existing byte 00194 b |= data; // combine data with existing byte 00195 return writeByte(devAddr, regAddr, b); 00196 } else { 00197 return false; 00198 } 00199 } 00200 00201 /** Write multiple bits in a 16-bit device register. 00202 * @param devAddr I2C slave device address 00203 * @param regAddr Register regAddr to write to 00204 * @param bitStart First bit position to write (0-15) 00205 * @param length Number of bits to write (not more than 16) 00206 * @param data Right-aligned value to write 00207 * @return Status of operation (true = success) 00208 */ 00209 bool I2Cdev::writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data) { 00210 // 010 value to write 00211 // fedcba9876543210 bit numbers 00212 // xxx args: bitStart=12, length=3 00213 // 0001110000000000 mask byte 00214 // 1010111110010110 original value (sample) 00215 // 1010001110010110 original & ~mask 00216 // 1010101110010110 masked | value 00217 uint16_t w; 00218 if (readWord(devAddr, regAddr, &w) != 0) { 00219 uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); 00220 data <<= (bitStart - length + 1); // shift data into correct position 00221 data &= mask; // zero all non-important bits in data 00222 w &= ~(mask); // zero all important bits in existing word 00223 w |= data; // combine data with existing word 00224 return writeWord(devAddr, regAddr, w); 00225 } else { 00226 return false; 00227 } 00228 } 00229 00230 /** Write single byte to an 8-bit device register. 00231 * @param devAddr I2C slave device address 00232 * @param regAddr Register address to write to 00233 * @param data New byte value to write 00234 * @return Status of operation (true = success) 00235 */ 00236 bool I2Cdev::writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) { 00237 return writeBytes(devAddr, regAddr, 1, &data); 00238 } 00239 00240 /** Write single word to a 16-bit device register. 00241 * @param devAddr I2C slave device address 00242 * @param regAddr Register address to write to 00243 * @param data New word value to write 00244 * @return Status of operation (true = success) 00245 */ 00246 bool I2Cdev::writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data) { 00247 return writeWords(devAddr, regAddr, 1, &data); 00248 } 00249 00250 bool I2Cdev::writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data) 00251 { 00252 i2c.start(); 00253 i2c.write(devAddr<<1); 00254 i2c.write(regAddr); 00255 for(int i = 0; i < length; i++) { 00256 i2c.write(data[i]); 00257 } 00258 i2c.stop(); 00259 return true; 00260 } 00261 00262 bool I2Cdev::writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data) 00263 { 00264 return true; 00265 } 00266 00267 uint16_t I2Cdev::readTimeout(void) 00268 { 00269 return 0; 00270 }
Generated on Tue Jul 12 2022 16:21:07 by
