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