i2c stand alone working

Dependencies:   mbed-rtos mbed

Fork of slave_working_obama by green rosh

Committer:
sakthipriya
Date:
Thu Apr 09 21:40:47 2015 +0000
Revision:
14:67cebba9c452
Parent:
13:fe24dd810078
i2c stand alone working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
viswachaitanya 0:24e80ff2c7b1 1 #include "mbed.h"
greenroshks 4:133b49d51b18 2 #include "rtos.h"
viswachaitanya 0:24e80ff2c7b1 3
greenroshks 12:f6b6954b65d6 4
viswachaitanya 0:24e80ff2c7b1 5 void write_to_master(char); //function to write data to master
greenroshks 4:133b49d51b18 6 Thread * ptr_t_i2c;
viswachaitanya 0:24e80ff2c7b1 7 I2CSlave slave(D14,D15); //configuring pins p27, p28 as I2Cslave
viswachaitanya 0:24e80ff2c7b1 8 Serial pc (USBTX,USBRX);
greenroshks 2:458f9e603814 9 InterruptIn interrupt(D9);
sakthipriya 8:04b912dc2443 10 InterruptIn master_reset(D11);
greenroshks 5:ce0bb4174ca4 11 DigitalOut data_ready(D10);
greenroshks 5:ce0bb4174ca4 12 int i2c_status=0; //read/write mode for i2c 0 : write2slave, 1 : write2master
sakthipriya 8:04b912dc2443 13 int reset=0;
sakthipriya 8:04b912dc2443 14 int temp;
greenroshks 13:fe24dd810078 15 Timer t;
sakthipriya 14:67cebba9c452 16 Timer t1;
greenroshks 13:fe24dd810078 17 Timer t2;
sakthipriya 14:67cebba9c452 18 Timer t3;
sakthipriya 14:67cebba9c452 19
greenroshks 4:133b49d51b18 20
greenroshks 4:133b49d51b18 21 typedef struct
greenroshks 2:458f9e603814 22 {
greenroshks 4:133b49d51b18 23 char data; // To avoid dynamic memory allocation
greenroshks 4:133b49d51b18 24 int length;
greenroshks 4:133b49d51b18 25 }i2c_data;
viswachaitanya 0:24e80ff2c7b1 26
greenroshks 4:133b49d51b18 27 Mail<i2c_data,16> i2c_data_receive;
greenroshks 4:133b49d51b18 28 Mail<i2c_data,16> i2c_data_send;
sakthipriya 10:f2a8d9ac49d6 29
greenroshks 12:f6b6954b65d6 30 unsigned char* add_reg = (unsigned char*)0x40067000;
greenroshks 12:f6b6954b65d6 31 unsigned char* data_reg = (unsigned char*)0x40067004;
greenroshks 12:f6b6954b65d6 32 unsigned char* status_reg = (unsigned char*)0x40067003;
greenroshks 12:f6b6954b65d6 33 unsigned char* c1_reg = (unsigned char*)0x40067002;
greenroshks 12:f6b6954b65d6 34 unsigned char* c2_reg = (unsigned char*)0x40067005;
greenroshks 12:f6b6954b65d6 35 unsigned char* freq_reg = (unsigned char*)0x40067001;
sakthipriya 14:67cebba9c452 36 //int slave.receive() =0;
greenroshks 5:ce0bb4174ca4 37 void FUNC_I2C_WRITE2CDMS(char *data, int length=1)
greenroshks 4:133b49d51b18 38 {
raizel_varun 6:8aea752c6eda 39 int slave_status = 1;
sakthipriya 10:f2a8d9ac49d6 40 // printf("\nData is %c\n\r",*data);
sakthipriya 10:f2a8d9ac49d6 41
greenroshks 13:fe24dd810078 42
greenroshks 13:fe24dd810078 43 //wait_ms(10);
greenroshks 12:f6b6954b65d6 44 if(interrupt ==1)
sakthipriya 10:f2a8d9ac49d6 45 {
sakthipriya 10:f2a8d9ac49d6 46 //wait(2);
greenroshks 12:f6b6954b65d6 47 //printf("\nin int loop\n");
greenroshks 13:fe24dd810078 48 //t.stop();
greenroshks 13:fe24dd810078 49 //t2.start();
sakthipriya 14:67cebba9c452 50
greenroshks 13:fe24dd810078 51 //t2.stop();
sakthipriya 14:67cebba9c452 52 //printf("\n%d\n",slave.receive());
sakthipriya 14:67cebba9c452 53
sakthipriya 14:67cebba9c452 54 //printf("\n status %d \n",slave.receive());
sakthipriya 14:67cebba9c452 55 if(slave.receive() == 0)
sakthipriya 14:67cebba9c452 56 t2.stop();
sakthipriya 14:67cebba9c452 57 t.stop();
sakthipriya 14:67cebba9c452 58
sakthipriya 14:67cebba9c452 59 if( slave.receive()==1)
greenroshks 2:458f9e603814 60 {
sakthipriya 10:f2a8d9ac49d6 61 // printf("\nslave receive b4: \n");
greenroshks 13:fe24dd810078 62 //t.stop();
greenroshks 13:fe24dd810078 63 //t2.start();
sakthipriya 14:67cebba9c452 64 t2.stop();
sakthipriya 14:67cebba9c452 65 t3.start();
greenroshks 5:ce0bb4174ca4 66 slave_status=slave.write(data,length);
sakthipriya 14:67cebba9c452 67 t3.stop();
sakthipriya 14:67cebba9c452 68
sakthipriya 10:f2a8d9ac49d6 69 // printf("\nData sent to CDMS is %c\n\r",*data);
sakthipriya 10:f2a8d9ac49d6 70 // printf("\n\r write");
sakthipriya 10:f2a8d9ac49d6 71 //printf("\nslave receive after: %d \n",slave.receive());
greenroshks 2:458f9e603814 72
viswachaitanya 0:24e80ff2c7b1 73 }
greenroshks 12:f6b6954b65d6 74
greenroshks 12:f6b6954b65d6 75
sakthipriya 14:67cebba9c452 76 else if( slave.receive()==3 || slave.receive()==2)
sakthipriya 8:04b912dc2443 77 {
greenroshks 13:fe24dd810078 78 //t.stop();
greenroshks 13:fe24dd810078 79 //printf("\nh\n");
sakthipriya 14:67cebba9c452 80 t2.stop();
sakthipriya 14:67cebba9c452 81 t3.start();
sakthipriya 8:04b912dc2443 82 slave_status=slave.read(data,length);
sakthipriya 14:67cebba9c452 83 t3.stop();
greenroshks 12:f6b6954b65d6 84
sakthipriya 8:04b912dc2443 85 }
sakthipriya 10:f2a8d9ac49d6 86 //printf("\n \r done while loop %d \n",slave.receive());
sakthipriya 10:f2a8d9ac49d6 87 //printf("\n\r ahoy drhghhhhhhhhhhh\n");
sakthipriya 11:907c02e9fb00 88 // printf("\n\r %d %d %d %d %d \n",*data_reg,*status_reg,*c1_reg,*c2_reg,*freq_reg);
sakthipriya 8:04b912dc2443 89
greenroshks 2:458f9e603814 90 }
sakthipriya 14:67cebba9c452 91 printf("\n%d\r",t.read_us());
greenroshks 13:fe24dd810078 92 t.reset();
greenroshks 13:fe24dd810078 93 printf("\n%d\r",t2.read_us());
greenroshks 13:fe24dd810078 94 t2.reset();
sakthipriya 14:67cebba9c452 95 printf("\n%d\r",t3.read_us());
sakthipriya 14:67cebba9c452 96 t3.reset();
greenroshks 13:fe24dd810078 97 //printf("\n%f\r",t.read());
greenroshks 2:458f9e603814 98 }
greenroshks 2:458f9e603814 99
greenroshks 4:133b49d51b18 100 void T_I2C_BAE(void const * args)
greenroshks 2:458f9e603814 101 {
greenroshks 4:133b49d51b18 102 char data_send,data_receive;
greenroshks 4:133b49d51b18 103 while(1)
greenroshks 4:133b49d51b18 104 {
greenroshks 4:133b49d51b18 105 Thread::signal_wait(0x1);
sakthipriya 8:04b912dc2443 106 //i2c_status = temp;
sakthipriya 8:04b912dc2443 107 //wait(0.5);
sakthipriya 8:04b912dc2443 108 printf("\n entered thread\n\r");
greenroshks 13:fe24dd810078 109 if(i2c_status == 0 ) //receiving data from cdms
greenroshks 5:ce0bb4174ca4 110 {
greenroshks 5:ce0bb4174ca4 111
greenroshks 5:ce0bb4174ca4 112 FUNC_I2C_WRITE2CDMS(&data_receive);
greenroshks 5:ce0bb4174ca4 113 i2c_data * i2c_data_r = i2c_data_receive.alloc();
greenroshks 5:ce0bb4174ca4 114 i2c_data_r->data = data_receive;
greenroshks 5:ce0bb4174ca4 115 i2c_data_r->length = 1;
greenroshks 5:ce0bb4174ca4 116 i2c_data_receive.put(i2c_data_r);
sakthipriya 8:04b912dc2443 117 printf("\n Data received from CDMS is %c\n\r",data_receive);
sakthipriya 8:04b912dc2443 118 i2c_data_receive.free(i2c_data_r); // This has to be done from a differen thread
raizel_varun 6:8aea752c6eda 119
greenroshks 5:ce0bb4174ca4 120 }
greenroshks 13:fe24dd810078 121 else if(i2c_status ==1 ) //sending data to cdms
greenroshks 5:ce0bb4174ca4 122 {
greenroshks 5:ce0bb4174ca4 123 osEvent evt = i2c_data_send.get();
greenroshks 5:ce0bb4174ca4 124 if (evt.status == osEventMail)
greenroshks 5:ce0bb4174ca4 125 {
greenroshks 5:ce0bb4174ca4 126 i2c_data *i2c_data_s = (i2c_data*)evt.value.p;
greenroshks 5:ce0bb4174ca4 127 data_send = i2c_data_s -> data;
sakthipriya 10:f2a8d9ac49d6 128 //printf("\n1.Data is %c\n\r",data_send);
greenroshks 5:ce0bb4174ca4 129 FUNC_I2C_WRITE2CDMS(&data_send);
sakthipriya 8:04b912dc2443 130 printf("\nData sent to CDMS is %c\n\r",data_send);
greenroshks 5:ce0bb4174ca4 131 i2c_data_send.free(i2c_data_s);
greenroshks 5:ce0bb4174ca4 132 i2c_status = 0;
sakthipriya 8:04b912dc2443 133 //temp = i2c_status;
greenroshks 5:ce0bb4174ca4 134 }
raizel_varun 6:8aea752c6eda 135 }
greenroshks 9:baf5de5828c9 136
greenroshks 9:baf5de5828c9 137 data_ready=0;
greenroshks 4:133b49d51b18 138 }
greenroshks 2:458f9e603814 139 }
greenroshks 4:133b49d51b18 140
greenroshks 4:133b49d51b18 141 void FUNC_INT()
greenroshks 4:133b49d51b18 142 {
greenroshks 13:fe24dd810078 143 //reset = 0;
greenroshks 13:fe24dd810078 144 t.start();
sakthipriya 14:67cebba9c452 145 t2.start();
greenroshks 4:133b49d51b18 146 ptr_t_i2c->signal_set(0x1);
sakthipriya 7:debeb7070a54 147
greenroshks 4:133b49d51b18 148 }
sakthipriya 7:debeb7070a54 149
greenroshks 13:fe24dd810078 150
sakthipriya 8:04b912dc2443 151
sakthipriya 7:debeb7070a54 152 void ir2master()
sakthipriya 7:debeb7070a54 153 {
sakthipriya 8:04b912dc2443 154
sakthipriya 8:04b912dc2443 155 char data='a';
greenroshks 9:baf5de5828c9 156 //data_ready=0;
sakthipriya 7:debeb7070a54 157 data = pc.getc();
greenroshks 9:baf5de5828c9 158
sakthipriya 8:04b912dc2443 159 reset =0;
sakthipriya 7:debeb7070a54 160 i2c_status=1;
sakthipriya 7:debeb7070a54 161 i2c_data * i2c_data_s = i2c_data_send.alloc();
sakthipriya 7:debeb7070a54 162 i2c_data_s->data = data;
sakthipriya 7:debeb7070a54 163 i2c_data_s->length = 1;
sakthipriya 7:debeb7070a54 164 i2c_data_send.put(i2c_data_s);
sakthipriya 7:debeb7070a54 165 data_ready=1;
sakthipriya 8:04b912dc2443 166 //temp = i2c_status;
sakthipriya 7:debeb7070a54 167 }
sakthipriya 7:debeb7070a54 168
greenroshks 4:133b49d51b18 169
greenroshks 4:133b49d51b18 170
greenroshks 4:133b49d51b18 171
raizel_varun 6:8aea752c6eda 172 int main()
raizel_varun 6:8aea752c6eda 173 {
greenroshks 12:f6b6954b65d6 174
sakthipriya 8:04b912dc2443 175 printf("\n slave started\n\r");
greenroshks 13:fe24dd810078 176 slave.address(0x20);
greenroshks 4:133b49d51b18 177 ptr_t_i2c = new Thread(T_I2C_BAE);
greenroshks 12:f6b6954b65d6 178
greenroshks 4:133b49d51b18 179 interrupt.rise(&FUNC_INT);
greenroshks 2:458f9e603814 180 while(1)
greenroshks 2:458f9e603814 181 {
sakthipriya 7:debeb7070a54 182 ir2master();
greenroshks 5:ce0bb4174ca4 183
greenroshks 2:458f9e603814 184 }
raizel_varun 6:8aea752c6eda 185
raizel_varun 6:8aea752c6eda 186 }
raizel_varun 6:8aea752c6eda 187
raizel_varun 6:8aea752c6eda 188
raizel_varun 6:8aea752c6eda 189
raizel_varun 6:8aea752c6eda 190