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
I2CDriverTest05.h@16:2c6432b37cce, 2014-05-17 (annotated)
- 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?
User | Revision | Line number | New 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 | } |