green rosh
/
BAE_FRDM_INTEGRATION
bae integrated final (may be)
Fork of BAE_FRDMTESIN2 by
slave.cpp
- Committer:
- greenroshks
- Date:
- 2014-12-15
- Revision:
- 8:667fbc82d634
- Parent:
- 7:f06840d848e3
File content as of revision 8:667fbc82d634:
/*******************Below is an old version**********************************************************************************************/ /* Added fault to hk structure and being sent through I2C. Need to verify the format */ /*#include "slave.h" #include "HK.h" extern struct SensorData Sensor; I2CSlave slave(PTC9,PTC8); //configuring pins p27, p28 as I2Cslave Serial screen (USBTX,USBRX); void write_to_master(char send) //function to write data to master { int acknowledge; int loopvariable4=1; while(loopvariable4) { acknowledge = slave.write(send); //sending the byte to master if(acknowledge==1) { screen.printf(" acknowledge %d sent %u \n",acknowledge,send); loopvariable4=0; } } } void FUNC_I2C_SLAVE_MAIN(int iterations) { screen.printf("\nSlave entered\n"); slave.address(slave_address); //assigning slave address slave.stop(); char Switch_Variable; int loopvariable1=1; int loopvariable2=0; int loopvariable3=1; //initialising dummy sensor data while(loopvariable1) { //to read data from master if(slave.receive()==WriteGeneral) //checking if slave is addressed to write { slave.stop(); Switch_Variable=slave.read(); //receiving data screen.printf("switch variable=%d\n",Switch_Variable); slave.stop(); //reset slave to default receiving state loopvariable1=0; //to interpret and write data to master switch(Switch_Variable) { case 1: printf("\nEntered switch\n"); while(loopvariable3) { if(slave.receive()==ReadAddressed) //check if slave is addressed to read { while(loopvariable2<iterations) { if(loopvariable2%3==0) { screen.printf("\nvoltage%d\n",loopvariable2/3); write_to_master(Sensor.Voltage[loopvariable2/3]); } else if(loopvariable2%3==1) { screen.printf("\ncurrent%d\n",loopvariable2/3); write_to_master(Sensor.Current[loopvariable2/3]); } else if(loopvariable2%3==2) { screen.printf("\ntemp%d\n",loopvariable2/3); write_to_master(Sensor.Temperature[loopvariable2/3]); } loopvariable2++; } screen.printf("\nfault %c\n",Sensor.faultpoll); write_to_master(Sensor.faultpoll); screen.printf("\nfault %c\n",Sensor.faultir); write_to_master(Sensor.faultir); screen.printf("\npower mode %c\n",Sensor.power_mode); write_to_master(Sensor.power_mode); printf("\nExited i2c while loop\n"); slave.stop(); loopvariable3=0; }//if(read addressed) }//while(loopvariable3) break; case 2 : screen.printf(" telecommand 2\n"); break; }//switch case ends } } screen.printf("\nexited slave function\n"); } */ //******************The following is a new version********************************************************************************/ #include "HK.h" #include "slave.h" I2CSlave slave(D14,D15); //configuring pins p27, p28 as I2Cslave Serial pc_slave (USBTX,USBRX); //InterruptIn interrupt(D9); //This should be in the main //DigitalOut data_ready(D10); //Again in the main function //int i2c_status=0; //read/write mode for i2c 0 : write2slave, 1 : write2master (Again in tha main) typedef struct { char data; // To avoid dynamic memory allocation int length; }i2c_data; //Mail<i2c_data,16> i2c_data_receive; To be done in the main //Mail<i2c_data,16> i2c_data_send; To be done in the main void FUNC_I2C_WRITE2CDMS(char *data, int length=1) { int slave_status = 1; while(slave_status) { slave.address(0x20); if(slave.receive()==1) { slave_status=slave.write(data,length); // printf("\n In the while loop\n"); /*if(!slave_status) { printf("slave wrote %c to master\n\r",*data); }*/ } else if(slave.receive()==3 || slave.receive()==2) { //i2c_data *i2c_data_r = i2c_data_receive.alloc(); slave_status=slave.read(data,length); /*if(!slave_status) { printf("1 read %c from master\n\r",*data); }*/ } //slave.stop(); } printf("2 done"); } /*void T_I2C_BAE(void const * args) { char data_send,data_receive; //data_send = 'a'; while(1) { Thread::signal_wait(0x1); printf("\ndetected interrupt\n"); if(i2c_status == 0) { FUNC_I2C_WRITE2CDMS(&data_receive); //printf("\n Data received from CDMS is %c\n",data_receive); i2c_data * i2c_data_r = i2c_data_receive.alloc(); i2c_data_r->data = data_receive; i2c_data_r->length = 1; i2c_data_receive.put(i2c_data_r); } else if(i2c_status ==1 ) { osEvent evt = i2c_data_send.get(); if (evt.status == osEventMail) { i2c_data *i2c_data_s = (i2c_data*)evt.value.p; //printf("\nData read from CDMS is %c\n",i2c_data_r->data); data_send = i2c_data_s -> data; FUNC_I2C_WRITE2CDMS(&data_send); printf("\nData sent to CDMS is %c\n",data_send); i2c_data_send.free(i2c_data_s); i2c_status = 0; //delete i2c_data_r; } } } } void FUNC_INT() { // char * data = new char; //*data = 'a'; //printf("\nInterrupt from master detected\n"); ptr_t_i2c->signal_set(0x1); // //delete data; } void main() { printf("\nStarted slave... waiting for master\n"); ptr_t_i2c = new Thread(T_I2C_BAE); char data='a'; interrupt.rise(&FUNC_INT); /* 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); //data_ready=1; i2c_status=1;*/ // while(1) //{ //*(data_send)=pc.getc(); //FUNC_I2C_WRITE2CDMS(&data,1); //printf("\n The data send or received by slave is %c\n",data); //(data)++; //wait(1); //Remove the comments for receiving data /* osEvent evt = i2c_data_receive.get(); if (evt.status == osEventMail) { i2c_data *i2c_data_r = (i2c_data*)evt.value.p; printf("\nData read from CDMS is %c\n",i2c_data_r->data); i2c_data_receive.free(i2c_data_r); //delete i2c_data_r; }*/ /* //put in comments for receiving data data_ready=0; data = pc.getc(); 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); data_ready=1; i2c_status=1; } } */ //To be done in the main