sd 32 update
Dependencies: FreescaleIAP mbed-rtos mbed
Fork of COM_MNG_TMTC_SIMPLE by
adf.h
00001 //without reset feature , with state checks. 00002 InterruptIn IRQ(ADF_IRQ); 00003 //Ticker ticker; 00004 00005 bool sent_tmfrom_SDcard; 00006 //bool loop_on; 00007 bool ADF_off; 00008 bool buffer_state; 00009 bool finish_write_data; 00010 uint8_t signal = 0x00; 00011 unsigned char bbram_buffer[66]={0x19,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0xF4,0xC2,0x10,0xC0,0x00,0x30,0x31,0x07,0x00,0x01,0x00,0x7F,0x00,0x0B,0x37,0x00,0x00,0x40,0x0C,0x00,0x05,0x00,0x00,0x18,0x12,0x34,0x56,0x10,0x10,0xC4,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00}; 00012 00013 //int initialise_card(); 00014 //int disk_initialize(); 00015 00016 #define bbram_write {\ 00017 SPI_mutex.lock();\ 00018 gCS_ADF=0;\ 00019 spi.write(0xB0);\ 00020 wait_us(300);\ 00021 gCS_ADF=1;\ 00022 gCS_ADF=0;\ 00023 for(int i=0;i<66;i++){\ 00024 spi.write(bbram_buffer[i]);\ 00025 }\ 00026 gCS_ADF=1;\ 00027 SPI_mutex.unlock();\ 00028 } 00029 //------------------------------------------------------------------------ 00030 // state checking functions 00031 //bool assrt_phy_off( int, int, int); 00032 //bool assrt_phy_on( int,int,int); 00033 //bool assrt_phy_tx(int,int,int); 00034 00035 #define START_ADDRESS 0x020; 00036 #define MISO_PIN PTE3 00037 /**************Defining Counter Limits**************/ 00038 #define THRS 20 00039 #define STATE_ERR_THRS 20 00040 #define PHY_OFF_EXEC_TIME 300 00041 #define PHY_ON_EXEC_TIME 300 00042 #define PHY_TX_EXEC_TIME 600 00043 /******DEFINING COMMANDS*********/ 00044 #define CMD_HW_RESET 0xC8 00045 #define CMD_PHY_ON 0xB1 00046 #define CMD_PHY_OFF 0xB0 00047 #define CMD_PHY_TX 0xB5 00048 #define CMD_CONFIG_DEV 0xBB 00049 00050 #define check_status {\ 00051 unsigned char stat=0;\ 00052 gCS_ADF=0;\ 00053 spi.write(0xFF);\ 00054 stat = spi.write(0xFF);\ 00055 gCS_ADF=1;\ 00056 status = stat;\ 00057 } 00058 00059 // all three arguments are int 00060 #define assrt_phy_off(return_this) {\ 00061 int cmd_err_cnt = 0;\ 00062 int spi_err_cnt = 0;\ 00063 int state_err_cnt = 0;\ 00064 for(int i = 0 ; i < 40 ;i++){\ 00065 check_status;\ 00066 if(status == 0xB1){\ 00067 return_this = 0;\ 00068 break;\ 00069 }\ 00070 else if(cmd_err_cnt>THRS||spi_err_cnt>THRS){\ 00071 return_this = 1;\ 00072 break;\ 00073 }\ 00074 else if(state_err_cnt>STATE_ERR_THRS){\ 00075 return_this = 1;\ 00076 break;\ 00077 }\ 00078 else if( (status & 0xA0) == 0xA0 ){\ 00079 gCS_ADF=0;\ 00080 spi.write(CMD_PHY_OFF);\ 00081 gCS_ADF=1;\ 00082 wait_us(PHY_OFF_EXEC_TIME);\ 00083 state_err_cnt++;\ 00084 }\ 00085 else if(status&0x80==0x00){\ 00086 wait_ms(5);\ 00087 spi_err_cnt++;\ 00088 }\ 00089 else {\ 00090 wait_ms(1);\ 00091 cmd_err_cnt++;\ 00092 }\ 00093 }\ 00094 } 00095 00096 00097 #define initial_adf_check {\ 00098 spi.write(CMD_PHY_OFF);\ 00099 int tempReturn = 0;\ 00100 bool flag = false;\ 00101 while( hw_reset_err_cnt < 2 ){\ 00102 assrt_phy_off( tempReturn);\ 00103 if( !tempReturn ){\ 00104 bbram_write;\ 00105 bbram_flag=1;\ 00106 flag = true;\ 00107 break;\ 00108 }\ 00109 else{\ 00110 hardware_reset(0);\ 00111 hw_reset_err_cnt++;\ 00112 gPC.puts("Resetting hardware\r\n");\ 00113 }\ 00114 }\ 00115 if( flag == false ){\ 00116 gPC.puts("Seems to be SPI problem\r\n");\ 00117 }\ 00118 assrt_phy_off(tempReturn);\ 00119 if(!bbram_flag){\ 00120 bcn_flag=1;\ 00121 }\ 00122 } 00123 00124 unsigned char status =0; 00125 unsigned int cmd_err_cnt=0; 00126 unsigned int state_err_cnt=0; 00127 unsigned int miso_err_cnt=0; 00128 unsigned int hw_reset_err_cnt=0; 00129 bool bcn_flag=0; 00130 bool bbram_flag=0; 00131 00132 bool hardware_reset(int bcn_call){ 00133 for(int i= 0; i < 20 ; i++){ 00134 gCS_ADF=0; 00135 spi.write(CMD_HW_RESET); 00136 gCS_ADF=1; 00137 wait_ms(2);// Typically 1 ms 00138 int count=0; 00139 int temp_return = 0; 00140 while(count<10 && miso_err_cnt<10){ 00141 if(MISO_PIN){ 00142 assrt_phy_off(temp_return); 00143 if(!temp_return){ 00144 return 0; 00145 } 00146 count++; 00147 } 00148 else{ 00149 wait_us(50); 00150 miso_err_cnt++; 00151 } 00152 } 00153 } 00154 return 1; 00155 } 00156 00157 //for reseting the transmission call assert function after b5 and b1. after b1 assert_phi_on and after b5 assert_phi_tx. 00158 //---------------------------------------------------------------------------- 00159 00160 # define initiate {\ 00161 SPI_mutex.lock();\ 00162 gCS_ADF=0;\ 00163 spi.write(0xFF);\ 00164 spi.write(0xFF);\ 00165 gCS_ADF=1;\ 00166 gCS_ADF=0;\ 00167 spi.write(0x08);\ 00168 spi.write(0x14);\ 00169 spi.write(0xFF);\ 00170 gCS_ADF=1;\ 00171 gCS_ADF=0;\ 00172 spi.write(0x08);\ 00173 spi.write(0x15);\ 00174 spi.write(0xFF);\ 00175 gCS_ADF=1;\ 00176 gCS_ADF=0;\ 00177 spi.write(0x09);\ 00178 spi.write(0x24);\ 00179 spi.write(0x20);\ 00180 gCS_ADF=1;\ 00181 gCS_ADF=0;\ 00182 spi.write(0x09);\ 00183 spi.write(0x37);\ 00184 spi.write(0xE0);\ 00185 gCS_ADF=1;\ 00186 gCS_ADF=0;\ 00187 spi.write(0x09);\ 00188 spi.write(0x36);\ 00189 spi.write(0x70);\ 00190 gCS_ADF=1;\ 00191 gCS_ADF=0;\ 00192 spi.write(0x09);\ 00193 spi.write(0x39);\ 00194 spi.write(0x10);\ 00195 gCS_ADF=1;\ 00196 gCS_ADF=0;\ 00197 spi.write(0xBB);\ 00198 gCS_ADF=1;\ 00199 gCS_ADF=0;\ 00200 spi.write(0xFF);\ 00201 spi.write(0xFF);\ 00202 gCS_ADF=1;\ 00203 SPI_mutex.unlock();\ 00204 } 00205 00206 #define write_data {\ 00207 SPI_mutex.lock();\ 00208 gCS_ADF=0;\ 00209 spi.write(0x0B);\ 00210 spi.write(0x36);\ 00211 spi.write(0xFF);\ 00212 gCS_ADF=1;\ 00213 gCS_ADF=0;\ 00214 if(buffer_state){\ 00215 spi.write(0x18);\ 00216 spi.write(0x20);\ 00217 for(unsigned char i=0; i<112;i++){\ 00218 spi.write(buffer_112[i]);\ 00219 /*gPC.printf("0x%X,",spi.write(buffer_112[i]));*/\ 00220 }\ 00221 }\ 00222 else{\ 00223 spi.write(0x18);\ 00224 spi.write(0x90);\ 00225 for(unsigned char i=0; i<112;i++){\ 00226 spi.write(buffer_112[i]);\ 00227 /*gPC.printf("0x%X,",spi.write(buffer_112[i]));*/\ 00228 }\ 00229 }\ 00230 gCS_ADF=1;\ 00231 SPI_mutex.unlock();\ 00232 buffer_state = !buffer_state;\ 00233 if(last_buffer){\ 00234 finish_write_data = true;\ 00235 gPC.puts("adf_off\r\n");\ 00236 }\ 00237 } 00238 00239 /* 00240 void check(){ 00241 if(IRQ){ 00242 gCOM_MNG_TMTC_THREAD->signal_set(signal); 00243 } 00244 }*/ 00245 00246 00247 #define send_data {\ 00248 if(sent_tmfrom_SDcard){\ 00249 send_tm_from_SD_card();\ 00250 }else{\ 00251 snd_tm.transmit_data(buffer_112,&last_buffer);\ 00252 }\ 00253 write_data;\ 00254 if(sent_tmfrom_SDcard){\ 00255 send_tm_from_SD_card();\ 00256 }else{\ 00257 snd_tm.transmit_data(buffer_112,&last_buffer);\ 00258 }\ 00259 write_data;\ 00260 if(sent_tmfrom_SDcard){\ 00261 send_tm_from_SD_card();\ 00262 }else{\ 00263 snd_tm.transmit_data(buffer_112,&last_buffer);\ 00264 }\ 00265 SPI_mutex.lock();\ 00266 gCS_ADF=0;\ 00267 spi.write(0xB1);\ 00268 gCS_ADF=1;\ 00269 wait_us(300);\ 00270 gCS_ADF=0;\ 00271 spi.write(0xFF);\ 00272 spi.write(0xFF);\ 00273 gCS_ADF=1;\ 00274 gCS_ADF=0;\ 00275 spi.write(0xB5);\ 00276 gCS_ADF=1;\ 00277 wait_us(300);\ 00278 gCS_ADF=0;\ 00279 spi.write(0xFF);\ 00280 spi.write(0xFF);\ 00281 gCS_ADF=1;\ 00282 SPI_mutex.unlock();\ 00283 /*ticker.attach_us(&check,32000);*/\ 00284 } 00285 00286 00287 00288 #define adf_SND_SDCard {\ 00289 sent_tmfrom_SDcard = true;\ 00290 configure_adf;\ 00291 signal = COM_MNG_TMTC_SIGNAL_ADF_SD;\ 00292 send_data;\ 00293 while(loop_on){\ 00294 /*led2=!led2;*/\ 00295 /*gCOM_MNG_TMTC_THREAD->signal_wait(COM_MNG_TMTC_SIGNAL_ADF_SD);*/\ 00296 wait_ms(COM_TX_TICKER_LIMIT);\ 00297 if(IRQ){\ 00298 if(finish_write_data){\ 00299 if(ADF_off){\ 00300 SPI_mutex.lock();\ 00301 gCS_ADF=0;\ 00302 spi.write(0xB1);\ 00303 gCS_ADF=1;\ 00304 SPI_mutex.unlock();\ 00305 loop_on = false;\ 00306 gPC.puts("Transmission done\r\n");\ 00307 }\ 00308 else{\ 00309 ADF_off = true;\ 00310 }\ 00311 }else{\ 00312 write_data;\ 00313 send_tm_from_SD_card();\ 00314 }\ 00315 }\ 00316 }\ 00317 } 00318 00319 //void read_TC(Base_tc* TC_ptr){ 00320 // gPC.puts("Inside sd card sending\r\n"); 00321 // unsigned char service_subtype = 0; 00322 // uint64_t starting_add = 0, ending_add = 0; 00323 // service_subtype = (TC_ptr->TC_string[2])&0x0f; 00324 // starting_add = (TC_ptr->TC_string[5]) + ( (TC_ptr->TC_string[4])<<8 ) + ( (TC_ptr->TC_string[3]) <<16); 00325 // ending_add = (TC_ptr->TC_string[8]) + ( (TC_ptr->TC_string[7])<<8 ) + ( (TC_ptr->TC_string[6]) <<16); 00326 // starting_add = 10; // for now 00327 // ending_add = 20; 00328 //// adf_SND_SDCard(starting_add , ending_add); 00329 // gPC.puts("sending from sd card\r\n"); 00330 // adf_SND_SDCard; 00331 //} 00332 00333 #define configure_adf {\ 00334 finish_write_data = false;\ 00335 buffer_state = true;\ 00336 last_buffer = false;\ 00337 loop_on = true;\ 00338 ADF_off = false;\ 00339 initial_adf_check;\ 00340 gPC.puts("initial adf check\r\n");\ 00341 initiate;\ 00342 gPC.puts("adf configured\r\n");\ 00343 gLEDR = !gLEDR;\ 00344 } 00345 00346 #define adf_not_SDcard {\ 00347 sent_tmfrom_SDcard = false;\ 00348 configure_adf;\ 00349 signal = COM_MNG_TMTC_SIGNAL_ADF_NSD;\ 00350 send_data;\ 00351 while(loop_on){\ 00352 wait_ms(COM_TX_TICKER_LIMIT);\ 00353 if(IRQ){\ 00354 if(finish_write_data){\ 00355 if(ADF_off){\ 00356 SPI_mutex.lock();\ 00357 gCS_ADF=0;\ 00358 spi.write(0xB1);\ 00359 gCS_ADF=1;\ 00360 SPI_mutex.unlock();\ 00361 loop_on = false;\ 00362 gPC.puts("Transmission done\r\n");\ 00363 }\ 00364 else{\ 00365 ADF_off = true;\ 00366 }\ 00367 }else{\ 00368 write_data;\ 00369 snd_tm.transmit_data(buffer_112,&last_buffer);\ 00370 }\ 00371 }\ 00372 }\ 00373 gPC.puts("after while loop\r\n");\ 00374 }
Generated on Tue Jul 12 2022 10:59:21 by 1.7.2