/*
 * TITLE		: 	ADS8361 INTERFACING WITH AT91SAM7S256
 * AUTHOR		:	BALAJI VENKATACHALAM
 * DATE			:	2ND OCTOBER 2008
 * FILENAME		:	main.c
 * DESCRIPTION	:	Program to interface ADS8361 to AT91SAM7S256
 * Pin Assignments are as follows:
 * 					SPI CS		-		PA11
 * 					SPI MISO	-		PA12
 * 					SPI MOSI	-		PA13
 * 					SPI SPCK	-		PA14
 * 
 * 					Convst/Rd 	- 		PA17
 * 					M0			-		PA18
 * 					M1			-		PA19
 * 					A0			-		PA20
 * 
 * In this program, all the other channels, except A0th Channel are given 0V and A0th channel
 * is given a Voltage which is < 2.5 V.
 * Only A0th channel values are displayed on the Hyperterminal, neglecting all other values.
 * Here the ADS8361 is operated in Mode 4. 
 * To be done: After each and every channel, the chip select is pulled high and low. It should be
 * for all the four channels, the chip select should go low and high only once.
 * !!!!Sorry for my poor english!!!!
 * */


#include "Board.h"
#include "serial.h"
#include "rprintf.h"
#include "global.h"
#include "spi.h"
//#define delay_ms_time MCKKHz
#define ADS8361_CONVST	(1<<17)
#define ADS8361_A0		(1<<18)
#define ADS8361_M0		(1<<19)
#define ADS8361_M1		(1<<20)
static void delay_ms(u32 delay_data);
void uartDisplay(u32 x);
int main(void)
{
	u32 AdcOutput=0;
	// ENABLE THE CLOCK FOR PIO AND UART0
	AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, ( 1 << AT91C_ID_PIOA ) | ( 1 << AT91C_ID_US0 ) ) ;
	//ENABLE THE RESET PIN
	AT91F_RSTSetMode( AT91C_BASE_RSTC , AT91C_RSTC_URSTEN );
	
	
	//INITIALIZE UART0		
	uart0_init();
	//SAY "UART INIT" IN SERIAL TERMINAL
	uart0_puts("UART INIT\r\n");
	//INITIALIZE SPI
	spiInit();
	//SAY "SPI INIT" IN SERIAL TERMINAL
	uart0_puts("SPI INIT\r\n");
	AT91F_PIO_CfgOutput( AT91C_BASE_PIOA,ADS8361_CONVST) ;
	AT91F_PIO_CfgOutput( AT91C_BASE_PIOA,ADS8361_A0) ;
	AT91F_PIO_CfgOutput( AT91C_BASE_PIOA,ADS8361_M0) ;
	AT91F_PIO_CfgOutput( AT91C_BASE_PIOA,ADS8361_M1) ;
	
	//DO THE FOLLOWING FOR EVER
	for (;;)
	{
		AT91F_PIO_SetOutput( AT91C_BASE_PIOA,ADS8361_CONVST);	//PULL UP THE CONVST/RD PIN
		delay_ms(1);
		AT91F_PIO_SetOutput( AT91C_BASE_PIOA,ADS8361_M0);		//PULL UP THE M0 PIN
		AT91F_PIO_SetOutput( AT91C_BASE_PIOA,ADS8361_M1);		//PULL UP THE M1 PIN
		AT91F_PIO_SetOutput( AT91C_BASE_PIOA,ADS8361_A0);		//PULL UP THE A0 PIN
		delay_ms(1);
		AT91F_PIO_ClearOutput( AT91C_BASE_PIOA,ADS8361_A0);		//PULL DOWN THE A0 PIN
		delay_ms(1);
		AdcOutput = spiTransferWordByte(0xAAAA,0xAA);			//TRANSFER 24 CLOCK CYCLES AND STORE THE OUTPUT IN AdcOutput
		delay_ms(1);
		AT91F_PIO_ClearOutput( AT91C_BASE_PIOA,ADS8361_CONVST);	//PULL DOWN THE A0 PIN
		AT91F_PIO_ClearOutput( AT91C_BASE_PIOA,ADS8361_M0);		//PULL DOWN THE A0 PIN
		AT91F_PIO_ClearOutput( AT91C_BASE_PIOA,ADS8361_M1);		//PULL DOWN THE A0 PIN
		uartDisplay(AdcOutput);
		delay_ms(1);
		
	}
	return 0;
}
static void delay_ms(u32 delay_data)
{
	volatile unsigned int delay_time ;
	for(delay_time = 0; delay_time < (u32)((delay_data*MCKKHz)/15); delay_time++) ;
}


void uartDisplay(u32 x)
{
	u08 a = 0,b = 0,c = 0,d = 0;
	a = (x & 0xFF);						//0 - 7 bits
	b = ((x>>8)&0xFF);					//8 - 15 bits
	c = ((x>>16)&0xFF);					//16 - 23 bits
	d = ((x>>24)&0xFF);					//24 - 31 bits

	if(((((c/64)%2)+0x30)=='0')&&((((c/32)%2)+0x30)=='1'))		//NEGLECT THE 1ST CHANNEL OUTPUT
	{
		uart0_putc('1');										// JUST PRINT 1 IF U GET 01 IN THE SERIAL TERMINAL
		uart0_putc(',');										//PRINT A ',' JUST TO STORE THE FILE IN .CSV FORMAT
	}
	else if(((((c/64)%2)+0x30)=='1')&&((((c/32)%2)+0x30)=='0'))	//NEGLECT THE 1ST CHANNEL OUTPUT
	{
		uart0_putc('2');										// JUST PRINT 1 IF U GET 01 IN THE SERIAL TERMINAL
		uart0_putc(',');										//PRINT A ',' JUST TO STORE THE FILE IN .CSV FORMAT
	}
	else if(((((c/64)%2)+0x30)=='1')&&((((c/32)%2)+0x30)=='1'))	//NEGLECT THE 1ST CHANNEL OUTPUT
	{
		uart0_putc('3');										// JUST PRINT 1 IF U GET 01 IN THE SERIAL TERMINAL
		uart0_putc(',');										//PRINT A ',' JUST TO STORE THE FILE IN .CSV FORMAT
	}
	else if(((((c/64)%2)+0x30)=='0')&&((((c/32)%2)+0x30)=='0'))	//OUR REQUIRED DATA IS HERE
	{
		uart0_putc(((c/16)%2)+0x30);							//MSB
		uart0_putc(((c/8)%2)+0x30);
		uart0_putc(((c/4)%2)+0x30);
		uart0_putc(((c/2)%2)+0x30);
		uart0_putc(((c/1)%2)+0x30);
		
		uart0_putc(((b/128)%2)+0x30);
		uart0_putc(((b/64)%2)+0x30);
		uart0_putc(((b/32)%2)+0x30);
		uart0_putc(((b/16)%2)+0x30);
		uart0_putc(((b/8)%2)+0x30);
		uart0_putc(((b/4)%2)+0x30);
		uart0_putc(((b/2)%2)+0x30);
		uart0_putc(((b/1)%2)+0x30);								//LSB
		uart0_putc(',');
		
		uart0_putc('\r');										//PRINT A NEW LINE
		uart0_putc('\n');
	}	
}


