/********************************************/
/*70V05 Dual Port RAM Driver Code           */
/*dsPIC33CK512MP608                         */
/*BUSY version                    */
/********************************************/

    /*     Flag Table        */
    //Flag 000 = address 0000 - 03ff
    //Flag 001 = address 0400 - 07ff
    //Flag 010 = address 0800 - 0bff
    //Flag 011 = address 0c00 - 0fff
    //Flag 100 = address 1000 - 13ff
    //Flag 101 = address 1400 - 17ff
    //Flag 110 = address 1800 - 1bff
    //Flag 110 = address 1c00 - 1fff
    
#include "xc.h"
#include <stdbool.h>
#include "MainMotion.h"

uint16_t address_70V05;
uint8_t volatile mdata_70V05;
volatile bool SRAM_BUSY = false;

void dsPIC33_REN70V05_Init(void)
{    
    //SEM
    ANSELE = 0;
    TRISEbits.TRISE3 = 0;
    PORTEbits.RE3 = 1;   
    
    //RB5 = SRAM /CS (output)
    ANSELB = 0;
    TRISBbits.TRISB5 = 0;
    PORTBbits.RB5 = 1;

    //Configure SRAM INT pin RE0 (input)
    TRISEbits.TRISE0 = 1;
    ANSELEbits.ANSELE0 = 0;

    //Configure SRAM BUSY pin RE1
    TRISEbits.TRISE1 = 1;
    ANSELEbits.ANSELE1 = 0; 
    
    PORTBbits.RB4 = 1;
}

void dsPIC33_REN70V05_WR(uint16_t address_70V05, uint8_t mdata_70V05)
{     
    PMADDR = address_70V05;

    ///CE
    PORTBbits.RB5 = 1;

    PMADDR = address_70V05;

    ///CE    
    PORTBbits.RB5 = 0;

    while(PMMODEbits.BUSY == 1);
    PMDIN1 = mdata_70V05;
    while(PMMODEbits.BUSY == 1);
    

    ///CE
    PORTBbits.RB5 = 1;
}

uint8_t dsPIC33_REN70V05_RD(uint16_t address_70V05)
{  
    SRAM_BUSY = false;
    
    // /CS1
    PORTBbits.RB5 = 0;

    PMADDR = address_70V05;
    
    //dummy read
    while(PMMODEbits.BUSY == 1);
    mdata_70V05 = PMDIN1;
    while(PMMODEbits.BUSY == 1);
   
    while(PMMODEbits.BUSY == 1);
    mdata_70V05 = PMDIN1;
    while(PMMODEbits.BUSY == 1);

    // /CS1
    PORTBbits.RB5 = 1;

    return mdata_70V05;
}