MPU6050 FreeIMU library

Dependents:   FreeIMU FreeIMU_external_magnetometer

Fork of MPU6050_tmp by Aloïs Wolff

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.

Revision:
9:d879deb55ae1
Parent:
7:95e74f827c08
Child:
10:11cc1b413f49
--- 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;