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

Committer:
pHysiX
Date:
Sat May 17 11:56:46 2014 +0000
Revision:
16:2c6432b37cce
Parent:
14:352609d395c1
Modified to make 400kHz default

Who changed what in which revision?

UserRevisionLine numberNew contents of line
humlet 14:352609d395c1 1 // several threads try to read concurrently from a MPU6050 gyro/acc meter
humlet 14:352609d395c1 2 // via the same globally defined i2c driver interface
humlet 14:352609d395c1 3
humlet 14:352609d395c1 4 #include "mbed.h"
humlet 14:352609d395c1 5 #include "rtos.h"
humlet 14:352609d395c1 6 #include "I2CMasterRtos.h"
humlet 14:352609d395c1 7 #include "stdint.h"
humlet 14:352609d395c1 8
humlet 14:352609d395c1 9 const uint32_t i2cAdr = 0x68<<1;
humlet 14:352609d395c1 10 const char reg= 0x3b; // accelerometer x,y,z
humlet 14:352609d395c1 11 volatile osThreadId i2cDrvThrdID[2];
humlet 14:352609d395c1 12
humlet 14:352609d395c1 13 I2CMasterRtos g_i2c(p28, p27, 400000);
humlet 14:352609d395c1 14
humlet 14:352609d395c1 15 static void config(I2CMasterRtos& i2c);
humlet 14:352609d395c1 16
humlet 14:352609d395c1 17 void highPrioCallBck(void const *args)
humlet 14:352609d395c1 18 {
humlet 14:352609d395c1 19 osSignalSet(i2cDrvThrdID[1], 1<<5);
humlet 14:352609d395c1 20 osSignalSet(i2cDrvThrdID[0], 1<<5);
humlet 14:352609d395c1 21 }
humlet 14:352609d395c1 22
humlet 14:352609d395c1 23 void highPrioThreadFun(void const *args)
humlet 14:352609d395c1 24 {
humlet 14:352609d395c1 25 int thrdID = (int)args;
humlet 14:352609d395c1 26 i2cDrvThrdID[thrdID] = Thread::gettid();
humlet 14:352609d395c1 27
humlet 14:352609d395c1 28 char result[64];
humlet 14:352609d395c1 29 while(true) {
humlet 14:352609d395c1 30 Thread::signal_wait(1<<5,osWaitForever);
humlet 14:352609d395c1 31 g_i2c.lock();
humlet 14:352609d395c1 32 g_i2c.read(i2cAdr, reg, result, 3*2);
humlet 14:352609d395c1 33 printf("%s prio thread has read from MPU650:", (thrdID==0?"high ":"even higher"));
humlet 14:352609d395c1 34 for(int i=0; i<3; i++) {
humlet 14:352609d395c1 35 int16_t acc=((static_cast<int16_t>(result[i*2])<<8)|static_cast<int16_t>(result[i*2+1]));
humlet 14:352609d395c1 36 printf("%7i",acc);
humlet 14:352609d395c1 37 }
humlet 14:352609d395c1 38 printf("\n");
humlet 14:352609d395c1 39 g_i2c.unlock();
humlet 14:352609d395c1 40 }
humlet 14:352609d395c1 41 }
humlet 14:352609d395c1 42
humlet 14:352609d395c1 43 int doit()
humlet 14:352609d395c1 44 {
humlet 14:352609d395c1 45 I2CMasterRtos i2c(p28, p27, 100000);
humlet 14:352609d395c1 46 config(i2c);
humlet 14:352609d395c1 47
humlet 14:352609d395c1 48 Thread highPrioThread(highPrioThreadFun, 0, osPriorityAboveNormal);
humlet 14:352609d395c1 49 Thread evenHigherPrioThread(highPrioThreadFun, (void*)1, osPriorityHigh);
humlet 14:352609d395c1 50 RtosTimer highPrioTicker(highPrioCallBck, osTimerPeriodic, (void *)0);
humlet 14:352609d395c1 51
humlet 14:352609d395c1 52 Thread::wait(1000);
humlet 14:352609d395c1 53 highPrioTicker.start(503);
humlet 14:352609d395c1 54
humlet 14:352609d395c1 55 char result[64];
humlet 14:352609d395c1 56 for(int i=0; i<100; ++i) {
humlet 14:352609d395c1 57 i2c.read(i2cAdr, reg, result, 3*2);
humlet 14:352609d395c1 58 printf("normal prio thread has read from MPU650:");
humlet 14:352609d395c1 59 for(int i=0; i<3; i++) {
humlet 14:352609d395c1 60 int16_t acc=((static_cast<int16_t>(result[i*2])<<8)|static_cast<int16_t>(result[i*2+1]));
humlet 14:352609d395c1 61 printf("%7i",acc);
humlet 14:352609d395c1 62 }
humlet 14:352609d395c1 63 printf("\n");
humlet 14:352609d395c1 64 Thread::wait(100);
humlet 14:352609d395c1 65 }
humlet 14:352609d395c1 66 return 0;
humlet 14:352609d395c1 67 }
humlet 14:352609d395c1 68
humlet 14:352609d395c1 69 void readModWrite(I2CMasterRtos& i2c, uint8_t reg, uint8_t dta)
humlet 14:352609d395c1 70 {
humlet 14:352609d395c1 71 char rd1;
humlet 14:352609d395c1 72 int rStat1 = i2c.read(i2cAdr, reg, &rd1,1);
humlet 14:352609d395c1 73 char data[2];
humlet 14:352609d395c1 74 data[0]=(char)reg;
humlet 14:352609d395c1 75 data[1]=(char)dta;
humlet 14:352609d395c1 76 char rd2;
humlet 14:352609d395c1 77 int wStat = i2c.write(i2cAdr, data, 2);
humlet 14:352609d395c1 78 osDelay(100);
humlet 14:352609d395c1 79 int rStat2 = i2c.read(i2cAdr, reg, &rd2,1);
humlet 14:352609d395c1 80 printf("(%3x%3x%3x) %2x <- %2x => %2x -> %2x \n", rStat1, wStat, rStat2, reg, dta, rd1, rd2);
humlet 14:352609d395c1 81 }
humlet 14:352609d395c1 82
humlet 14:352609d395c1 83 static void config(I2CMasterRtos& i2c)
humlet 14:352609d395c1 84 {
humlet 14:352609d395c1 85 uint8_t ncfg=32;
humlet 14:352609d395c1 86 uint8_t regs[ncfg];
humlet 14:352609d395c1 87 uint8_t vals[ncfg];
humlet 14:352609d395c1 88 int cnt=0;
humlet 14:352609d395c1 89 regs[cnt]=0x6b;
humlet 14:352609d395c1 90 vals[cnt++]=(1<<7); // pwr 1 reg //: device reset
humlet 14:352609d395c1 91 regs[cnt]=0x6b;
humlet 14:352609d395c1 92 vals[cnt++]=1; // pwr 1 reg // clock from x gyro all pwr sav modes off
humlet 14:352609d395c1 93 regs[cnt]=0x19;
humlet 14:352609d395c1 94 vals[cnt++]=0; // sample rate divider reg // sapmle rate = gyro rate / (1+x)
humlet 14:352609d395c1 95 regs[cnt]=0x1a;
humlet 14:352609d395c1 96 vals[cnt++]=0x01;// conf reg // no ext frame sync / no dig low pass set to 1 => 1kHz Sampling
humlet 14:352609d395c1 97 regs[cnt]=0x1b;
humlet 14:352609d395c1 98 vals[cnt++]=0;// gyro conf reg // no test mode and gyro range 250°/s
humlet 14:352609d395c1 99 regs[cnt]=0x1c;
humlet 14:352609d395c1 100 vals[cnt++]=0;// accl conf reg // no test mode and accl range 2g
humlet 14:352609d395c1 101 regs[cnt]=0x23;
humlet 14:352609d395c1 102 //vals[cnt++]=0x1f<<3;// fifo conf reg // accl + all gyro -> fifo
humlet 14:352609d395c1 103 //regs[cnt]=0x6a;
humlet 14:352609d395c1 104 //vals[cnt++]=(1<<2); // pwr 1 reg // fifo reset
humlet 14:352609d395c1 105 //regs[cnt]=0x6a;
humlet 14:352609d395c1 106 //vals[cnt++]=(1<<6); // pwr 1 reg // fifo on
humlet 14:352609d395c1 107
humlet 14:352609d395c1 108 for(int i=0; i<cnt; i++)
humlet 14:352609d395c1 109 readModWrite(i2c, regs[i], vals[i]);
humlet 14:352609d395c1 110 }