I2C code testing

Dependencies:   FreescaleIAP SimpleDMA mbed-rtos mbed

Fork of COM_MNG_TMTC_SIMPLE_pl123 by Siva ram

Revision:
1:a0055b3280c8
Child:
2:2caf2a9a13aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/adf.h	Mon Dec 14 12:04:01 2015 +0000
@@ -0,0 +1,545 @@
+//without reset feature , with state checks.
+DigitalOut led2(LED_RED);
+InterruptIn IRQ(PTA14);
+Ticker ticker;
+
+bool sent_tmfrom_SDcard;
+bool loop_on;
+bool ADF_off;
+bool buffer_state;
+uint8_t signal = 0x00;
+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};
+
+int initialise_card();
+int disk_initialize();
+
+#define bbram_write {\
+     SPI_mutex.lock();\
+    gCS_ADF=0;\
+    spi.write(0xB0);\
+    wait_us(300);\
+    gCS_ADF=1;\
+    gCS_ADF=0;\
+    for(int i=0;i<66;i++){\
+        spi.write(bbram_buffer[i]);\
+    }\
+    gCS_ADF=1;\
+    SPI_mutex.unlock();\
+}
+//------------------------------------------------------------------------
+// state checking functions
+//bool assrt_phy_off( int, int, int);
+//bool assrt_phy_on( int,int,int);
+//bool assrt_phy_tx(int,int,int);
+
+#define START_ADDRESS 0x020;
+#define MISO_PIN PTE3
+/**************Defining Counter Limits**************/
+#define THRS 20
+#define STATE_ERR_THRS 20
+#define PHY_OFF_EXEC_TIME 300
+#define PHY_ON_EXEC_TIME 300
+#define PHY_TX_EXEC_TIME 600
+/******DEFINING COMMANDS*********/
+#define CMD_HW_RESET 0xC8
+#define CMD_PHY_ON 0xB1
+#define CMD_PHY_OFF 0xB0
+#define CMD_PHY_TX 0xB5
+#define CMD_CONFIG_DEV 0xBB
+
+#define check_status {\
+    unsigned char stat=0;\
+    gCS_ADF=0;\
+    spi.write(0xFF);\
+    stat = spi.write(0xFF);\
+    gCS_ADF=1;\
+    status = stat;\
+}
+
+// all three arguments are int
+#define assrt_phy_off(return_this) {\
+    int cmd_err_cnt = 0;\
+    int spi_err_cnt = 0;\
+    int state_err_cnt = 0;\
+    for(int i = 0 ; i < 40 ;i++){\
+        check_status;\
+        if(status == 0xB1){\
+            return_this = 0;\
+            break;\
+        }\
+        else if(cmd_err_cnt>THRS||spi_err_cnt>THRS){\
+            return_this = 1;\
+            break;\
+        }\
+        else if(state_err_cnt>STATE_ERR_THRS){\
+            return_this = 1;\
+            break;\
+        }\
+        else if( (status & 0xA0) == 0xA0 ){\
+            gCS_ADF=0;\
+            spi.write(CMD_PHY_OFF);\
+            gCS_ADF=1;\
+            wait_us(PHY_OFF_EXEC_TIME);\
+            state_err_cnt++;\
+        }\
+        else if(status&0x80==0x00){\
+            wait_ms(5);\
+            spi_err_cnt++;\
+        }\
+        else {\
+            wait_ms(1);\
+            cmd_err_cnt++;\
+        }\
+    }\
+}
+
+
+//#define assrt_phy_on(cmd_err_cnt, spi_err_cnt, state_err_cnt, return_this){\
+//    status=check_status();\
+//        if((status&0x1F)==0x12){\
+//            return 0;\
+//        }\
+//        else if(cmd_err_cnt>THRS||spi_err_cnt>THRS){\
+//            return 1;\
+//        }\
+//        else if(state_err_cnt>STATE_ERR_THRS){\
+//            return 1;\
+//        }\
+//        else if((status&0xA0)==0xA0){\
+//            cs_adf=0;\
+//            spi.write(0xB1);\
+//            cs_adf=1;\
+//            wait_us(PHY_ON_EXEC_TIME);\
+//            return assrt_phy_on(cmd_err_cnt,spi_err_cnt,state_err_cnt+1);\
+//        }\
+//        else if(status&0x80==0x00){\
+//            wait_ms(5);\
+//            //Error: SPI=0 Not ready CMD= Dont care
+//            return assrt_phy_on(cmd_err_cnt,spi_err_cnt+1,state_err_cnt);\
+//        }\
+//        else{\
+//            if(status&0xA0==0x80){\
+//            wait_ms(1);\
+//            //Error: Command Not ready SPI Ready cmd_err_cnt is a global variable
+//            return assrt_phy_on(cmd_err_cnt+1,spi_err_cnt,state_err_cnt);\
+//            }\
+//        }\
+//}
+
+
+
+
+#define initial_adf_check {\
+    spi.write(CMD_PHY_OFF);\
+    int tempReturn = 0;\
+    while( hw_reset_err_cnt < 2 ){\
+        assrt_phy_off( tempReturn);\
+        if( !tempReturn ){\
+            bbram_write;\
+            bbram_flag=1;\
+            break;\
+        }\
+        else{\
+            hardware_reset(0);\
+            hw_reset_err_cnt++;\
+        }\
+    }\
+    assrt_phy_off(tempReturn);\
+    if(!bbram_flag){\
+        bcn_flag=1;\
+     }\
+}
+
+unsigned char status =0;
+unsigned int cmd_err_cnt=0;
+unsigned int state_err_cnt=0;
+unsigned int miso_err_cnt=0;
+unsigned int hw_reset_err_cnt=0;
+bool bcn_flag=0;
+bool bbram_flag=0;
+
+//bool assrt_phy_off(int cmd_err_cnt,int spi_err_cnt,int state_err_cnt){
+//    status=check_status();
+//        if(status==0xB1){
+//            return 0;
+//        }
+//        else if(cmd_err_cnt>THRS||spi_err_cnt>THRS){
+//            return 1;//You need to Reset the hardware
+//        }
+//        else if(state_err_cnt>STATE_ERR_THRS){
+//            return 1;//Again reset the hardware
+//        }
+//        else if((status&0xA0)==0xA0){  //If Status' first three bit ore 0b1X1 =>SPI ready, Dont care interrupt and CMD Ready.
+//            cs_adf=0;
+//            spi.write(CMD_PHY_OFF);        //CMD_PHY_OFF=0xB0
+//            cs_adf=1;
+//            wait_us(PHY_OFF_EXEC_TIME);// Typical = 24us  We are giving 300us 
+//            return assrt_phy_off(cmd_err_cnt,spi_err_cnt,state_err_cnt+1);
+//        }
+//        else if(status&0x80==0x00){
+//            wait_ms(5);
+//            //Error: SPI=0 Not ready CMD= Dont care
+//            return assrt_phy_off(cmd_err_cnt,spi_err_cnt+1,state_err_cnt);
+//        }
+//        else {//if(status&0xA0==0x80){
+//            wait_ms(1);
+//            //Error: Command Not ready SPI Ready cmd_err_cnt is a global variable
+//            return assrt_phy_off(cmd_err_cnt+1,spi_err_cnt,state_err_cnt);
+//        }
+//}
+
+//bool assrt_phy_on(int cmd_err_cnt,int spi_err_cnt,int state_err_cnt){
+//    status=check_status();
+//        if((status&0x1F)==0x12){
+//            return 0;
+//        }
+//        else if(cmd_err_cnt>THRS||spi_err_cnt>THRS){
+//            return 1;//You need to Reset the hardware
+//        }
+//        else if(state_err_cnt>STATE_ERR_THRS){
+//            return 1;//Again reset the hardware
+//        }
+//        else if((status&0xA0)==0xA0){  //If Status' first three bit ore 0b1X1 =>SPI ready, Dont care interrupt and CMD Ready.
+//            cs_adf=0;
+//            spi.write(0xB1);        //CMD_PHY_OFF
+//            cs_adf=1;
+//            wait_us(PHY_ON_EXEC_TIME);// Typical = 24us  We are giving 300us 
+//            return assrt_phy_on(cmd_err_cnt,spi_err_cnt,state_err_cnt+1);
+//        }
+//        else if(status&0x80==0x00){
+//            wait_ms(5);
+//            //Error: SPI=0 Not ready CMD= Dont care
+//            return assrt_phy_on(cmd_err_cnt,spi_err_cnt+1,state_err_cnt);
+//        }
+//        else{
+//            if(status&0xA0==0x80){
+//            wait_ms(1);
+//            //Error: Command Not ready SPI Ready cmd_err_cnt is a global variable
+//            return assrt_phy_on(cmd_err_cnt+1,spi_err_cnt,state_err_cnt);
+//            }
+//        }
+//}
+
+
+// bool assrt_phy_tx(int cmd_err_cnt,int spi_err_cnt,int state_err_cnt){
+//    status=check_status();
+//        if((status & 0x1F) == 0x14){
+//            return 0;
+//        }
+//        else if(cmd_err_cnt>THRS||spi_err_cnt>THRS){
+//            return 1;//You need to Reset the hardware
+//        }
+//        else if(state_err_cnt>STATE_ERR_THRS){
+//            return 1;//Again reset the hardware
+//        }
+//        else if((status&0xA0)==0xA0){  //If Status' first three bit ore 0b1X1 =>SPI ready, Dont care interrupt and CMD Ready.
+//            cs_adf=0;
+//            spi.write(0xB1);        //CMD_PHY_OFF
+//            cs_adf=1;
+//            wait_us(PHY_TX_EXEC_TIME);// Typical = 24us  We are giving 300us 
+//            return assrt_phy_tx(cmd_err_cnt,spi_err_cnt,state_err_cnt+1);
+//        }
+//        else if(status&0x80==0x00){
+//            wait_ms(1);
+//            //Error: SPI=0 Not ready CMD= Dont care
+//            return assrt_phy_tx(cmd_err_cnt,spi_err_cnt+1,state_err_cnt);
+//        }
+//        else {
+//            if(status&0xA0==0x80){
+//            wait_us(50);
+//            //Error: Command Not ready SPI Ready cmd_err_cnt is a global variable
+//            return assrt_phy_tx(cmd_err_cnt+1,spi_err_cnt,state_err_cnt);
+//            }
+//        }
+//}
+
+bool hardware_reset(int bcn_call){
+    for(int i= 0; i < 20 ; i++){
+        gCS_ADF=0;
+        spi.write(CMD_HW_RESET);
+        gCS_ADF=1;
+        wait_ms(2);// Typically 1 ms
+        int count=0;
+        int temp_return = 0;
+        while(count<10 && miso_err_cnt<10){      
+            if(MISO_PIN){
+                assrt_phy_off(temp_return);
+                if(!temp_return){
+                    return 0;
+                }
+                count++;
+            }
+            else{
+                wait_us(50);
+                miso_err_cnt++;
+            }
+        }
+    }
+    return 1;
+}
+
+//bool hardware_reset(int bcn_call){
+//    if (bcn_call>20){//Worst Case 20seconds will be lost !
+//        return 1;
+//    }
+//    int count=0;
+//    cs_adf=0;
+//    spi.write(CMD_HW_RESET);
+//    cs_adf=1;
+//    wait_ms(2);// Typically 1 ms
+//    while(count<10 && miso_err_cnt<10){      
+//        if(MISO_PIN){
+//            int temp_return;
+//            assrt_phy_off(0,0,0,temp_return);
+//            if(!temp_return){
+//                break;
+//            }
+//            count++;
+//        }
+//        else{
+//            wait_us(50);
+//            miso_err_cnt++;
+//        }
+//    }
+//    if(count==10 ||miso_err_cnt==10){
+//        return hardware_reset(bcn_call+1);  
+//    }
+//    else
+//        return 0;
+//    
+//}
+
+
+
+
+//void initial_adf_check(){
+//        spi.write(CMD_PHY_OFF); //0xB0
+//        while(hw_reset_err_cnt<2){
+//        
+//            if(!assrt_phy_off(0,0,0)){  //assrt_phy_off () returns 0 if state is PHY_OFF , returns 1 if couldn't go to PHY_OFF
+//                bbram_write();
+//                bbram_flag=1;
+//                break;
+//            }
+//            else{
+//                hardware_reset(0);  // Asserts Hardware for 20sec(20times). PHY_OFF for 20,000 times
+//                hw_reset_err_cnt++;
+//            }
+//        }
+//        assrt_phy_off(0,0,0);// We actually do not need this but make sure "we do not need this"
+//        if(!bbram_flag){
+//        //Switch to beacon
+//            bcn_flag=1;
+//         }
+//}
+
+//for reseting the transmission call assert function after b5 and b1. after b1 assert_phi_on and after b5 assert_phi_tx. 
+//----------------------------------------------------------------------------
+
+# define initiate {\
+    SPI_mutex.lock();\
+    gCS_ADF=0;\
+    spi.write(0xFF);\
+    spi.write(0xFF);\
+    gCS_ADF=1;\
+    gCS_ADF=0;\
+    spi.write(0x08);\
+    spi.write(0x14);\
+    spi.write(0xFF);\
+    gCS_ADF=1;\
+    gCS_ADF=0;\
+    spi.write(0x08);\
+    spi.write(0x15);\
+    spi.write(0xFF);\
+    gCS_ADF=1;\
+    gCS_ADF=0;\
+    spi.write(0x09);\
+    spi.write(0x24);\
+    spi.write(0x20);\
+    gCS_ADF=1;\
+    gCS_ADF=0;\
+    spi.write(0x09);\
+    spi.write(0x37);\
+    spi.write(0xE0);\
+    gCS_ADF=1;\
+    gCS_ADF=0;\
+    spi.write(0x09);\
+    spi.write(0x36);\
+    spi.write(0x70);\
+    gCS_ADF=1;\
+    gCS_ADF=0;\
+    spi.write(0x09);\
+    spi.write(0x39);\
+    spi.write(0x10);\
+    gCS_ADF=1;\
+    SPI_mutex.unlock();\
+}
+
+
+#define write_data {\
+    SPI_mutex.lock();\
+    gCS_ADF=0;\
+    spi.write(0x0B);\
+    spi.write(0x36);\
+    spi.write(0xFF);\
+    gCS_ADF=1;\
+    gCS_ADF=0;\
+    if(buffer_state){\
+        spi.write(0x18);\
+        spi.write(0x20);\
+        for(unsigned char i=0; i<112;i++){\
+            spi.write(buffer_112[i]);\
+        }\
+    }\
+    else{\
+        spi.write(0x18);\
+        spi.write(0x90);\
+        for(unsigned char i=0; i<112;i++){\
+            spi.write(buffer_112[i]);\
+        }\
+    }\
+    gCS_ADF=1;\
+    SPI_mutex.unlock();\
+    buffer_state = !buffer_state;\
+    if(last_buffer){\
+        ADF_off = true;\
+        gPC.puts("adf_off\r\n");\
+    }\
+}
+ 
+
+void check(){   
+    if(IRQ){
+        gCOM_MNG_TMTC_THREAD->signal_set(signal);
+    }
+}
+  
+
+#define send_data {\
+    SPI_mutex.lock();\
+    gCS_ADF=0;\
+    spi.write(0xBB);\
+    gCS_ADF=1;\
+    gCS_ADF=0;\
+    spi.write(0xFF);\
+    spi.write(0xFF);\
+    gCS_ADF=1;\
+    SPI_mutex.unlock();\
+    if(sent_tmfrom_SDcard){\
+        send_tm_from_SD_card();\
+    }else{\
+        snd_tm.transmit_data(buffer_112,&last_buffer);\
+    }\
+    write_data;\
+    if(sent_tmfrom_SDcard){\
+        send_tm_from_SD_card();\
+    }else{\
+        snd_tm.transmit_data(buffer_112,&last_buffer);\
+    }\
+    write_data;\
+    if(sent_tmfrom_SDcard){\
+        send_tm_from_SD_card();\
+    }else{\
+        snd_tm.transmit_data(buffer_112,&last_buffer);\
+    }\
+    SPI_mutex.lock();\
+    gCS_ADF=0;\
+    spi.write(0xB1);\
+    gCS_ADF=1;\
+    wait_us(300);\
+    gCS_ADF=0;\
+    spi.write(0xFF);\
+    spi.write(0xFF);\
+    gCS_ADF=1;\
+    gCS_ADF=0;\
+    spi.write(0xB5);\
+    gCS_ADF=1;\
+    wait_us(300);\
+    gCS_ADF=0;\
+    spi.write(0xFF);\
+    spi.write(0xFF);\
+    gCS_ADF=1;\
+    SPI_mutex.unlock();\
+    ticker.attach_us(&check,32000);\
+}
+    
+    
+    
+#define adf_SND_SDCard {\
+    buffer_state = true;\
+    last_buffer = false;\
+    loop_on = true;\
+    ADF_off = false;\
+    sent_tmfrom_SDcard = true;\
+    signal = COM_MNG_TMTC_SIGNAL_ADF_SD;\
+    start_block_num = starting_add;\
+    end_block_num = ending_add;\
+    initial_adf_check;\
+    initiate;\
+    send_data;\
+    while(loop_on){\
+        led2=!led2;\
+        Thread::signal_wait(COM_MNG_TMTC_SIGNAL_ADF_SD);\
+        if(ADF_off){\
+            SPI_mutex.lock();\
+            ticker.detach();\
+            gCS_ADF=0;\
+            spi.write(0xB1);\
+            gCS_ADF=1;\
+            SPI_mutex.unlock();\
+            gPC.puts("transmission done\r\n");\
+            loop_on = false;\
+        }else{\
+            write_data;\
+            if(!last_buffer)\
+            send_tm_from_SD_card();\
+        }\
+    }\
+}
+    
+void read_TC(Base_tc* TC_ptr){
+    gPC.puts("Inside sd card sending\r\n");
+    unsigned char service_subtype = 0;
+    uint64_t starting_add  = 0, ending_add = 0;
+    service_subtype = (TC_ptr->TC_string[2])&0x0f;
+    starting_add =  (TC_ptr->TC_string[5]) +  ( (TC_ptr->TC_string[4])<<8 ) + ( (TC_ptr->TC_string[3]) <<16);
+    ending_add =  (TC_ptr->TC_string[8]) +  ( (TC_ptr->TC_string[7])<<8 ) + ( (TC_ptr->TC_string[6]) <<16);
+    starting_add = 10; // for now
+    ending_add = 20;
+//    adf_SND_SDCard(starting_add , ending_add);
+    gPC.puts("sending from sd card\r\n");
+    adf_SND_SDCard;
+}
+    
+
+void adf_not_SDcard(){
+    buffer_state = true;
+    last_buffer = false;
+    loop_on = true;
+    ADF_off = false;
+    sent_tmfrom_SDcard = false;
+   
+    signal = COM_MNG_TMTC_SIGNAL_ADF_NSD;
+    initial_adf_check;
+    initiate;
+    send_data;
+
+    while(loop_on){
+        led2=!led2;
+        Thread::signal_wait(COM_MNG_TMTC_SIGNAL_ADF_NSD);
+        if(ADF_off){
+            SPI_mutex.lock();
+            ticker.detach();
+//            wait_ms(35); 
+            gCS_ADF=0;
+            spi.write(0xB1);
+            gCS_ADF=1;
+            SPI_mutex.unlock();
+            loop_on = false;
+        }else{   
+            write_data;
+            snd_tm.transmit_data(buffer_112,&last_buffer);
+        }
+    }
+}
+ 
\ No newline at end of file