MPU6050 FreeIMU library
Dependents: FreeIMU FreeIMU_external_magnetometer
Fork of MPU6050_tmp by
Async MPU6050 library
My port of the MPU6050 library samples the chip at 500Hz using Timer. Async I2C is achieved using a custom I2C library, which supports I2C calls from interrupts. Link given below:
Import libraryMODI2C
Improvements to Olieman's MODI2C library. Supports calls from IRQ.
Difference between this port and the Arduino MPU6050 library
The getMotion6 function only returns a copy of the last obtained readings, which is sampled at a frequency of 500Hz (adjustable). Hence it can be called at any frequency without taxing the I2C.
Diff: I2Cdev.cpp
- Revision:
- 9:d879deb55ae1
- Parent:
- 7:95e74f827c08
- Child:
- 10:11cc1b413f49
diff -r 43f4b192e893 -r d879deb55ae1 I2Cdev.cpp --- a/I2Cdev.cpp Tue Nov 05 11:28:54 2013 +0000 +++ b/I2Cdev.cpp Sat Nov 09 08:51:07 2013 +0000 @@ -3,6 +3,7 @@ // Changelog: // 2013-01-08 - first release +#include "MODI2C.h" #include "I2Cdev.h" //#define useDebugSerial @@ -17,11 +18,6 @@ } -I2Cdev::I2Cdev(I2C i2c_): debugSerial(USBTX, USBRX), i2c(i2c_) -{ - -} - /** Read a single bit from an 8-bit device register. * @param devAddr I2C slave device address * @param regAddr Register regAddr to read from @@ -136,16 +132,17 @@ { char command[1]; command[0] = regAddr; - char *redData = (char*)malloc(length); - i2c.write(devAddr<<1, command, 1, true); - i2c.read((devAddr<<1)+1, redData, length); - for(int i =0; i < length; i++) { - data[i] = redData[i]; - } - free(redData); + i2c.write(devAddr, command, 1, true); + i2c.read(devAddr, (char*)data, length); return length; } +void I2Cdev::readBytes_nb(uint8_t devAddr, char *command, uint8_t length, uint8_t *data, uint32_t (*function)(uint32_t), void* param) +{ + i2c.write(devAddr, command, 1, true); + i2c.read_nb(devAddr, (char*)data, length, function, param); +} + int8_t I2Cdev::readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data, uint16_t timeout) { return 0; @@ -257,18 +254,41 @@ return writeWords(devAddr, regAddr, 1, &data); } +uint32_t writefinhdl(uint32_t param){ + //free((void*)param); + ((I2Cdev*)param)->freebuffer(); + return 0; +} + bool I2Cdev::writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data) { - i2c.start(); - i2c.write(devAddr<<1); - i2c.write(regAddr); - for(int i = 0; i < length; i++) { - i2c.write(data[i]); - } - i2c.stop(); + //i2c.start(); + //i2c.write(devAddr<<1); + //i2c.write(regAddr); + //for(int i = 0; i < length; i++) { + // i2c.write(data[i]); + //} + //i2c.stop(); + char* mem = NULL; + mem = allocbuffer();//(char*)malloc(length+1); + *mem = regAddr; + memcpy(mem+1, data, length); + + i2c.write(devAddr, mem, length+1, &writefinhdl, mem); return true; } +char *I2Cdev::allocbuffer(){ + char *buff = (char *)pool.alloc(); + queue.put(buff); + return buff; +} + +void I2Cdev::freebuffer(){ + osEvent evt = queue.get(0); + pool.free((char(*)[20])evt.value.p); +} + bool I2Cdev::writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data) { return true;