Ian Hua / I2cRtosDriver

Fork of I2cRtosDriver by Helmut Schmücker

Committer:
humlet
Date:
Sat Apr 20 09:52:09 2013 +0000
Revision:
4:eafa7efcd771
Parent:
3:967dde37e712
Child:
6:5b98c902a659
running

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 "I2CSlaveRtos.h"
humlet 3:967dde37e712 5
humlet 4:eafa7efcd771 6 const int freq = 400000;
humlet 3:967dde37e712 7 const int adr = 42;
humlet 3:967dde37e712 8 const int len=42;
humlet 4:eafa7efcd771 9 const char* mstMsg="We are mbed, resistance is futile";
humlet 4:eafa7efcd771 10 const char* slvMsg="Fine with me, let's get addicted";
humlet 3:967dde37e712 11
humlet 4:eafa7efcd771 12 static void slvRxMsg(I2CSlaveRtos& slv)
humlet 3:967dde37e712 13 {
humlet 4:eafa7efcd771 14 char rxMsg[len];
humlet 4:eafa7efcd771 15 memset(rxMsg,0,len);
humlet 3:967dde37e712 16 if ( slv.receive() == I2CSlave::WriteAddressed) {
humlet 4:eafa7efcd771 17 slv.read(rxMsg, len);
humlet 4:eafa7efcd771 18 //rMsg[len-1]=0;
humlet 4:eafa7efcd771 19 printf("thread %X received message as i2c slave: '%s'\n",Thread::gettid(),rxMsg);
humlet 3:967dde37e712 20 } else
humlet 4:eafa7efcd771 21 printf("Ouch slv rx failure\n");
humlet 3:967dde37e712 22 }
humlet 3:967dde37e712 23
humlet 4:eafa7efcd771 24 static void slvTxMsg(I2CSlaveRtos& slv)
humlet 4:eafa7efcd771 25 {
humlet 4:eafa7efcd771 26 if ( slv.receive() == I2CSlave::ReadAddressed) {
humlet 4:eafa7efcd771 27 slv.write(slvMsg, len);
humlet 4:eafa7efcd771 28 } else
humlet 4:eafa7efcd771 29 printf("Ouch slv tx failure\n");
humlet 4:eafa7efcd771 30 }
humlet 4:eafa7efcd771 31
humlet 4:eafa7efcd771 32 static void mstTxMsg(I2CMasterRtos& mst)
humlet 3:967dde37e712 33 {
humlet 4:eafa7efcd771 34 mst.write(adr,mstMsg,len);
humlet 4:eafa7efcd771 35 //printf("thread %X has sent the message\n",Thread::gettid());
humlet 4:eafa7efcd771 36 }
humlet 4:eafa7efcd771 37
humlet 4:eafa7efcd771 38 static void mstRxMsg(I2CMasterRtos& mst)
humlet 4:eafa7efcd771 39 {
humlet 4:eafa7efcd771 40 char rxMsg[len];
humlet 4:eafa7efcd771 41 memset(rxMsg,0,len);
humlet 4:eafa7efcd771 42 mst.read(adr,rxMsg,len);
humlet 4:eafa7efcd771 43 printf("thread %X received message as i2c master: '%s'\n",Thread::gettid(),rxMsg);
humlet 3:967dde37e712 44 }
humlet 3:967dde37e712 45
humlet 3:967dde37e712 46 static void channel1(void const *args)
humlet 3:967dde37e712 47 {
humlet 3:967dde37e712 48 I2CMasterRtos mst(p9,p10,freq);
humlet 3:967dde37e712 49 I2CSlaveRtos slv(p9,p10,freq,adr);
humlet 3:967dde37e712 50 while(1) {
humlet 4:eafa7efcd771 51 slvRxMsg(slv);
humlet 4:eafa7efcd771 52 slvTxMsg(slv);
humlet 3:967dde37e712 53 Thread::wait(100);
humlet 4:eafa7efcd771 54 mstTxMsg(mst);
humlet 3:967dde37e712 55 Thread::wait(100);
humlet 4:eafa7efcd771 56 mstRxMsg(mst);
humlet 3:967dde37e712 57 }
humlet 3:967dde37e712 58 }
humlet 3:967dde37e712 59
humlet 3:967dde37e712 60 void channel2(void const *args)
humlet 3:967dde37e712 61 {
humlet 3:967dde37e712 62 I2CMasterRtos mst(p28,p27,freq);
humlet 3:967dde37e712 63 I2CSlaveRtos slv(p28,p27,freq,adr);
humlet 3:967dde37e712 64 while(1) {
humlet 4:eafa7efcd771 65 Thread::wait(100);
humlet 4:eafa7efcd771 66 mstTxMsg(mst);
humlet 3:967dde37e712 67 Thread::wait(100);
humlet 4:eafa7efcd771 68 mstRxMsg(mst);
humlet 4:eafa7efcd771 69 slvRxMsg(slv);
humlet 4:eafa7efcd771 70 slvTxMsg(slv);
humlet 3:967dde37e712 71 }
humlet 3:967dde37e712 72 }
humlet 3:967dde37e712 73
humlet 3:967dde37e712 74 int doit()
humlet 3:967dde37e712 75 {
humlet 3:967dde37e712 76 Thread selftalk01(channel1,0,osPriorityAboveNormal);
humlet 3:967dde37e712 77 Thread selftalk02(channel2,0,osPriorityAboveNormal);
humlet 3:967dde37e712 78
humlet 3:967dde37e712 79 uint32_t cnt=0;
humlet 3:967dde37e712 80 while (++cnt<5) {
humlet 3:967dde37e712 81 const uint32_t dt=1e6;
humlet 3:967dde37e712 82 uint32_t tStart = us_ticker_read();
humlet 3:967dde37e712 83 uint32_t tLast = tStart;
humlet 3:967dde37e712 84 uint32_t tAct = tStart;
humlet 3:967dde37e712 85 uint32_t tMe=0;
humlet 3:967dde37e712 86 do {
humlet 3:967dde37e712 87 tAct=us_ticker_read();
humlet 3:967dde37e712 88 if(tAct>tLast) {
humlet 3:967dde37e712 89 if(tAct==tLast+1)++tMe;
humlet 3:967dde37e712 90 }
humlet 3:967dde37e712 91 tLast=tAct;
humlet 3:967dde37e712 92 } while(tAct-tStart<dt);
humlet 3:967dde37e712 93 printf("dc=%5.2f \n", 100.0*(float)tMe/dt);
humlet 3:967dde37e712 94 }
humlet 3:967dde37e712 95 return 0;
humlet 3:967dde37e712 96 }
humlet 3:967dde37e712 97