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

I2CDriverTest02.h

Committer:
pHysiX
Date:
2014-05-17
Revision:
16:2c6432b37cce
Parent:
14:352609d395c1

File content as of revision 16:2c6432b37cce:

// exchange messages betwen the LPC1768's two i2c ports using high level reead/write commands
// changing master and slave mode on the fly

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

const int freq = 400000;
const int adr = 42<<1;
const int len=34;
const char mstMsg[len]="We are mbed, resistance is futile";
const char slvMsg[len]="Fine with me, let's get addicted ";

static void slvRxMsg(I2CSlaveRtos& slv)
{
    char rxMsg[len];
    memset(rxMsg,0,len);
    if ( slv.receive() == I2CSlave::WriteAddressed) {
        slv.read(rxMsg, len);
        printf("thread %X received message as i2c slave: '%s'\n",Thread::gettid(),rxMsg);
    } else
        printf("Ouch slv rx failure\n");
}

static void slvTxMsg(I2CSlaveRtos& slv)
{
    if ( slv.receive() == I2CSlave::ReadAddressed) {
        slv.write(slvMsg, len);
    } else
        printf("Ouch slv tx failure\n");
}

static void mstTxMsg(I2CMasterRtos& mst)
{
    mst.write(adr,mstMsg,len);
}

static void mstRxMsg(I2CMasterRtos& mst)
{
    char rxMsg[len];
    memset(rxMsg,0,len);
    mst.read(adr,rxMsg,len);
    printf("thread %X received message as i2c master: '%s'\n",Thread::gettid(),rxMsg);
}

static void channel1(void const *args)
{
    I2CMasterRtos mst(p9,p10,freq);
    I2CSlaveRtos slv(p9,p10,freq,adr);
    while(1) {
        slvRxMsg(slv);
        slvTxMsg(slv);
        Thread::wait(100);
        mstTxMsg(mst);
        Thread::wait(100);
        mstRxMsg(mst);
    }
}

void channel2(void const *args)
{
    I2CMasterRtos mst(p28,p27,freq);
    I2CSlaveRtos slv(p28,p27,freq,adr);
    while(1) {
        Thread::wait(100);
        mstTxMsg(mst);
        Thread::wait(100);
        mstRxMsg(mst);
        slvRxMsg(slv);
        slvTxMsg(slv);
    }
}

int doit()
{
    Thread selftalk01(channel1,0,osPriorityAboveNormal);
    Thread selftalk02(channel2,0,osPriorityAboveNormal);

    Thread::wait(10000);

    return 0;
}