cdms stnd alone isr i2c

Dependencies:   mbed-rtos mbed

Fork of TV_MASTER_I2C_RTOS by Team Fox

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "pin_config.h"
00003 #include "rtos.h"
00004 #define tm_len 1100
00005 #define tc_len 150
00006 #define hk_len 150
00007 
00008 Serial pc(USBTX,USBRX);
00009 InterruptIn irpt_4m_slv(PIN39);                                      //I2c interrupt from CDMS
00010 DigitalOut irpt_2_slv(PIN67);                                        //I2C interrupt to CDMS
00011 I2C master(PIN32,PIN31);
00012 DigitalOut led1(PIN46);
00013 DigitalOut led2(PIN95);
00014 const int addr = 0x20;                                            //slave address 
00015 char hk_data[hk_len];
00016 char telecommand[tc_len];
00017 char telemetry[tm_len];
00018 Timer test;
00019 Timer t_read;
00020 bool write_ack = true;
00021 bool read_ack = true;
00022 char cmd = 'r';
00023 
00024 Thread *ptr_t_i2c;
00025 
00026 void FCTN_I2C_READ(char*,int);
00027 void FCTN_I2C_WRITE(char*,int);
00028 void FCTN_ISR_I2C();
00029 int count = 0;
00030 void FCTN_MASTER_CMD()
00031 {   
00032     switch(cmd)
00033     {
00034         case 'r':
00035         pc.printf("\n \r %d CDMS READ MODE\n",count);
00036         FCTN_I2C_READ(hk_data,hk_len);
00037         cmd = 'w';
00038         count ++;
00039         break;
00040         
00041         case 'w':
00042         pc.printf("\n \r %d CDMS WRITE MODE\n",count);
00043         FCTN_I2C_WRITE(telecommand,tc_len);
00044         //strcat(telecommand,"1");
00045         cmd = 'r';
00046         count++;
00047         break;
00048     }
00049 }
00050 
00051 void FCTN_I2C_WRITE(char *data,int length)
00052 {
00053     irpt_2_slv = 1;
00054     //t.start();
00055     write_ack = master.write(addr|0x00,data,length);
00056     //t.stop();
00057     //if(write_ack == 0)
00058         //pc.printf("\n\r data not sent \n");
00059        
00060 if (write_ack == 1)
00061     {
00062         led2 = 1;
00063         pc.printf("\n\r data not sent \n");
00064         led2 = 0;    
00065     }
00066     irpt_2_slv = 0;
00067     //pc.printf("\n\r %d \n",t.read_us());
00068     //t.reset();
00069 }
00070 
00071 
00072 void FCTN_I2C_READ(char *data,int length)
00073 {
00074     irpt_2_slv = 1; 
00075     t_read.start();
00076     read_ack = master.read(addr|1,data,length);
00077     t_read.stop();
00078    
00079     //if(read_ack == 0)
00080       //  pc.printf("\n\rData received from BAE %s \n",data);
00081  if (read_ack == 1)
00082     {
00083         led2 = 1;
00084         pc.printf("\n \r data not received \n");
00085         led2 = 0;
00086     }
00087 //if(read_ack == 1)
00088 //pc.printf("\n \r data not received \n");
00089 
00090     irpt_2_slv = 0;
00091     //pc.printf("\n\r %d \n",t.read_us());
00092     //t.reset();
00093 }
00094 
00095 void FCTN_ISR_I2C()
00096 { 
00097     //led1 = 1;
00098     //pc.printf("in isr");  
00099    ptr_t_i2c->signal_set(0x1); 
00100     //test.start();
00101     //wait(0.5);
00102     //led1 = 0;
00103 }
00104 
00105 void T_TM(void const * args)
00106 {
00107      while(1)
00108     {
00109         Thread::signal_wait(0x1);
00110       // wait(2);
00111         //test.stop();
00112         led1 = 1;
00113        // wait(3);
00114         FCTN_I2C_READ(telemetry,tm_len);
00115         led1 = 0;
00116         //pc.printf("\n \r %d",test.read_us());
00117         //test.reset();
00118         //irpt_2_slv = 1; 
00119 //    t.start();
00120 //    read_ack = master.read(addr|1,telemetry,150);
00121 //    t.stop();
00122 //    if(read_ack == 0)
00123 //        pc.printf("\n\rData received from BAE. %s \n",telemetry);
00124 //    else
00125 //    {
00126 //        pc.printf("\n \r data not received \n");
00127 //    }
00128 //    irpt_2_slv = 0;
00129 //    pc.printf("\n\r %d \n",t.read_us());
00130 //    t.reset();
00131 //        pc.printf("\n\r Telemetry Received \n"); 
00132     } 
00133 }
00134 
00135 int main()
00136 {
00137   pc.printf("\n\r MASTER ACTIVATED\n");
00138   master.frequency(100000);  
00139   ptr_t_i2c = new Thread(T_TM);     
00140   ptr_t_i2c->set_priority(osPriorityHigh);
00141   strcpy(telecommand," Telecommand1 : This is test telecommand. Verifying fuctionality. Yippee!!! It is working!!!!!!!!!!!!!");
00142   irpt_2_slv = 0;
00143   irpt_4m_slv.enable_irq();
00144   //irpt_4m_slv.mode(PullDown);
00145   irpt_4m_slv.rise(&FCTN_ISR_I2C);
00146   while(1)
00147   {
00148       Thread::wait(2000);
00149       //ptr_t_i2c->signal_set(0x1); 
00150       pc.printf("\n\rTELEMETRY received from BAE is %d %s \n",t_read.read_us(),telemetry);
00151       pc.printf("\n\rHK Data received from BAE is %d %s \n",t_read.read_us(),hk_data);
00152        t_read.reset();
00153       FCTN_MASTER_CMD();
00154   }
00155 }