http://developer.mbed.org/users/sakthipriya/code/BAE_honeycomb1/
Fork of CDMS_tc by
main.cpp@1:60e6283e6532, 2014-12-18 (annotated)
- 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?
User | Revision | Line number | New 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 | } |