I2CRTOS Driver by Helmut Schmücker. Removed included mbed-rtos library to prevent multiple definition. Make sure to include mbed-rtos library in your program!

Fork of I2cRtosDriver by Helmut Schmücker

I2CDriverTest03.h

Committer:
humlet
Date:
2013-04-28
Revision:
7:04824382eafb
Child:
13:530968937ccb

File content as of revision 7:04824382eafb:

#include "mbed.h"
#include "rtos.h"
#include "I2CMasterRtos.h"
#include "stdint.h"

const int dataReadySig = 1<<5;
osThreadId mainThreadID = 0;
char data[64];
int16_t fifo[16];
const int i2cAdr = 0x68<<1;
int fifoAdr = 0x72;

//Serial pc(USBTX, USBRX);

void configMPU6050(I2CMasterRtos& i2c);
void config(I2CMasterRtos& i2c);


void dataReadyIsr()
{
    osSignalSet(mainThreadID, dataReadySig);
}

void readModWrite(I2CMasterRtos& i2c, uint8_t reg, uint8_t dta)
{
    
    char rd1;
    int rStat1 = i2c.read(i2cAdr, reg, &rd1, 1);
    char data[2];
    data[0]=(char)reg;
    data[1]=(char)dta;
    char rd2;
    int wStat = i2c.write(i2cAdr, data, 2);
    osDelay(500);
    int rStat2 = i2c.read(i2cAdr, reg, &rd2, 1);
    printf("%2d%2d%2d  %2x <- %2x  => %2x -> %2x \n", rStat1, wStat, rStat2, reg, dta, rd1, rd2);
}


int doit()
{
    //pc.baud(115200);
    mainThreadID = osThreadGetId();

    I2CMasterRtos i2c(p28, p27,400000);
    osDelay(500);

    printf("Initialize ... \n");
    config(i2c);

    printf("Action!\n");

    InterruptIn dataReadyIrq(p8);
    dataReadyIrq.mode(PullNone);
    dataReadyIrq.rise(&dataReadyIsr);

    /*
    data[0]=0x6a;   // pwr 1 reg
    data[1]=(1<<6)|(1<<2); // fifo on
    i2c.write(i2cAdr,data,2,1);

    data[0]=0x38;   // irq conf  reg
    data[1]=1;      // irq on data ready
    i2c.write(i2cAdr,data,2,1);
    */
    //fifoAdr = 0x3b;
    char devNull;
    while(1) {
        osSignalWait(dataReadySig, 1000); // osWaitForever
        i2c.read(i2cAdr,fifoAdr,data,2);
        i2c.read(i2cAdr,fifoAdr+2,data+2,12);
        i2c.read(i2cAdr,0x3a,&devNull,1);
        for(int i=0; i<7; i++) {
            fifo[i] = (data[2*i]<<8) | data[2*i+1];
            printf("%8d",fifo[i]);
        }
        printf("     %x\n",devNull);

    }
    return 0;
}

static void config(I2CMasterRtos& i2c)
{
    uint8_t ncfg=32;
    uint8_t regs[ncfg];
    uint8_t vals[ncfg];
    int cnt=0;
    regs[cnt]=0x6b;
    vals[cnt++]=(1<<7); // pwr 1 reg //: device reset
    regs[cnt]=0x6b;
    vals[cnt++]=1; // pwr 1 reg // clock from x gyro all pwr sav modes off
    regs[cnt]=0x19;
    vals[cnt++]=199;  // sample rate divider reg  // sapmle rate = gyro rate / (1+x)
    regs[cnt]=0x1a;
    vals[cnt++]=1;// conf  reg // no ext frame sync / dig low pass set to 1 => 1kHz Sampling with ~200Hz bandwidth DLPF
    regs[cnt]=0x1b;
    vals[cnt++]=0;// gyro conf  reg // no test mode and gyro range 250°/s
    regs[cnt]=0x1c;
    vals[cnt++]=0;// accl conf  reg // no test mode and accl range 2g
    regs[cnt]=0x23;
    vals[cnt++]=0xf<<3;// fifo conf  reg // accl + all gyro -> fifo
    regs[cnt]=0x37;
    vals[cnt++]=(0<<7)|(0<<6)|(0<<5)|(0<<4); // irq conf  reg // act high | 0:pupu 1:opnDrn| pulse | clear on any read
    regs[cnt]=0x38;
    vals[cnt++]=1|(1<<4); // irq conf  reg // irq on data ready
    regs[cnt]=0x6a;
    vals[cnt++]=(1<<2); // pwr 1 reg // fifo reset
    regs[cnt]=0x6a;
    vals[cnt++]=(1<<6); // pwr 1 reg // fifo on

    /*
    readModWrite(i2c, regs[0], vals[0]);
    char reset=0xff;
    while(reset&(1<<7)) {
        osDelay(100);
        i2c.read(i2cAdr,0x6b,&reset,1,1);
    }
    */
    for(int i=0; i<cnt; i++)
        readModWrite(i2c, regs[i], vals[i]);
}

static void configMPU6050(I2CMasterRtos& i2c)
{

    data[0]=0x6b;   // pwr 1 reg
    data[1]=1<<7;   // device reset
    i2c.write(i2cAdr,data,2,1);
    char reset=0xff;
    while(reset&(1<<7)) {
        osDelay(100);
        i2c.read(i2cAdr,0x6b,&reset,1,1);
    }

    data[0]=0x19;   // sample rate divider reg
    data[1]=99;    // sapmle rate = gyro rate / (1+x)
    i2c.write(i2cAdr,data,2,1);

    data[0]=0x1a;   // conf  reg
    data[1]=1;      // no ext frame sync / dig low pass set to 1 => 1kHz Sampling with ~200Hz bandwidth DLPF
    i2c.write(i2cAdr,data,2,1);

    data[0]=0x1b;   // gyro conf  reg
    data[1]=0;      // no test mode and gyro range 250°/s
    i2c.write(i2cAdr,data,2,1);

    data[0]=0x1c;   // accl conf  reg
    data[1]=0;      // no test mode and accl range 2g
    i2c.write(i2cAdr,data,2,1);

    data[0]=0x23;   // fifo conf  reg
    data[1]=0xf<<3; // accl + all gyro -> fifo
    i2c.write(i2cAdr,data,2,1);

    data[0]=0x37;   // irq conf  reg
    data[1]=(1<<7)|(0<<6)|(0<<5)|(1<<4); // act high | pupu | pulse | clear on any read
    i2c.write(i2cAdr,data,2,1);

    /*
    data[0]=0x38;   // irq conf  reg
    data[1]=1;      // irq on data ready
    i2c.write(i2cAdr,data,2,1);

    data[0]=0x6a;   // pwr 1 reg
    data[1]=(1<<6); // fifo on
    i2c.write(i2cAdr,data,2,1);
    */
    data[0]=0x6b;   // pwr 1 reg
    data[1]=1;      // clock from x gyro all pwr sav modes off
    i2c.write(i2cAdr,data,2,1);
}