Ian Hua / I2cRtosDriver

Fork of I2cRtosDriver by Helmut Schmücker

Committer:
humlet
Date:
Fri Apr 19 21:33:29 2013 +0000
Revision:
3:967dde37e712
Child:
4:eafa7efcd771
refactored, compiles and crashes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
humlet 3:967dde37e712 1 #include "mbed.h"
humlet 3:967dde37e712 2 #include "rtos.h"
humlet 3:967dde37e712 3 #include "I2CMasterRtos.h"
humlet 3:967dde37e712 4 #include "stdint.h"
humlet 3:967dde37e712 5
humlet 3:967dde37e712 6 volatile int disco=0;
humlet 3:967dde37e712 7 volatile osThreadId i2cDrvThrdID;
humlet 3:967dde37e712 8
humlet 3:967dde37e712 9 void highPrioCallBck(void const *args)
humlet 3:967dde37e712 10 {
humlet 3:967dde37e712 11 osSignalSet(i2cDrvThrdID, 1<<5);
humlet 3:967dde37e712 12 }
humlet 3:967dde37e712 13
humlet 3:967dde37e712 14 void highPrioThreadFun(void const *args)
humlet 3:967dde37e712 15 {
humlet 3:967dde37e712 16 i2cDrvThrdID = Thread::gettid();
humlet 3:967dde37e712 17 I2CMasterRtos i2c(p28, p27);
humlet 3:967dde37e712 18 i2c.frequency(400000);
humlet 3:967dde37e712 19 const uint32_t adr = 0x70<<1;
humlet 3:967dde37e712 20
humlet 3:967dde37e712 21 // trigger on srf08 ranging
humlet 3:967dde37e712 22 const char regNcmd[2]= {0x00,0x51};
humlet 3:967dde37e712 23 i2c.write(adr, regNcmd, 2);
humlet 3:967dde37e712 24
humlet 3:967dde37e712 25 while(true) {
humlet 3:967dde37e712 26 Thread::signal_wait(1<<5,osWaitForever);
humlet 3:967dde37e712 27 // read back srf08 echo times (1+16 words)
humlet 3:967dde37e712 28 const char reg= 0x02;
humlet 3:967dde37e712 29 char result[64];
humlet 3:967dde37e712 30 uint32_t t1=us_ticker_read();
humlet 3:967dde37e712 31 i2c.read(adr, reg, result, 25, 1);
humlet 3:967dde37e712 32
humlet 3:967dde37e712 33 uint32_t dt=us_ticker_read()-t1;
humlet 3:967dde37e712 34 uint16_t tm=((static_cast<uint16_t>(result[0])<<8)|static_cast<uint16_t>(result[1]));
humlet 3:967dde37e712 35
humlet 3:967dde37e712 36 if(--disco>0) printf("tm=%4dus dt=%4dus\n",tm,dt);
humlet 3:967dde37e712 37 }
humlet 3:967dde37e712 38 }
humlet 3:967dde37e712 39
humlet 3:967dde37e712 40 int doit()
humlet 3:967dde37e712 41 {
humlet 3:967dde37e712 42 Thread highPrioThread(highPrioThreadFun,0,osPriorityAboveNormal);
humlet 3:967dde37e712 43 RtosTimer highPrioTicker(highPrioCallBck, osTimerPeriodic, (void *)0);
humlet 3:967dde37e712 44
humlet 3:967dde37e712 45 Thread::wait(100);
humlet 3:967dde37e712 46 highPrioTicker.start(1);
humlet 3:967dde37e712 47
humlet 3:967dde37e712 48 uint32_t cnt=0;
humlet 3:967dde37e712 49 while (++cnt<5) {
humlet 3:967dde37e712 50 const uint32_t dt=1e6;
humlet 3:967dde37e712 51 uint32_t tStart = us_ticker_read();
humlet 3:967dde37e712 52 uint32_t tLast = tStart;
humlet 3:967dde37e712 53 uint32_t tAct = tStart;
humlet 3:967dde37e712 54 uint32_t tMe=0;
humlet 3:967dde37e712 55 do {
humlet 3:967dde37e712 56 tAct=us_ticker_read();
humlet 3:967dde37e712 57 if(tAct>tLast) {
humlet 3:967dde37e712 58 if(tAct==tLast+1)++tMe;
humlet 3:967dde37e712 59 }
humlet 3:967dde37e712 60 tLast=tAct;
humlet 3:967dde37e712 61 } while(tAct-tStart<dt);
humlet 3:967dde37e712 62 printf("dc=%5.2f \n", 100.0*(float)tMe/dt);
humlet 3:967dde37e712 63 disco=10;
humlet 3:967dde37e712 64 while(disco>0);
humlet 3:967dde37e712 65 Thread::wait(1000);
humlet 3:967dde37e712 66 }
humlet 3:967dde37e712 67 return 0;
humlet 3:967dde37e712 68 }