sakthi priya amirtharaj
/
CDMS_work_always
cdms i2c working version
main.cpp@0:a2fbfc4340f4, 2015-04-09 (annotated)
- Committer:
- sakthipriya
- Date:
- Thu Apr 09 22:43:17 2015 +0000
- Revision:
- 0:a2fbfc4340f4
cdms i2c working version
Who changed what in which revision?
User | Revision | Line number | New 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 | } |