cdms i2c working version

Dependencies:   mbed-rtos mbed

Committer:
sakthipriya
Date:
Thu Apr 09 22:43:17 2015 +0000
Revision:
0:a2fbfc4340f4
cdms i2c working version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sakthipriya 0:a2fbfc4340f4 1 #include "mbed.h"
sakthipriya 0:a2fbfc4340f4 2 #include "rtos.h"
sakthipriya 0:a2fbfc4340f4 3
sakthipriya 0:a2fbfc4340f4 4 const int addr = 0x20; //slave address
sakthipriya 0:a2fbfc4340f4 5 I2C master (PIN72,PIN71); //configure pins p27,p28 as I2C master
sakthipriya 0:a2fbfc4340f4 6 Serial pc (USBTX,USBRX);
sakthipriya 0:a2fbfc4340f4 7 DigitalOut interrupt(PIN4);
sakthipriya 0:a2fbfc4340f4 8 InterruptIn data_ready(PIN39);
sakthipriya 0:a2fbfc4340f4 9
sakthipriya 0:a2fbfc4340f4 10 int reset;
sakthipriya 0:a2fbfc4340f4 11 Timer t;
sakthipriya 0:a2fbfc4340f4 12 Timer t1;
sakthipriya 0:a2fbfc4340f4 13 Timer t2;
sakthipriya 0:a2fbfc4340f4 14 Timer t3;
sakthipriya 0:a2fbfc4340f4 15
sakthipriya 0:a2fbfc4340f4 16 typedef struct
sakthipriya 0:a2fbfc4340f4 17 {
sakthipriya 0:a2fbfc4340f4 18 char data; // To avoid dynamic memory allocation
sakthipriya 0:a2fbfc4340f4 19 int length;
sakthipriya 0:a2fbfc4340f4 20 }i2c_data;
sakthipriya 0:a2fbfc4340f4 21
sakthipriya 0:a2fbfc4340f4 22 //Mail<i2c_data,16> i2c_data_receive;
sakthipriya 0:a2fbfc4340f4 23 Mail<i2c_data,16> i2c_data_send;
sakthipriya 0:a2fbfc4340f4 24
sakthipriya 0:a2fbfc4340f4 25 Thread * ptr_t_i2c;
sakthipriya 0:a2fbfc4340f4 26 void FUNC_I2C_MASTER_FSLAVE(char * data,int length)
sakthipriya 0:a2fbfc4340f4 27 {
sakthipriya 0:a2fbfc4340f4 28
sakthipriya 0:a2fbfc4340f4 29
sakthipriya 0:a2fbfc4340f4 30 bool ack0 =true;
sakthipriya 0:a2fbfc4340f4 31
sakthipriya 0:a2fbfc4340f4 32 interrupt = 1;
sakthipriya 0:a2fbfc4340f4 33 t1.start();
sakthipriya 0:a2fbfc4340f4 34 //wait_ms(20);
sakthipriya 0:a2fbfc4340f4 35 ack0 = master.read(addr|1,data,length);
sakthipriya 0:a2fbfc4340f4 36 t1.stop();
sakthipriya 0:a2fbfc4340f4 37
sakthipriya 0:a2fbfc4340f4 38
sakthipriya 0:a2fbfc4340f4 39 if(!ack0)
sakthipriya 0:a2fbfc4340f4 40 {
sakthipriya 0:a2fbfc4340f4 41 printf("\n master has read %s from slave\n\r",data);
sakthipriya 0:a2fbfc4340f4 42
sakthipriya 0:a2fbfc4340f4 43 }
sakthipriya 0:a2fbfc4340f4 44 //master.stop();
sakthipriya 0:a2fbfc4340f4 45 printf("\n%d\n\r",t1.read_us());
sakthipriya 0:a2fbfc4340f4 46 t1.reset();
sakthipriya 0:a2fbfc4340f4 47
sakthipriya 0:a2fbfc4340f4 48 interrupt=0;
sakthipriya 0:a2fbfc4340f4 49
sakthipriya 0:a2fbfc4340f4 50 }
sakthipriya 0:a2fbfc4340f4 51
sakthipriya 0:a2fbfc4340f4 52 typedef struct {
sakthipriya 0:a2fbfc4340f4 53 char Voltage[9];
sakthipriya 0:a2fbfc4340f4 54 char Current[5];
sakthipriya 0:a2fbfc4340f4 55 char Temperature[2];
sakthipriya 0:a2fbfc4340f4 56 char PanelTemperature[3];//read by the 4 thermistors on solar panels
sakthipriya 0:a2fbfc4340f4 57 char BatteryTemperature; //to be populated
sakthipriya 0:a2fbfc4340f4 58 char faultpoll; //polled faults
sakthipriya 0:a2fbfc4340f4 59 char faultir; //interrupted faults
sakthipriya 0:a2fbfc4340f4 60 char power_mode; //power modes
sakthipriya 0:a2fbfc4340f4 61 char AngularSpeed[3];
sakthipriya 0:a2fbfc4340f4 62 char Bnewvalue[3];
sakthipriya 0:a2fbfc4340f4 63
sakthipriya 0:a2fbfc4340f4 64 //float magnetometer,gyro=>to be addes
sakthipriya 0:a2fbfc4340f4 65 } hk_data;
sakthipriya 0:a2fbfc4340f4 66 hk_data decode_data;
sakthipriya 0:a2fbfc4340f4 67
sakthipriya 0:a2fbfc4340f4 68 /*void TC_DECODE(char *data_hk) //getting the structure back from hk data sent by bae
sakthipriya 0:a2fbfc4340f4 69 {
sakthipriya 0:a2fbfc4340f4 70 for(int i=0;i<=7;i++)
sakthipriya 0:a2fbfc4340f4 71 {
sakthipriya 0:a2fbfc4340f4 72 decode_data.Voltage[i] = data_hk[i];
sakthipriya 0:a2fbfc4340f4 73 decode_data.Voltage[8] = '\0';
sakthipriya 0:a2fbfc4340f4 74 }
sakthipriya 0:a2fbfc4340f4 75 for(int i=0;i<=3;i++)
sakthipriya 0:a2fbfc4340f4 76 {
sakthipriya 0:a2fbfc4340f4 77 decode_data.Current[i] = data_hk[8+i];
sakthipriya 0:a2fbfc4340f4 78 decode_data.Current[4] = '\0';
sakthipriya 0:a2fbfc4340f4 79 }
sakthipriya 0:a2fbfc4340f4 80 decode_data.Temperature[0] = data_hk[12];
sakthipriya 0:a2fbfc4340f4 81 decode_data.Temperature[1] = '\0';
sakthipriya 0:a2fbfc4340f4 82 for(int i=0;i<=1;i++)
sakthipriya 0:a2fbfc4340f4 83 {
sakthipriya 0:a2fbfc4340f4 84 decode_data.PanelTemperature[i] = data_hk[13+i];
sakthipriya 0:a2fbfc4340f4 85 decode_data.PanelTemperature[2] = '\0';
sakthipriya 0:a2fbfc4340f4 86 }
sakthipriya 0:a2fbfc4340f4 87 decode_data.BatteryTemperature = data_hk[15];
sakthipriya 0:a2fbfc4340f4 88 decode_data.faultpoll = data_hk[16];
sakthipriya 0:a2fbfc4340f4 89 decode_data.faultir = data_hk[17];
sakthipriya 0:a2fbfc4340f4 90 decode_data.power_mode = data_hk[18];
sakthipriya 0:a2fbfc4340f4 91 for(int i=0;i<=1;i++)
sakthipriya 0:a2fbfc4340f4 92 {
sakthipriya 0:a2fbfc4340f4 93 decode_data.AngularSpeed[i] = data_hk[19+i];
sakthipriya 0:a2fbfc4340f4 94 decode_data.AngularSpeed[2] = '\0';
sakthipriya 0:a2fbfc4340f4 95 }
sakthipriya 0:a2fbfc4340f4 96 for(int i=0;i<=1;i++)
sakthipriya 0:a2fbfc4340f4 97 {
sakthipriya 0:a2fbfc4340f4 98 decode_data.Bnewvalue[i] = data_hk[21+i];
sakthipriya 0:a2fbfc4340f4 99 decode_data.Bnewvalue[2] = '\0';
sakthipriya 0:a2fbfc4340f4 100 }
sakthipriya 0:a2fbfc4340f4 101 printf("\n voltage %s\n\r",decode_data.Voltage);
sakthipriya 0:a2fbfc4340f4 102 printf("\n current %s\n\r",decode_data.Current);
sakthipriya 0:a2fbfc4340f4 103 printf("\n faultpoll %c\n\r",decode_data.faultpoll);
sakthipriya 0:a2fbfc4340f4 104 }*/
sakthipriya 0:a2fbfc4340f4 105
sakthipriya 0:a2fbfc4340f4 106
sakthipriya 0:a2fbfc4340f4 107 void T_I2C_MASTER_FSLAVE(void const *args)
sakthipriya 0:a2fbfc4340f4 108 {
sakthipriya 0:a2fbfc4340f4 109 char data_receive[25];
sakthipriya 0:a2fbfc4340f4 110 while(1)
sakthipriya 0:a2fbfc4340f4 111 {
sakthipriya 0:a2fbfc4340f4 112 Thread::signal_wait(0x1);
sakthipriya 0:a2fbfc4340f4 113
sakthipriya 0:a2fbfc4340f4 114
sakthipriya 0:a2fbfc4340f4 115 FUNC_I2C_MASTER_FSLAVE(data_receive,25);
sakthipriya 0:a2fbfc4340f4 116 /*i2c_data * i2c_data_r = i2c_data_receive.alloc();
sakthipriya 0:a2fbfc4340f4 117 strcpy(i2c_data_r->data , data_receive);
sakthipriya 0:a2fbfc4340f4 118 i2c_data_r->length = 25;
sakthipriya 0:a2fbfc4340f4 119 i2c_data_receive.put(i2c_data_r);*/
sakthipriya 0:a2fbfc4340f4 120 printf("\n Data received from slave is %s\n\r",data_receive);
sakthipriya 0:a2fbfc4340f4 121 //TC_DECODE(data_receive);
sakthipriya 0:a2fbfc4340f4 122 }
sakthipriya 0:a2fbfc4340f4 123 }
sakthipriya 0:a2fbfc4340f4 124
sakthipriya 0:a2fbfc4340f4 125 void FUNC_INT()
sakthipriya 0:a2fbfc4340f4 126 {
sakthipriya 0:a2fbfc4340f4 127
sakthipriya 0:a2fbfc4340f4 128 ptr_t_i2c->signal_set(0x1);
sakthipriya 0:a2fbfc4340f4 129
sakthipriya 0:a2fbfc4340f4 130 }
sakthipriya 0:a2fbfc4340f4 131
sakthipriya 0:a2fbfc4340f4 132 char writedata;
sakthipriya 0:a2fbfc4340f4 133 bool write2slave;
sakthipriya 0:a2fbfc4340f4 134 bool master_status_write;
sakthipriya 0:a2fbfc4340f4 135 void FUNC_MASTER_WRITE()
sakthipriya 0:a2fbfc4340f4 136 { //wait(1);
sakthipriya 0:a2fbfc4340f4 137 write2slave=true;
sakthipriya 0:a2fbfc4340f4 138
sakthipriya 0:a2fbfc4340f4 139
sakthipriya 0:a2fbfc4340f4 140
sakthipriya 0:a2fbfc4340f4 141 char data = pc.getc();
sakthipriya 0:a2fbfc4340f4 142 interrupt = 1;
sakthipriya 0:a2fbfc4340f4 143 t.start();
sakthipriya 0:a2fbfc4340f4 144 t3.start();
sakthipriya 0:a2fbfc4340f4 145 wait_ms(20);
sakthipriya 0:a2fbfc4340f4 146 i2c_data * i2c_data_s = i2c_data_send.alloc();
sakthipriya 0:a2fbfc4340f4 147 i2c_data_s->data = data;
sakthipriya 0:a2fbfc4340f4 148 i2c_data_s->length = 1;
sakthipriya 0:a2fbfc4340f4 149 i2c_data_send.put(i2c_data_s);
sakthipriya 0:a2fbfc4340f4 150 master_status_write = true;
sakthipriya 0:a2fbfc4340f4 151
sakthipriya 0:a2fbfc4340f4 152 // interrupt = 1;
sakthipriya 0:a2fbfc4340f4 153
sakthipriya 0:a2fbfc4340f4 154 osEvent evt = i2c_data_send.get();
sakthipriya 0:a2fbfc4340f4 155 if (evt.status == osEventMail)
sakthipriya 0:a2fbfc4340f4 156 {
sakthipriya 0:a2fbfc4340f4 157 i2c_data *i2c_data_s = (i2c_data*)evt.value.p;
sakthipriya 0:a2fbfc4340f4 158 writedata = i2c_data_s -> data;
sakthipriya 0:a2fbfc4340f4 159 t.stop();
sakthipriya 0:a2fbfc4340f4 160 //t3.start();
sakthipriya 0:a2fbfc4340f4 161 master_status_write = (bool) master.write(addr|0x00,&writedata,1);
sakthipriya 0:a2fbfc4340f4 162 t3.stop();
sakthipriya 0:a2fbfc4340f4 163 if(master_status_write==0)
sakthipriya 0:a2fbfc4340f4 164 {
sakthipriya 0:a2fbfc4340f4 165 printf("master has written %c to slave\n\r",writedata);
sakthipriya 0:a2fbfc4340f4 166 write2slave=false;
sakthipriya 0:a2fbfc4340f4 167 }
sakthipriya 0:a2fbfc4340f4 168 i2c_data_send.free(i2c_data_s);
sakthipriya 0:a2fbfc4340f4 169 printf("\n%d\n",t.read_us());
sakthipriya 0:a2fbfc4340f4 170 t.reset();
sakthipriya 0:a2fbfc4340f4 171 printf("\n%d\n",t3.read_us());
sakthipriya 0:a2fbfc4340f4 172 t3.reset();
sakthipriya 0:a2fbfc4340f4 173 }
sakthipriya 0:a2fbfc4340f4 174 interrupt = 0;
sakthipriya 0:a2fbfc4340f4 175 }
sakthipriya 0:a2fbfc4340f4 176
sakthipriya 0:a2fbfc4340f4 177
sakthipriya 0:a2fbfc4340f4 178
sakthipriya 0:a2fbfc4340f4 179 int main()
sakthipriya 0:a2fbfc4340f4 180 {
sakthipriya 0:a2fbfc4340f4 181 interrupt=0;
sakthipriya 0:a2fbfc4340f4 182 ptr_t_i2c = new Thread(T_I2C_MASTER_FSLAVE);
sakthipriya 0:a2fbfc4340f4 183 data_ready.rise(&FUNC_INT);
sakthipriya 0:a2fbfc4340f4 184 printf("\nstarted master\n");
sakthipriya 0:a2fbfc4340f4 185 master.frequency(100000);
sakthipriya 0:a2fbfc4340f4 186 while(1)
sakthipriya 0:a2fbfc4340f4 187 { //Thread::wait(9000);
sakthipriya 0:a2fbfc4340f4 188 //interrupt = 1;
sakthipriya 0:a2fbfc4340f4 189
sakthipriya 0:a2fbfc4340f4 190 FUNC_MASTER_WRITE();
sakthipriya 0:a2fbfc4340f4 191 //interrupt = 0;
sakthipriya 0:a2fbfc4340f4 192 ;
sakthipriya 0:a2fbfc4340f4 193 }
sakthipriya 0:a2fbfc4340f4 194 }