Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FreescaleIAP mbed-rtos mbed
Fork of QM_BAE_review_1 by
Diff: main.cpp
- Revision:
- 37:8a8024c45dc0
- Parent:
- 36:cc77770d787f
- Child:
- 38:95f0cc565ee3
--- a/main.cpp Fri Jun 03 13:53:55 2016 +0000
+++ b/main.cpp Fri Jun 24 08:08:52 2016 +0000
@@ -9,6 +9,7 @@
#define tm_len 135
#define tc_len 11
#define batt_heat_low 20
+#define PRINT 1
//***************************************************** flags *************************************************************//
uint32_t BAE_STATUS = 0x00000000;
@@ -71,6 +72,7 @@
Timer t_start;
Timer t_tc;
Timer t_tm;
+Timer synch;
Serial pc(USBTX, USBRX);
int power_flag_dummy=2;
float data[6];
@@ -84,7 +86,7 @@
int write_ack = 1;
int read_ack = 1;
-char telecommand[tc_len];
+uint8_t telecommand[11];
extern uint8_t telemetry[135];
bool pf1check = 0;
@@ -133,7 +135,7 @@
DigitalOut TRXY_SW(PIN71); //TR XY Switch
DigitalOut DRV_Z_EN(PIN88); //Sleep pin of driver z
DigitalOut TRZ_SW(PIN40); //TR Z Switch
-DigitalOut CDMS_RESET(PIN7); // CDMS RESET
+DigitalOut CDMS_RESET(PIN7,1); // CDMS RESET
DigitalOut BCN_SW(PIN14); //Beacon switch
DigitalOut DRV_XY_EN(PIN82);
@@ -424,61 +426,317 @@
}
//**************************************************TCTM THREAD*******************************************************************//
+/*void I2C_busreset(void)
+{
+ uint8_t count=0;
+ if((PORTE->PCR[1] & PORT_PCR_MUX(6)) && (PORTE->PCR[0] & PORT_PCR_MUX(6)))
+ {
+ printf("\n\rResetting\n\r");
+ I2C1->C1 &= 0x7f; // Disable I2C1 bus
+ PORTE->PCR[1] = PORT_PCR_MUX(1); // PTE1 Alt1 (pin)
+ PORTE->PCR[0] = PORT_PCR_MUX(1); // PTE0 Alt1 (pin)
+ while(((PTE->PDIR & 0x3) != 3) && (count<10)) // When PTE0 / PTE1 are not 1 : I2C1 bus lock-up
+ {
+ PTE->PDDR |= 0x3; // Set PTE1 and PTE0 as a GPIO output so we can bit bang it
+ PTE->PDOR |= 0x2; // Set PTE1 (SCL) pin high;
+ wait_ms(1);
+ PTE->PDOR |= 0x1; // Set PTE0 (SDA) pin high;
+ wait_ms(1);
+ count++;
+ wait(1);
+ }
+ // Reinstate I2C1 bus pins
+ PORTE->PCR[1] = PORT_PCR_MUX(6); // PTE1 Alt6 (SCL)
+ PORTE->PCR[0] = PORT_PCR_MUX(6); // PTE0 Alt6 (SDA)
+ I2C1->C1 |= 0x80; // Enable I2C1 bus
+ printf("Count: %d\n\r",count);
+ //wait(1);
+ }
+
+}*/
+#define PORT_PCR_MUX_MASK2 0x00000700u
+void debug()
+{
+ // uint32_t temp=0x0AF30000;
+ //printf("\n\rTemp = %08X",temp);
+ //pc.printf("\n\rPORTE->PCR[0] = 0x%08X",PORTE->PCR[0]);
+ //pc.printf("\n\rPORTE->PCR[1] = 0x%08X",PORTE->PCR[1]);
+ pc.printf("\n\rPTE->DIR = 0x%08X",PTE->PDIR);
+}
+void debug1()
+{
+ printf("\n\r Before disabling");
+ debug();
+ //wait_ms(50);
+ I2C1->C1 &= 0x7f;
+ printf("\n\r After muxing ");
+ PORTE->PCR[1] = PORT_PCR_MUX(1); // PTE24 Alt1 (pin)
+ PORTE->PCR[0] = PORT_PCR_MUX(1); // PTE25 Alt1 (pin)
+ PTE->PDDR |= 0x3; // Set PTE1 and PTE0 as a GPIO output so we can bit bang it
+ PTE->PDOR |= 0x2; // Set PTE1 (SCL) pin high;
+ wait_ms(1);
+ PTE->PDOR |= 0x1; // Set PTE0 (SDA) pin high;
+ wait_ms(1);
+ debug();
+ PORTE->PCR[1] &= (~(PORT_PCR_MUX_MASK2));
+ PORTE->PCR[0] &= (~(PORT_PCR_MUX_MASK2));
+ PORTE->PCR[1] |= PORT_PCR_MUX(6); // PTE24 Alt6 (pin)
+ PORTE->PCR[0] |= PORT_PCR_MUX(6); // PTE25 Alt6 (pin)
+ PORTE->PCR[1] |= 0x00000004;
+ PORTE->PCR[0] |= 0x00000004;
+ I2C1->C1 |= 0x80; // Enable I2C1 bus
+ printf("\n\r After enabling I2C");
+ debug();
+}
+void debug2()
+{
+ printf("\n\rI2C1->A1 = 0x%02X",I2C1->A1);
+ printf("\n\rI2C1->F = 0x%02X",I2C1->F);
+ printf("\n\rI2C1->C1 = 0x%02X",I2C1->C1);
+ printf("\n\rI2C1->S = 0x%02X",I2C1->S);
+ printf("\n\rI2C1->D = 0x%02X",I2C1->D);
+ printf("\n\rI2C1->C2 = 0x%02X",I2C1->C2);
+ printf("\n\rI2C1->FLT = 0x%02X",I2C1->FLT);
+ printf("\n\rI2C1->RA = 0x%02X",I2C1->RA);
+ printf("\n\rI2C1->SMB = 0x%02X",I2C1->SMB);
+ printf("\n\rI2C1->A2 = 0x%02X",I2C1->A2);
+ printf("\n\rI2C1->SLTH = 0x%02X",I2C1->SLTH);
+ printf("\n\rI2C1->SLTL = 0x%02X\n",I2C1->SLTL);
+}
+void debug3()
+{
+ //pc.printf("\n\r Resetting I2C");
+ //debug2();
+ //printf("\n\r SIM->SCGC4 = 0x%08X",SIM->SCGC4);
+ PORTE->PCR[1] &= 0xfffffffb;
+ PORTE->PCR[0] &= 0xfffffffb;
+ I2C1->C1 &= 0x7f;
+ //wait_ms(2);
+ SIM->SCGC4 &= 0xffffff7f;
+ //printf("\n\r SIM->SCGC4 = 0x%08X",SIM->SCGC4);
+ //wait_ms(10);
+ SIM->SCGC4 |= 0x00000080;
+ //printf("\n\r SIM->SCGC4 = 0x%08X",SIM->SCGC4);
+ //wait_ms(10);
+ I2C1->C1 |= 0x80;
+ PORTE->PCR[1] |= 0x00000004;
+ PORTE->PCR[0] |= 0x00000004;
+ //wait_ms(10);
+ wait_ms(2);
+ //printf("\n\r After enabling clock");
+ //debug2();
+ //printf("\n");
+}
+void I2C_busreset()
+{
+ //Thread::wait(1);
+ PORTE->PCR[1] &= 0xfffffffb;
+ //Thread::wait(1);
+ PORTE->PCR[0] &= 0xfffffffb;
+ //Thread::wait(1);
+ I2C1->C1 &= 0x7f;
+ //Thread::wait(1);
+ SIM->SCGC4 &= 0xffffff7f;
+ //Thread::wait(1);
+ SIM->SCGC4 |= 0x00000080;
+ //Thread::wait(1);
+ I2C1->C1 |= 0x80;
+ //Thread::wait(1);
+ PORTE->PCR[1] |= 0x00000004;
+ //Thread::wait(1);
+ PORTE->PCR[0] |= 0x00000004;
+ Thread::wait(1);
+}
+uint32_t pdirtc1,pdirtc2,pdirtm1,pdirtm2,pdirss1,pdirss2;
void T_TC(void const * args)
{
while(1)
- {
+ {
+ //pc.printf("\n\n\rWaiting");
Thread::signal_wait(0x4);
- wait_us(200);
- //printf("\n\rreached\n"); // can be between 38 to 15700
+ wait_us(300); // can be between 38 to 15700
if( slave.receive() == 0)
- {slave.stop();
- //printf("\n\rnot send\n");
- }
- else if( slave.receive() == 1) // slave writes to master
+ {
+ //synch.stop();
+ //pdirss1=PTE->PDIR;
+ irpt_2_mstr = 0;
+ data_send_flag = 'h';
+ #if PRINT
+ pc.printf("\n\rSlave stop");
+ pc.printf("\n\rPTE->DIR = 0x%08X",pdirss1);
+ #endif
+ slave.stop();
+ I2C_busreset();
+ pdirss2=PTE->PDIR;
+ #if PRINT
+ pc.printf("\n\rPTE->DIR = 0x%08X",pdirss2);
+ #endif
+ //pc.printf("\n\rPTE->DIR = 0x%08X",pdir2);
+ }
+ else if( slave.receive() == 1) // slave writes to master
{
if(data_send_flag == 'h')
{
//FCTN_APPEND_HKDATA();
// pc.printf("\n\r here");
- write_ack=slave.write(BAE_chardata,74);
+ write_ack=slave.write(BAE_chardata,74);
+ irpt_2_mstr = 0;
if(write_ack==0)
- {irpt_2_mstr = 0;
- printf("\n\rgot interrupt\n");
- }
+ {
+ irpt_2_mstr = 0;
+ pc.printf("\n\rgot interrupt\n");
+ }
}
else if(data_send_flag == 't')
{
- write_ack=slave.write((char*)telemetry,tm_len);
- data_send_flag = 'h';
- if(write_ack==0)
- irpt_2_mstr = 0;
- }
+ uint8_t i2c_count =0;
+ write_ack=slave.write((char*)telemetry,135);
+ Thread::wait(1);
+ pdirtm1=PTE->PDIR;
+ irpt_2_mstr = 0;
+ //data_send_flag = 'h';
+ if(write_ack==0)
+ {
+ while(((pdirtm1 & 0x00000003)!=3)&& i2c_count<10)
+ {
+ Thread::wait(1);
+ pdirtm1=PTE->PDIR;
+ i2c_count++;
+ }
+ if(((pdirtm1 & 0x00000003)==3))
+ {
+ pc.printf("\n\rWrite TM success");
+ //pc.printf("\n\rPTE->DIR = 0x%08X",PTE->PDIR);
+ }
+ else
+ {
+ //Resetting should be done here
+
+ #if PRINT
+ pc.printf("\n\rWrite TM error");
+ pc.printf("\n\rPTE->DIR = 0x%08X",pdirtm1);
+ #endif
+ I2C_busreset();
+ pdirtm2=PTE->PDIR;
+ #if PRINT
+ pc.printf("\n\rPTE->DIR = 0x%08X",pdirtm2);
+ #endif
+ }
+ //pc.printf("\n\rTM count:%d",i2c_count);
+ }
+ else
+ {
+ //Thread::wait(30);
+ #if PRINT
+ pc.printf("\nTM ack failed");
+ pc.printf("\n\rPTE->DIR = 0x%08X",pdirtm1);
+ #endif
+ I2C_busreset();
+ pdirtm2=PTE->PDIR;
+ #if PRINT
+ pc.printf("\n\rPTE->DIR = 0x%08X",pdirtm2);
+ #endif
+ //Thread::wait(10);
+ //pc.printf("\n\rPTE->DIR = 0x%08X",PTE->PDIR);
+ //debug3();
+ //wait_ms(10);
+ //pc.printf("\n\rPTE->DIR = 0x%08X",PTE->PDIR);
+ }
+ i2c_count=0;
+ }
+ else if(data_send_flag == 'i')
+ {
+ //to be filled
+ data_send_flag = 'h';
+ }
}
else if( slave.receive()==3 || slave.receive()==2) // slave read
{
- read_ack=slave.read(telecommand,tc_len);
- t_tc.start();
- //pc.printf("\n\rTELECOMMAND received from CDMS is %s \n",telecommand);
- pc.printf("\n\r Executing Telecommand \n");
- // FCTN_TC_DECODE((uint8_t*) telecommand);
-
- FCTN_BAE_TM_TC((uint8_t*) telecommand);
- //telemetry = (char*)temp;
-
- FCTN_TM();
- t_tc.stop();
- printf("\n\r time taken %d",t_tc.read_us());
- t_tc.reset();
+ uint8_t i2c_count = 0;
+ synch.stop();
+ read_ack=slave.read((char *)telecommand,11);
+ Thread::wait(1);
+ pdirtc1=PTE->PDIR;
+ irpt_2_mstr = 1;
+ data_send_flag = 't';
+ if(read_ack==0)
+ {
+ while(((pdirtc1 & 0x00000003)!=3)&& i2c_count<10)
+ {
+ Thread::wait(1);
+ pdirtc1=PTE->PDIR;
+ i2c_count++;
+ }
+ if(((pdirtc1 & 0x00000003)==3))
+ {
+ pc.printf("\n\n\rRead TC success");
+
+ // FCTN_TC_DECODE((uint8_t*) telecommand);
+ //FCTN_BAE_TM_TC((uint8_t*) telecommand);
+ //telemetry = (char*)temp;
+ //FCTN_TM();
+
+ //uint8_t read_ack2 = (uint8_t)(PTE->PDIR & 0x00000003);
+ //printf("\n\rread_ack2 = %d",read_ack2);
+ //if((read_ack ==0)&&(read_ack2==3))
+ //if(read_ack==0 && ((PTE->PDIR & 0x00000003)==3))
+ //debug2();
+ //pc.printf("\n\rPTE->DIR = 0x%08X",PTE->PDIR);
+ //wait_us(10);
+ //read_ack2 = (uint8_t)(PTE->PDIR & 0x00000003);
+ //tempt.stop();
+ //data_send_flag = 't'; //uncomment later
+ }
+ else
+ {
+ #if PRINT
+ pc.printf("\n\n\rRead TC error");
+ pc.printf("\n\rPTE->DIR = 0x%08X",pdirtc1);
+ #endif
+ I2C_busreset();
+ pdirtc2=PTE->PDIR;
+ #if PRINT
+ pc.printf("\n\rPTE->DIR = 0x%08X",pdirtc2);
+ #endif
+ //pc.printf("\n\rPTE->DIR = 0x%08X",PTE->PDIR);
+ //debug3();
+ //printf("\n\rread_ack2 = %d and time = %d",read_ack2,tempt.read_us());
+ //data_send_flag = 'i';
+ }
+ //pc.printf("\n\rTC count:%d",i2c_count);
+ }
+ else
+ {
+ #if PRINT
+ pc.printf("\n\n\rTC ack failed");
+ pc.printf("\n\rPTE->DIR = 0x%08X",pdirtc1);
+ #endif
+ I2C_busreset();
+ pdirtc2=PTE->PDIR;
+ #if PRINT
+ pc.printf("\n\rPTE->DIR = 0x%08X",pdirtc2);
+ #endif
+ //pc.printf("\n\rPTE->DIR = 0x%08X",PTE->PDIR);
+ }
+ i2c_count = 0;
+ //printf("\n\rSize of data : %d",sizeof(telecommand));
+ //printf("\n\rGiven Size : %d\n",11);
+ //printf("\n\rREAD_ACK : %d",read_ack);
+ //t_tc.start();
+ //pc.printf("\n\rTELECOMMAND received from CDMS is %s \n",telecommand);
+ //pc.printf("\n\r Executing Telecommand \n");
+
+ //t_tc.stop();
+ //printf("\n\r time taken %d",t_tc.read_us());
+ //t_tc.reset();
// for(int i = 0; i<134; i++)
//pc.printf("%c", telemetry[i]);
- }
-
-
- }
+ }
+ //pc.printf("Time after slave.read() = %d",synch.read_us());
+ //synch.reset();
+ }
}
-
void FCTN_TM()
{
//irpt_2_mstr = 0;
@@ -492,6 +750,7 @@
void FCTN_I2C_ISR()
{
+ //synch.start();
ptr_t_i2c->signal_set(0x4);
}
@@ -623,29 +882,29 @@
uint8_t schedcount=1;
void T_SC(void const *args)
{
- printf("\n\r in scheduler");
+ //printf("\n\r in scheduler");
if(schedcount == 7) //to reset the counter
{
schedcount = 1;
}
if(schedcount%1==0)
- { pc.printf("\nSTATE IS !!!!!! = %x !!\n",ACS_STATE);
- pc.printf("\niterp1 !!!!!! = %x !!\n",iterP1);
- pc.printf("\niteri2 IS !!!!!! = %x !!\n",iterI2);
- F_ACS();
+ { //pc.printf("\nSTATE IS !!!!!! = %x !!\n",ACS_STATE);
+ //pc.printf("\niterp1 !!!!!! = %x !!\n",iterP1);
+ //pc.printf("\niteri2 IS !!!!!! = %x !!\n",iterI2);
+ //F_ACS();
}
if(schedcount%2==0)
{
- // F_EPS();
+ //F_EPS();
}
if(schedcount%1==0)
{
- F_BCN();
+ //F_BCN();
}
schedcount++;
- printf("\n\r exited scheduler");
+ //printf("\n\r BAE is alive\n");
}
Timer t_flag;
@@ -782,8 +1041,8 @@
TRXY_SW = 1;
//............................//
- FCTN_ACS_INIT();
- // FCTN_EPS_INIT();
+ //FCTN_ACS_INIT();
+ //FCTN_EPS_INIT();
//FCTN_BCN_INIT();
@@ -792,8 +1051,9 @@
int main()
{
+ pc.baud(9600);
pc.printf("\n\r BAE Activated. Testing Version 1.1 \n");
- CDMS_RESET = 1;
+ //CDMS_RESET = 1;
/*if (BCN_FEN == 0) //dummy implementation
{
pc.printf("\n\r RF silence ");
@@ -810,6 +1070,8 @@
//FLAG();
FCTN_BAE_INIT();
+ //pc.printf("\n\rPORTE->PCR[0] = 0x%08X",PORTE->PCR[0]);
+ //pc.printf("\n\rPORTE->PCR[1] = 0x%08X",PORTE->PCR[1]);
//...i2c..
@@ -835,8 +1097,10 @@
t_sc_timer.start(10000);
t_start.start();
pc.printf("\n\rStarted scheduler %f\n\r",t_start.read());
-
-
+ printf("\n\rPTE->DIR = 0x%08X",PTE->PDIR);
+ //printf("\n\rInitial values\n");
+ //debug();
+ //debug2();
//FCTN_BAE_INIT();
while(1); //required to prevent main from terminating
}
