http://developer.mbed.org/users/sakthipriya/code/BAE_honeycomb1/

Dependencies:   mbed-rtos mbed

Fork of CDMS_tc by sakthi priya amirtharaj

Committer:
sakthipriya
Date:
Thu Dec 18 12:22:14 2014 +0000
Revision:
1:60e6283e6532
Parent:
0:252ce694a71e
http://developer.mbed.org/users/sakthipriya/code/BAE_honeycomb1/

Who changed what in which revision?

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