![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
i2c+sd+rtc , ported untested code , working probability 90% if i2c works
Dependencies: SDFileSystem mbed-rtos mbed-src mbed
Fork of cdms_SD_rtc by
Diff: main.cpp
- Revision:
- 1:59da9694681e
- Parent:
- 0:2e3d21e95c97
diff -r 2e3d21e95c97 -r 59da9694681e main.cpp --- a/main.cpp Fri Mar 13 20:04:05 2015 +0000 +++ b/main.cpp Fri Apr 10 16:13:02 2015 +0000 @@ -5,6 +5,190 @@ #include "mbed.h" #include "string.h" +#include "rtos.h" +#include "pin_config.h" +const int addr = 0x20; //slave address +I2C master (PIN72,PIN71); //configure pins p27,p28 as I2C master +Serial pc (USBTX,USBRX); +DigitalOut interrupt(PIN4); +InterruptIn data_ready(PIN39); + + +int reset; +Timer t; +Timer t1; +Timer t2; +Timer t3; + +typedef struct +{ + char data; // To avoid dynamic memory allocation + int length; +}i2c_data; + +//Mail<i2c_data,16> i2c_data_receive; +Mail<i2c_data,16> i2c_data_send; + +Thread * ptr_t_i2c; +void FUNC_I2C_MASTER_FSLAVE(char * data,int length) +{ + + + bool ack0 =true; + + interrupt = 1; + t1.start(); + //wait_ms(20); + ack0 = master.read(addr|1,data,length); + t1.stop(); + + + if(!ack0) + { + printf("\n master has read %s from slave\n\r",data); + + } + //master.stop(); + printf("\n%d\n\r",t1.read_us()); + t1.reset(); + + interrupt=0; + +} + +typedef struct { + char Voltage[9]; + char Current[5]; + char Temperature[2]; + char PanelTemperature[3];//read by the 4 thermistors on solar panels + char BatteryTemperature; //to be populated + char faultpoll; //polled faults + char faultir; //interrupted faults + char power_mode; //power modes + char AngularSpeed[3]; + char Bnewvalue[3]; + + //float magnetometer,gyro=>to be addes +} hk_data; +hk_data decode_data; + +/*void TC_DECODE(char *data_hk) //getting the structure back from hk data sent by bae +{ + for(int i=0;i<=7;i++) + { + decode_data.Voltage[i] = data_hk[i]; + decode_data.Voltage[8] = '\0'; + } + for(int i=0;i<=3;i++) + { + decode_data.Current[i] = data_hk[8+i]; + decode_data.Current[4] = '\0'; + } + decode_data.Temperature[0] = data_hk[12]; + decode_data.Temperature[1] = '\0'; + for(int i=0;i<=1;i++) + { + decode_data.PanelTemperature[i] = data_hk[13+i]; + decode_data.PanelTemperature[2] = '\0'; + } + decode_data.BatteryTemperature = data_hk[15]; + decode_data.faultpoll = data_hk[16]; + decode_data.faultir = data_hk[17]; + decode_data.power_mode = data_hk[18]; + for(int i=0;i<=1;i++) + { + decode_data.AngularSpeed[i] = data_hk[19+i]; + decode_data.AngularSpeed[2] = '\0'; + } + for(int i=0;i<=1;i++) + { + decode_data.Bnewvalue[i] = data_hk[21+i]; + decode_data.Bnewvalue[2] = '\0'; + } + printf("\n voltage %s\n\r",decode_data.Voltage); + printf("\n current %s\n\r",decode_data.Current); + printf("\n faultpoll %c\n\r",decode_data.faultpoll); +}*/ + + +void T_I2C_MASTER_FSLAVE(void const *args) +{ + char data_receive[25]; + while(1) + { + Thread::signal_wait(0x1); + + + FUNC_I2C_MASTER_FSLAVE(data_receive,25); + /*i2c_data * i2c_data_r = i2c_data_receive.alloc(); + strcpy(i2c_data_r->data , data_receive); + i2c_data_r->length = 25; + i2c_data_receive.put(i2c_data_r);*/ + printf("\n Data received from slave is %s\n\r",data_receive); + //TC_DECODE(data_receive); + } +} + +void FUNC_INT() +{ + + ptr_t_i2c->signal_set(0x1); + +} + +char writedata; +bool write2slave; +bool master_status_write; +void FUNC_MASTER_WRITE() +{ //wait(1); + write2slave=true; + + + + char data = pc.getc(); + interrupt = 1; + t.start(); + t3.start(); + wait_ms(20); + i2c_data * i2c_data_s = i2c_data_send.alloc(); + i2c_data_s->data = data; + i2c_data_s->length = 1; + i2c_data_send.put(i2c_data_s); + master_status_write = true; + + // interrupt = 1; + + osEvent evt = i2c_data_send.get(); + if (evt.status == osEventMail) + { + i2c_data *i2c_data_s = (i2c_data*)evt.value.p; + writedata = i2c_data_s -> data; + t.stop(); + //t3.start(); + master_status_write = (bool) master.write(addr|0x00,&writedata,1); + t3.stop(); + if(master_status_write==0) + { + printf("master has written %c to slave\n\r",writedata); + write2slave=false; + } + i2c_data_send.free(i2c_data_s); + printf("\n%d\n",t.read_us()); + t.reset(); + printf("\n%d\n",t3.read_us()); + t3.reset(); + } + interrupt = 0; +} + + + + + + + + + /********************************** Function Prototypes declaration ***********************************/ int FUNC_CDMS_hex2int(int); // Need to convert the RTC time values to integers void FUNC_CDMS_Gettime(void); // Function to get the time values from RTC registers @@ -17,7 +201,7 @@ char ch; SDFileSystem sd(PTE1, PTE3, PTE2, PTE22, "sd"); // the pinout on the mbed Cool Components workshop board -Serial pc(USBTX, USBRX); // tx, rx + char time_stamp[15]; /***********************Initialization function of the RTC********************************************/ @@ -194,14 +378,19 @@ printf("Jai Mata Di..Goodbye World!\n");*/ //} -Ticker t; +Ticker tx; int main() -{ +{ interrupt=0; + ptr_t_i2c = new Thread(T_I2C_MASTER_FSLAVE); + master.frequency(100000); printf("IITMSAT - CDMS\n"); FUNC_CDMS_init_values(); - t.attach(&store_data, 20.0); - while(1); + tx.attach(&store_data, 20.0); + while(1) + { + FUNC_MASTER_WRITE(); + } }