/****************************************************************************/
/* Copyright 2009 MBARI.                                                    */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/

#include <stdio.h>
#include "sys_defs.h"
#include "spi_io.h"
#include "p24Fxxxx.h"
#include "stdlib.h"
#include "serial.h"

// CONFIG2 = 0xFFEF;


/****************************************************************************/
/*  Setup SPI signals                                                       */
/****************************************************************************/

void spiInit()
{
	
	/* Setup SPI1 (bus) Control Registers */

	SPI1CON1bits.DISSCK = 0; // spi clock enabled
	SPI1CON1bits.DISSDO = 0; // SDO pin enabled
	SPI1CON1bits.MODE16 = 0; // 8-bit words
	SPI1CON1bits.SMP = 0; // input sample in  0:middle 1:end
	SPI1CON1bits.CKE = 1; // output transition is 0:idle to active, 1:active to idle
	SPI1CON1bits.SSEN = 1; // use built in *SS for *CS
	SPI1CON1bits.CKP = 0; // idle=low, active=high
	SPI1CON1bits.MSTEN = 1; // PIC is master
	SPI1CON1bits.SPRE = 0; // Clock secondary prescale = 1:8 
	SPI1CON1bits.PPRE = 3; // Clock primary prescale = 1:1 
	
	SPI1CON2bits.FRMEN = 0; // framed SPI disabled
	SPI1CON2bits.SPIFSD = 0; // 
	SPI1CON2bits.SPIFPOL = 0;
	SPI1CON2bits.SPIFE = 0;
	SPI1CON2bits.SPIBEN = 0; // Enhanced mode disabled

	SPI1STATbits.SPIEN = 1; // enables SPI Communication


	
	
	/* Map SPI signals to RP pins */
	/**********************************************/
		
	/* Unlock PPS registers for configuration change   */
	
	asm volatile	(	"push	w1			\n"
						"push	w2			\n"
						"push	w3			\n"
						"mov	#OSCCON, w1	\n"
						"mov	#0x46, w2	\n"
						"mov	#0x57, w3	\n"
						"mov.b	w2,	[w1]	\n"
						"mov.b	w3,	[w1]	\n"
						"bclr	OSCCON,	#6	\n"
						"pop	w3			\n"
						"pop	w2			\n"
						"pop	w1");   
						

	/* SPI Inputs (to PIC) */
	RPINR20bits.SDI1R = 19; // SDI1 (MISO) RP19


	/* SPI Outputs (from PIC) */
	RPOR13bits.RP27R = 8; // SDO1 (MOSI) n=26 RP27
	RPOR13bits.RP26R = 5; // SCK1OUT (SCK) n=26 RP26
        RPOR10bits.RP21R = 4; // SS1OUT (*CS) n=20 RP21

	/* Lock PPS registers						 */
	
	asm volatile	(	"push	w1			\n"
						"push	w2			\n"
						"push	w3			\n"
						"mov	#OSCCON, w1	\n"
						"mov	#0x46, w2	\n"
						"mov	#0x57, w3	\n"
						"mov.b	w2,	[w1]	\n"
						"mov.b	w3,	[w1]	\n"
						"bset	OSCCON,	#6	\n"
						"pop	w3			\n"
						"pop	w2			\n"
						"pop	w1");  
	
	/*********************************************/
	
}

unsigned int spiReadWrite1(unsigned int data)
{
    /* put data in SPI TX buffer */
    SPI1BUF = data;
	/* wait for xmit to finish */
    while ( !SPI1STATbits.SPIRBF )
        ; /* wait here */
	data = 0;
    return SPI1BUF;
}

