//************************************************************************************
//**  
//**  File name:     C:\Documents and Settings\Administrator\My Documents\FRAM SPI.c
//**  Generated by:  Flowcode v3.4.7.48
//**  Date:          Thursday, May 01, 2008 18:01:20
//**  Licence:       Professional
//**  Registered to: Ben Rowland
//**  
//**  
//**  http://www.matrixmultimedia.com
//************************************************************************************


#define MX_PIC

//Defines for microcontroller
#define P16F88
#define MX_EE
#define MX_EE_TYPE2
#define MX_EE_SIZE 256
#define MX_SPI
#define MX_SPI_B
#define MX_SPI_SDI 1
#define MX_SPI_SDO 2
#define MX_SPI_SCK 4
#define MX_UART
#define MX_UART_B
#define MX_UART_TX 5
#define MX_UART_RX 2
#define MX_I2C
#define MX_I2C_B
#define MX_I2C_SDA 1
#define MX_I2C_SCL 4
#define MX_PWM
#define MX_PWM_CNT 1
#define MX_PWM_TRIS1 trisb
#define MX_PWM_1 0
#define MX_PWM_TRIS1a trisb
#define MX_PWM_1a 3

//Functions
#include <system.h>
#pragma CLOCK_FREQ 19660800

//Configuration data

//Internal functions
#include "C:\Program Files\Matrix Multimedia\Flowcode V3\FCD\internals.h"

//Macro function declarations


//Variable declarations
char FCV_X;
char FCV_ARRAY[10];




//SPI0: //Macro function declarations

void FCD_SPI0_GetDefines();
void FCD_SPI0_SPI_Init();
void FCD_SPI0_SPI_Uninit();
void FCD_SPI0_SPI_Send_Char(char Char);
char FCD_SPI0_SPI_Get_Char();
void FCD_SPI0_DAC_Send_Char(char Char);
void FCD_SPI0_NVM_Send_Char(char hi_addr, char lo_addr, char Char);
char FCD_SPI0_NVM_Get_Char(char hi_addr, char lo_addr);
char FCD_SPI0_FramOutput(char Char);
void FCD_SPI0_EnableFRAM();
void FCD_SPI0_DisableFRAM();

//Supplementary defines




//SPI0: //Macro implementations


void FCD_SPI0_GetDefines()
{
	
	}  //Dummy end of function to allow defines to be added correctly

	//SPI COMPONENT DEFINES
		#define SPI_DAC_EN 	7
		#define SPI_FRM_EN 	6

		#define SPI_AT91_NCPHA	64 / 32
		#define SPI_AT91_CPOL	0 / 16
		#define SPI_AT91_SCBR	6 * ((0 + 1) * (0 + 1)) * 256


	//FRAM commands
		#define FRAM_WREN  	6
		#define FRAM_WRDI  	4
		#define FRAM_RDSR  	5
		#define FRAM_WRSR  	1
		#define FRAM_READ  	3
		#define FRAM_WRITE 	2

	// Dummy function to close the defines section off
	void SPI_1115070_Dummy_Function();
	void SPI_1115070_Dummy_Function()
	{

}

void FCD_SPI0_SPI_Init()
{
	
		//GetSPI_InitCode
	  #ifndef MX_SPI
		asm error "Chip does not have SPI capability"
	  #endif

		//initialise spi

	  #ifdef MX_SPI_B
		AT91F_PIO_SetOutput(AT91C_BASE_PIOA, PORTB7 | PORTB6);
		AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, PORTB7 | PORTB6);
	  #endif

		AT91F_SPI_CfgPMC();
		AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA, (unsigned int)AT91C_PA12_MISO | (unsigned int)AT91C_PA13_MOSI | (unsigned int)AT91C_PA14_SPCK, 0);
		AT91F_SPI_Reset(AT91C_BASE_SPI);
		AT91F_SPI_Enable(AT91C_BASE_SPI);
		AT91F_SPI_CfgMode(AT91C_BASE_SPI, 0xc0000013);
		AT91F_SPI_CfgCs(AT91C_BASE_SPI, 0, SPI_AT91_SCBR | SPI_AT91_NCPHA | SPI_AT91_CPOL);

}

void FCD_SPI0_SPI_Uninit()
{
		//GetSPI_UninitCode
	  #ifndef MX_SPI
		asm error "Chip does not have SPI capability"
	  #endif

		AT91F_SPI_Disable(AT91C_BASE_SPI);
		AT91F_PIO_CfgInput( AT91C_BASE_PIOA, (unsigned int)AT91C_PA12_MISO | (unsigned int)AT91C_PA13_MOSI | (unsigned int)AT91C_PA14_SPCK);

}

