/********************************************/
/*71V30 Dual Port RAM Configuration Code    */
/*PIC32MX795F512L-80I/PF                    */
/********************************************/

#include "xc.h"
#include "REN71V30.h"
#include "Delay.h"
 
void REN71V30_Init(void)
{    
    //RD3 = /CS1
    TRISDbits.TRISD3 = 0;
    PORTDbits.RD3 = 1;
    
    //BUSY - BUSYR
    TRISEbits.TRISE9 = 1;
    
    //INT1 - INTR
    TRISEbits.TRISE8 = 1;
    
    //Lock in
    TRISAbits.TRISA7 = 1;
    
    REN71V30_RD(0x3ff);
    
    return;
}

void REN71V30_WR(unsigned address_71V30, uint8_t mdata_71V30)
{        
    //save previous address
    //this fixes a hang issue
    int d = PMADDR;
    
    //LOCK bit
    //while(PORTAbits.RA7 != 0);

    PMADDR = address_71V30;
    
    // /CS1 
    PORTDbits.RD3 = 0;
    
    PMDIN = mdata_71V30;
    while(PMMODEbits.BUSY == 1);

    // /CS1
    PORTDbits.RD3 = 1;
        
    //restore previous address
    PMADDR = d;
    
    return;
}

void REN71V30_RD(unsigned address_71V30)
{        
    //save previous address
    //this fixes a hang issue
    int d = PMADDR;
    
    PMADDR = address_71V30;
    
    // /CS1
    PORTDbits.RD3 = 0;
        
    //dummy read
    mdata_71V30 = PMDIN;
    while(PMMODEbits.BUSY == 1);
   
    mdata_71V30 = PMDIN;
    while(PMMODEbits.BUSY == 1);

    // /CS1
    PORTDbits.RD3 = 1;
    
    //restore previous address
    PMADDR = d;
    
    return;
}

void memtest_71V30(void)
{
    int a;
    int b;
    /////////////////////////////
    //SRAM write all zeros
    ////////////////////////////
    b = 0;
    for(a=0;a<1024;a++)
    {
        PMADDR = a;
        // /CS1 
        PORTDbits.RD3 = 0;

        mdata_71V30 = b;
        PMDIN = mdata_71V30;
        while(PMMODEbits.BUSY == 1);

        // /CS1
        PORTDbits.RD3 = 1;
    }
    /////////////////////////////
    
    //SRAM read and verify 
    for(a=0;a<1024;a++)
    {
        PMADDR = a;
        address_71V30 = a;
        mdata_71V30 = 0;
        // /CS1
        PORTDbits.RD3 = 0;

        //dummy read
        mdata_71V30 = PMDIN;
        while(PMMODEbits.BUSY == 1);

        mdata_71V30 = PMDIN;
        while(PMMODEbits.BUSY == 1);

        if(mdata_71V30 != 0)
        {
            sram_test = 0;
            sram_test_data[a] = 0;
        }
        else
        {
            sram_test = 1;
            sram_test_data[a] = 1;
        }
        // /CS1
        PORTDbits.RD3 = 1;
    }

    return;
}
