i2c stand alone working

Dependencies:   mbed-rtos mbed

Fork of slave_working_obama by green rosh

Committer:
greenroshks
Date:
Sat Jan 24 11:50:04 2015 +0000
Revision:
12:f6b6954b65d6
Parent:
11:907c02e9fb00
Child:
13:fe24dd810078
while loop removed ( master not sending to slave )

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;
sakthipriya 8:04b912dc2443 15
greenroshks 4:133b49d51b18 16
greenroshks 4:133b49d51b18 17 typedef struct
greenroshks 2:458f9e603814 18 {
greenroshks 4:133b49d51b18 19 char data; // To avoid dynamic memory allocation
greenroshks 4:133b49d51b18 20 int length;
greenroshks 4:133b49d51b18 21 }i2c_data;
viswachaitanya 0:24e80ff2c7b1 22
greenroshks 4:133b49d51b18 23 Mail<i2c_data,16> i2c_data_receive;
greenroshks 4:133b49d51b18 24 Mail<i2c_data,16> i2c_data_send;
sakthipriya 10:f2a8d9ac49d6 25
greenroshks 12:f6b6954b65d6 26 unsigned char* add_reg = (unsigned char*)0x40067000;
greenroshks 12:f6b6954b65d6 27 unsigned char* data_reg = (unsigned char*)0x40067004;
greenroshks 12:f6b6954b65d6 28 unsigned char* status_reg = (unsigned char*)0x40067003;
greenroshks 12:f6b6954b65d6 29 unsigned char* c1_reg = (unsigned char*)0x40067002;
greenroshks 12:f6b6954b65d6 30 unsigned char* c2_reg = (unsigned char*)0x40067005;
greenroshks 12:f6b6954b65d6 31 unsigned char* freq_reg = (unsigned char*)0x40067001;
sakthipriya 10:f2a8d9ac49d6 32 int receive_status =0;
greenroshks 5:ce0bb4174ca4 33 void FUNC_I2C_WRITE2CDMS(char *data, int length=1)
greenroshks 4:133b49d51b18 34 {
raizel_varun 6:8aea752c6eda 35 int slave_status = 1;
sakthipriya 10:f2a8d9ac49d6 36 // printf("\nData is %c\n\r",*data);
sakthipriya 10:f2a8d9ac49d6 37
sakthipriya 10:f2a8d9ac49d6 38 slave.address(0x20);
greenroshks 12:f6b6954b65d6 39
greenroshks 12:f6b6954b65d6 40 if(interrupt ==1)
sakthipriya 10:f2a8d9ac49d6 41 {
sakthipriya 10:f2a8d9ac49d6 42 //wait(2);
greenroshks 12:f6b6954b65d6 43 //printf("\nin int loop\n");
sakthipriya 10:f2a8d9ac49d6 44 receive_status = slave.receive();
greenroshks 12:f6b6954b65d6 45 //printf("\n status %d \n",receive_status);
sakthipriya 10:f2a8d9ac49d6 46 if( receive_status==1)
greenroshks 2:458f9e603814 47 {
sakthipriya 10:f2a8d9ac49d6 48 // printf("\nslave receive b4: \n");
greenroshks 5:ce0bb4174ca4 49 slave_status=slave.write(data,length);
sakthipriya 10:f2a8d9ac49d6 50 // printf("\nData sent to CDMS is %c\n\r",*data);
sakthipriya 10:f2a8d9ac49d6 51 // printf("\n\r write");
sakthipriya 10:f2a8d9ac49d6 52 //printf("\nslave receive after: %d \n",slave.receive());
greenroshks 2:458f9e603814 53
viswachaitanya 0:24e80ff2c7b1 54 }
greenroshks 12:f6b6954b65d6 55
greenroshks 12:f6b6954b65d6 56
sakthipriya 10:f2a8d9ac49d6 57 else if( receive_status==3 || receive_status==2)
sakthipriya 8:04b912dc2443 58 {
sakthipriya 8:04b912dc2443 59 slave_status=slave.read(data,length);
greenroshks 12:f6b6954b65d6 60
sakthipriya 8:04b912dc2443 61 }
sakthipriya 10:f2a8d9ac49d6 62 //printf("\n \r done while loop %d \n",slave.receive());
sakthipriya 10:f2a8d9ac49d6 63 //printf("\n\r ahoy drhghhhhhhhhhhh\n");
sakthipriya 11:907c02e9fb00 64 // printf("\n\r %d %d %d %d %d \n",*data_reg,*status_reg,*c1_reg,*c2_reg,*freq_reg);
sakthipriya 8:04b912dc2443 65
greenroshks 2:458f9e603814 66 }
sakthipriya 8:04b912dc2443 67 printf("\ndone\n\r");
greenroshks 4:133b49d51b18 68
greenroshks 2:458f9e603814 69 }
greenroshks 2:458f9e603814 70
greenroshks 4:133b49d51b18 71 void T_I2C_BAE(void const * args)
greenroshks 2:458f9e603814 72 {
greenroshks 4:133b49d51b18 73 char data_send,data_receive;
greenroshks 4:133b49d51b18 74 while(1)
greenroshks 4:133b49d51b18 75 {
greenroshks 4:133b49d51b18 76 Thread::signal_wait(0x1);
sakthipriya 8:04b912dc2443 77 //i2c_status = temp;
sakthipriya 8:04b912dc2443 78 //wait(0.5);
sakthipriya 8:04b912dc2443 79 printf("\n entered thread\n\r");
sakthipriya 8:04b912dc2443 80 if(i2c_status == 0 && reset !=1)
greenroshks 5:ce0bb4174ca4 81 {
greenroshks 5:ce0bb4174ca4 82
greenroshks 5:ce0bb4174ca4 83 FUNC_I2C_WRITE2CDMS(&data_receive);
greenroshks 5:ce0bb4174ca4 84 i2c_data * i2c_data_r = i2c_data_receive.alloc();
greenroshks 5:ce0bb4174ca4 85 i2c_data_r->data = data_receive;
greenroshks 5:ce0bb4174ca4 86 i2c_data_r->length = 1;
greenroshks 5:ce0bb4174ca4 87 i2c_data_receive.put(i2c_data_r);
sakthipriya 8:04b912dc2443 88 printf("\n Data received from CDMS is %c\n\r",data_receive);
sakthipriya 8:04b912dc2443 89 i2c_data_receive.free(i2c_data_r); // This has to be done from a differen thread
raizel_varun 6:8aea752c6eda 90
greenroshks 5:ce0bb4174ca4 91 }
sakthipriya 8:04b912dc2443 92 else if(i2c_status ==1 && reset !=1)
greenroshks 5:ce0bb4174ca4 93 {
greenroshks 5:ce0bb4174ca4 94 osEvent evt = i2c_data_send.get();
greenroshks 5:ce0bb4174ca4 95 if (evt.status == osEventMail)
greenroshks 5:ce0bb4174ca4 96 {
greenroshks 5:ce0bb4174ca4 97 i2c_data *i2c_data_s = (i2c_data*)evt.value.p;
greenroshks 5:ce0bb4174ca4 98 data_send = i2c_data_s -> data;
sakthipriya 10:f2a8d9ac49d6 99 //printf("\n1.Data is %c\n\r",data_send);
greenroshks 5:ce0bb4174ca4 100 FUNC_I2C_WRITE2CDMS(&data_send);
sakthipriya 8:04b912dc2443 101 printf("\nData sent to CDMS is %c\n\r",data_send);
greenroshks 5:ce0bb4174ca4 102 i2c_data_send.free(i2c_data_s);
greenroshks 5:ce0bb4174ca4 103 i2c_status = 0;
sakthipriya 8:04b912dc2443 104 //temp = i2c_status;
greenroshks 5:ce0bb4174ca4 105 }
raizel_varun 6:8aea752c6eda 106 }
greenroshks 9:baf5de5828c9 107
greenroshks 9:baf5de5828c9 108 data_ready=0;
greenroshks 4:133b49d51b18 109 }
greenroshks 2:458f9e603814 110 }
greenroshks 4:133b49d51b18 111
greenroshks 4:133b49d51b18 112 void FUNC_INT()
greenroshks 4:133b49d51b18 113 {
sakthipriya 8:04b912dc2443 114 reset = 0;
greenroshks 4:133b49d51b18 115 ptr_t_i2c->signal_set(0x1);
sakthipriya 7:debeb7070a54 116
greenroshks 4:133b49d51b18 117 }
sakthipriya 7:debeb7070a54 118
sakthipriya 8:04b912dc2443 119 void FUNC_RESET()
sakthipriya 8:04b912dc2443 120 {
sakthipriya 8:04b912dc2443 121 reset = 1;
sakthipriya 8:04b912dc2443 122 }
sakthipriya 8:04b912dc2443 123
sakthipriya 7:debeb7070a54 124 void ir2master()
sakthipriya 7:debeb7070a54 125 {
sakthipriya 8:04b912dc2443 126
sakthipriya 8:04b912dc2443 127 char data='a';
greenroshks 9:baf5de5828c9 128 //data_ready=0;
sakthipriya 7:debeb7070a54 129 data = pc.getc();
greenroshks 9:baf5de5828c9 130
sakthipriya 8:04b912dc2443 131 reset =0;
sakthipriya 7:debeb7070a54 132 i2c_status=1;
sakthipriya 7:debeb7070a54 133 i2c_data * i2c_data_s = i2c_data_send.alloc();
sakthipriya 7:debeb7070a54 134 i2c_data_s->data = data;
sakthipriya 7:debeb7070a54 135 i2c_data_s->length = 1;
sakthipriya 7:debeb7070a54 136 i2c_data_send.put(i2c_data_s);
sakthipriya 7:debeb7070a54 137 data_ready=1;
sakthipriya 8:04b912dc2443 138 //temp = i2c_status;
sakthipriya 7:debeb7070a54 139 }
sakthipriya 7:debeb7070a54 140
greenroshks 4:133b49d51b18 141
greenroshks 4:133b49d51b18 142
greenroshks 4:133b49d51b18 143
raizel_varun 6:8aea752c6eda 144 int main()
raizel_varun 6:8aea752c6eda 145 {
greenroshks 12:f6b6954b65d6 146
sakthipriya 8:04b912dc2443 147 printf("\n slave started\n\r");
raizel_varun 6:8aea752c6eda 148
greenroshks 4:133b49d51b18 149 ptr_t_i2c = new Thread(T_I2C_BAE);
greenroshks 12:f6b6954b65d6 150
greenroshks 4:133b49d51b18 151 interrupt.rise(&FUNC_INT);
greenroshks 2:458f9e603814 152 while(1)
greenroshks 2:458f9e603814 153 {
sakthipriya 7:debeb7070a54 154 ir2master();
greenroshks 5:ce0bb4174ca4 155
greenroshks 2:458f9e603814 156 }
raizel_varun 6:8aea752c6eda 157
raizel_varun 6:8aea752c6eda 158 }
raizel_varun 6:8aea752c6eda 159
raizel_varun 6:8aea752c6eda 160
raizel_varun 6:8aea752c6eda 161
raizel_varun 6:8aea752c6eda 162