void FCD_SPI0_SPI_Send_Char(char Char)
{
		//GetSPI_Send_CharCode
	  #ifndef MX_SPI
		asm error "Chip does not have SPI capability"
	  #endif

	  	AT91F_SPI_PutChar(AT91C_BASE_SPI, Char, 0);
	  	while((AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0);

}

char FCD_SPI0_SPI_Get_Char()
{
		//GetSPI_Get_CharCode
		char retVal = 0;
	  #ifndef MX_SPI
		asm error "Chip does not have SPI capability"
	  #endif

	  	AT91F_SPI_PutChar(AT91C_BASE_SPI, 0x5a, 0);				// Send a dummy character
		while((AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0);	// Wait for the transmit buffer to empty
		retVal = AT91F_SPI_GetChar(AT91C_BASE_SPI);				// Read the data

		return (retVal);
}

void FCD_SPI0_DAC_Send_Char(char Char)
{
		//GetDAC__Send_Char Code
	  #ifndef MX_SPI
		asm error "Chip does not have SPI capability"
	  #endif

		char dac_val;

		//enable dac
	  #ifdef MX_SPI_B
		AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, PORTB7);
	  #endif

		dac_val = (Char & 0xF0) >> 4;
		AT91F_SPI_PutChar(AT91C_BASE_SPI, dac_val, 0);				// Send data
		while((AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0);	// Wait for the transmit buffer to empty
		delay_us(1);

		dac_val = (Char & 0x0F) << 4;
	  	AT91F_SPI_PutChar(AT91C_BASE_SPI, dac_val, 0);				// Send data
		while((AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0);	// Wait for the transmit buffer to empty
		delay_us(1);

		//disable dac
	  #ifdef MX_SPI_B
		AT91F_PIO_SetOutput(AT91C_BASE_PIOA, PORTB7);
	  #endif

}

void FCD_SPI0_NVM_Send_Char(char hi_addr, char lo_addr, char Char)
{
		//GetNVM_Send_CharCode
	  #ifndef MX_SPI
		asm error "Chip does not have SPI capability"
	  #endif

		// disable interrupts?

		//enable writes
		FCD_SPI0_EnableFRAM();
		FCD_SPI0_FramOutput(FRAM_WREN);
		FCD_SPI0_DisableFRAM();

		//send write-fram command, address and data
		FCD_SPI0_EnableFRAM();
		FCD_SPI0_FramOutput(FRAM_WRITE);
		FCD_SPI0_FramOutput(hi_addr);
		FCD_SPI0_FramOutput(lo_addr);
		FCD_SPI0_FramOutput(Char);
		FCD_SPI0_DisableFRAM();

		// re-enable interrupts?

}

char FCD_SPI0_NVM_Get_Char(char hi_addr, char lo_addr)
{
		//GetNVM_Send_CharCode
		char retVal;

	  #ifndef MX_SPI
		asm error "Chip does not have SPI capability"
	  #endif

		//disable interrupts?

		FCD_SPI0_EnableFRAM();

		//send read-fram command and address
		FCD_SPI0_FramOutput(FRAM_READ);
		FCD_SPI0_FramOutput(hi_addr);
		FCD_SPI0_FramOutput(lo_addr);

		//read the data
		retVal = FCD_SPI0_FramOutput(0x5A);  //don't care byte of 0x5A

		FCD_SPI0_DisableFRAM();

		// re-enable interrupts?

		return(retVal);

}

char FCD_SPI0_FramOutput(char Char)
{
		//GetFramOutputCode
		char retVal;

	  	AT91F_SPI_PutChar(AT91C_BASE_SPI, Char, 0);					// Send data
		while((AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0);	// Wait for the transmit buffer to empty
		retVal = AT91F_SPI_GetChar(AT91C_BASE_SPI);					// Read data

		return (retVal);
}

void FCD_SPI0_EnableFRAM()
{
		//enable FRAM

	  #ifdef MX_SPI_B
		AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, PORTB6);
	  #endif

}

void FCD_SPI0_DisableFRAM()
{
		//disable FRAM

	  #ifdef MX_SPI_B
		AT91F_PIO_SetOutput(AT91C_BASE_PIOA, PORTB6);
	  #endif

}

//Macro implementations

//Supplementary implementations


void main()
{
	
	//Initialisation
	ansel = 0;
	cmcon = 0x07;


	//Interrupt initialisation code
	option_reg = 0xC0;


	//Call Component Macro
	//Call Component Macro: SPI(0)::SPI_Init
	FCD_SPI0_SPI_Init();


	//Call Component Macro
	//Call Component Macro: SPI(0)::EnableFRAM
	FCD_SPI0_EnableFRAM();


	//Calculation
	//Calculation:
	//  array[0] = 0
	//  array[1] = 5
	//  array[2] = 10
	//  array[3] = 15
	//  array[4] = 20
	//  array[5] = 25
	//  array[6] = 30
	//  array[7] = 35
	//  array[8] = 40
	//  array[9] = 45
	FCV_ARRAY[0] = 0;
	FCV_ARRAY[1] = 5;
	FCV_ARRAY[2] = 10;
	FCV_ARRAY[3] = 15;
	FCV_ARRAY[4] = 20;
	FCV_ARRAY[5] = 25;
	FCV_ARRAY[6] = 30;
	FCV_ARRAY[7] = 35;
	FCV_ARRAY[8] = 40;
	FCV_ARRAY[9] = 45;
	

	//Calculation
	//Calculation:
	//  x = 0
	FCV_X = 0;
	

	//Loop
	//Loop: While 1
	while (1)
	{
		//Call Component Macro
		//Call Component Macro: SPI(0)::FramOutput(array[x])
		FCD_SPI0_FramOutput(FCV_ARRAY[FCV_X]);


		//Calculation
		//Calculation:
		//  x = x + 1
		FCV_X = FCV_X + 1;
		

		//Decision
		//Decision: x = 10?
		if (FCV_X == 10)
		{
			//Calculation
			//Calculation:
			//  x = 0
			FCV_X = 0;
			

		}


		//Delay
		//Delay: 10 ms
		delay_ms(10);


	}


	mainendloop: goto mainendloop;
}

void interrupt(void)
{
}



