/********************************************/
/*Parallel Master Port Configuration Code   */
/*PIC32MX795F512L-80I/PF                    */
/********************************************/

#include <p32xxxx.h>

void PMP_Init(void)
{
    //RESET the Module
    PMCONbits.ON = 0;
    
    //PMCON: Parallel Port Control Register
    PMCONbits.ADRMUX = 0;               //Address and data are separate
    PMCONbits.PMPTTL = 0;               //Schmitt Trigger input buffer
    PMCONbits.PTWREN = 1;               //WR enable strobe port
    PMCONbits.PTRDEN = 1;               //RD enable strobe port
    PMCONbits.CSF = 0;                  //PMCS1 and PMCS2
    PMCONbits.CS1P = 0;                 //PMCS1 is active low
    PMCONbits.WRSP = 0;                 //WR strobe is active low
    PMCONbits.RDSP = 0;                 //RD strobe is active low
    
    //PMMODE: Parallel Port Mode Register
    PMMODEbits.IRQM = 0;                //No interrupts
    PMMODEbits.INCM = 0;                //No auto address inc/dec
    PMMODEbits.MODE16 = 1;              //16-bit mode
    PMMODEbits.MODE = 2;                //Master mode 2
    PMMODEbits.WAITB = 0;               //RD/WR data setup wait states
    PMMODEbits.WAITM = 3;               //RD/WR data wait states
    PMMODEbits.WAITE = 0;               //Data hold wait states
                                                                        
    //PMADDR: Parallel Port Address Register
    PMADDRbits.CS2 = 0;                 //PMCS2 is inactive
    PMADDRbits.CS1 = 0;                 //PMCS1 is inactive
    
    //PMAEN: PARALLEL PORT PIN ENABLE REGISTER
    PMAENbits.PTEN15 = 1;               //A15 is I/O
    PMAENbits.PTEN14 = 1;               //A14 is I/O
    PMAENbits.PTEN13 = 1;               //A13 is I/O
    PMAENbits.PTEN12 = 1;               //A12 is I/O
    PMAENbits.PTEN11 = 1;               //A11 is I/O
    PMAENbits.PTEN10 = 1;               //A10 is I/O
    PMAENbits.PTEN9 = 1;                //A9 is I/O
    PMAENbits.PTEN8 = 1;                //A8 is I/O
    PMAENbits.PTEN7 = 1;                //A7 is I/O
    PMAENbits.PTEN6 = 1;                //A6 is I/O
    PMAENbits.PTEN5 = 1;                //A5 is I/O
    PMAENbits.PTEN4 = 1;                //A4 is I/O
    PMAENbits.PTEN3 = 1;                //A3 is I/O
    PMAENbits.PTEN2 = 1;                //A2 is I/O
    PMAENbits.PTEN1 = 1;                //A1 is I/O
    PMAENbits.PTEN0 = 1;                //A0 is I/O
    
    //RF13 = /CS0 (Display)
    TRISFbits.TRISF13 = 0;
    PORTFbits.RF13 = 1;
    
    //RD3 = /CS1 (Dual Port RAM)
    TRISDbits.TRISD3 = 0;
    PORTDbits.RD3 = 1;    
    
    //RF12 = /CS2 (External Flash)
    TRISFbits.TRISF12 = 0;
    PORTFbits.RF12 = 1;
    
    //Enable the Module
    PMCONbits.ON = 1;

    return;
}
