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

I2CDriverTest01.h

Committer:
humlet
Date:
2013-04-19
Revision:
3:967dde37e712
Child:
4:eafa7efcd771

File content as of revision 3:967dde37e712:

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

volatile int disco=0;
volatile osThreadId i2cDrvThrdID;

void highPrioCallBck(void const *args)
{
    osSignalSet(i2cDrvThrdID, 1<<5);
}

void highPrioThreadFun(void const *args)
{
    i2cDrvThrdID = Thread::gettid();
    I2CMasterRtos i2c(p28, p27);
    i2c.frequency(400000);
    const uint32_t adr = 0x70<<1;

    // trigger on srf08 ranging
    const char regNcmd[2]= {0x00,0x51};
    i2c.write(adr, regNcmd, 2);

    while(true) {
        Thread::signal_wait(1<<5,osWaitForever);
        // read back srf08 echo times (1+16 words)
        const char reg= 0x02;
        char result[64];
        uint32_t t1=us_ticker_read();
        i2c.read(adr, reg, result, 25, 1);

        uint32_t dt=us_ticker_read()-t1;
        uint16_t tm=((static_cast<uint16_t>(result[0])<<8)|static_cast<uint16_t>(result[1]));
        
        if(--disco>0) printf("tm=%4dus dt=%4dus\n",tm,dt);
    }
}

int doit()
{
    Thread highPrioThread(highPrioThreadFun,0,osPriorityAboveNormal);
    RtosTimer highPrioTicker(highPrioCallBck, osTimerPeriodic, (void *)0);

    Thread::wait(100);
    highPrioTicker.start(1);

    uint32_t cnt=0;
    while (++cnt<5) {
        const uint32_t dt=1e6;
        uint32_t tStart = us_ticker_read();
        uint32_t tLast = tStart;
        uint32_t tAct = tStart;
        uint32_t tMe=0;
        do {
            tAct=us_ticker_read();
            if(tAct>tLast) {
                if(tAct==tLast+1)++tMe;
            }
            tLast=tAct;
        } while(tAct-tStart<dt);
        printf("dc=%5.2f \n", 100.0*(float)tMe/dt);
        disco=10;
        while(disco>0);
        Thread::wait(1000);
    }
    return 0;
}