sd 32 update

Dependencies:   FreescaleIAP mbed-rtos mbed

Fork of COM_MNG_TMTC_SIMPLE by Shreesha S

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers adf.h Source File

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 }