/****************************************************************************/
/* 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;

static char msg_buff[64];
/****************************************************************************/
/*  Setup SPI signals                                                       */
/****************************************************************************/

void spiInit()
{
	
	/* Setup SPI2 (internal) Control Registers */
	
	SPI2CON1bits.DISSCK = 0; // spi clock enabled
	SPI2CON1bits.DISSDO = 0; // SDO pin enabled
	SPI2CON1bits.MODE16 = 0; // 8-bit words
	SPI2CON1bits.SMP = 0; // input sample in middle
	SPI2CON1bits.CKE = 0; // output transition is 0:idle to active, 1:active to idle
	SPI2CON1bits.SSEN = 0; // using a digital out for cs
	SPI2CON1bits.CKP = 0; // idle=low, active=high
	SPI2CON1bits.MSTEN = 1; // PIC is master
	SPI2CON1bits.SPRE = 0; // Clock secondary prescale = 1:8 
	SPI2CON1bits.PPRE = 3; // Clock primary prescale = 1:1 
	
	SPI2CON2bits.FRMEN = 0; // framed SPI disabled
	SPI2CON2bits.SPIFSD = 0; // 
	SPI2CON2bits.SPIFPOL = 0;
	SPI2CON2bits.SPIFE = 0;
	SPI2CON2bits.SPIBEN = 0; // Enhanced mode disabled

	SPI2STATbits.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 = 10; // SDI1 (MISO)
	AD1PCFGbits.PCFG11 = 1;
	RPINR22bits.SDI2R = 13; // SDI2 (MISO)

	/* SPI Outputs (from PIC) */
	RPOR5bits.RP11R = 7; // SDO1 (MOSI)
	AD1PCFGbits.PCFG12 = 1;
	RPOR6bits.RP12R = 8; // SCK1OUT (SCK)
	AD1PCFGbits.PCFG10 = 1;
	RPOR7bits.RP14R = 10; // SDO2 (MOSI)
	AD1PCFGbits.PCFG9 = 1;
	RPOR7bits.RP15R = 11; // SCK2OUT (SCK)

	// RPOR13bits.RP27R = 9; // SS1OUT (CS)
	
//	AD1PCFGbits.PCFG4 = 1; // set pin up as digital input
//	RPINR18bits.U1RXR = 2;  /* Make Pin RP2 U1RX */
//	RPOR1bits.RP3R = 3;     /* Make Pin RP3 U1TX */

	/* 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 spiReadWrite(unsigned int data)
{
    /* put data in SPI TX buffer */
    SPI2BUF = data;
	/* wait for xmit to finish */
    while ( !SPI2STATbits.SPIRBF )
        ; /* wait here */
	data = 0;
    return SPI2BUF;
}

