/******************** (C) COPYRIGHT 2017 SONiX *******************************
* COMPANY:		SONiX
* DATE:				2017/07
* AUTHOR:			SA1
* IC:					SN32F240B
*____________________________________________________________________________
*	REVISION	Date				User		Description
*	1.0				2017/07/07	SA1			1. First version released
*																2. Compatible to CMSIS DFP Architecture in Keil MDK v5.X (http://www.keil.com/dd2/pack/)
*																3. Run HexConvert to generate bin file and show checksum after building.
*
*____________________________________________________________________________
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS TIME TO MARKET.
* SONiX SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL 
* DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF SUCH SOFTWARE
* AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN 
* IN CONNECTION WITH THEIR PRODUCTS.
*****************************************************************************/

/*_____ I N C L U D E S ____________________________________________________*/
#include <SN32F240B.h>
#include <SN32F200_Def.h>
#include ".\Interface\I2C\I2C.h"
#include ".\Interface\SysTick\SysTick.h"
#include ".\Utility\Utility.h"


/*_____ D E C L A R A T I O N S ____________________________________________*/

extern uint8_t	EEPROM_ADR_H, EEPROM_ADR_L;
extern uint8_t	EEPROM_WR;				// 0 : write
																	// 1 : read																
extern	uint8_t Busy;
extern uint8_t bI2C_TxFIFO_cnts; 
extern uint8_t bI2C_TxFIFO[I2C_TX_FIFO_LENGTH];
extern uint8_t bI2C_RxFIFO[I2C_RX_FIFO_LENGTH];

void I2C_TestFun(void); 


/*_____ D E F I N I T I O N S ______________________________________________*/


/*_____ M A C R O S ________________________________________________________*/


/*_____ F U N C T I O N S __________________________________________________*/

/*****************************************************************************
* Function		: main
* Description	: Demo code of I2C W/R EEPROM
* Input			: None
* Output		: None
* Return		: None
* Note			: Connect I2C0 and EEPROM
*****************************************************************************/
int	main (void)
{
	uint8_t i = 0;

	//User can configure System Clock with Configuration Wizard in system_SN32F240B.c
	SystemInit();
	SystemCoreClockUpdate();				//Must call for SN32F240B, Please do NOT remove!!!
	
	//Note: User can refer to ClockSwitch sample code to switch various HCLK if needed.
	
	//--------------------------------------------------------------------------
	//User Code starts HERE!!!

	SN_GPIO2->MODE = 0x0F;	
	SN_GPIO2->DATA = 0;

	for(i=0; i<32; i++)
	{
		bI2C_TxFIFO[i] = (i * 2) + 1;
	}
	
	//System Interface Init
	SysTick_Init();					//init SysTick
	I2C_Init();							//init I2C0 	
	
	while(1){
	
	#if (EEPROM_less_than_32K == 0)						
		if(I2C_Write(0x00, 32))								//page write, data word address = 0x00 and write 32 bytes data to EEPROM 					 
	#else	
		if(I2C_Write(0x00, 8))								//page write, data word address = 0x00 and write 8 bytes data to EEPROM 
	#endif
		{
			UT_DelayNms (5);

			#if (EEPROM_less_than_32K == 0)
				if(I2C_Read(0x00, 32))							//read 32 bytes data from EEPROM  	
			#else
				if(I2C_Read(0x00, 8))								//read 8 bytes data from EEPROM 			 
			#endif
				{																					
					#if (EEPROM_less_than_32K == 0)
						for(i=0; i<32; i++)
					#else
						for(i=0; i<8; i++)
					#endif
						{
							if(bI2C_RxFIFO[i] != bI2C_TxFIFO[i])	 
							{	
								while(1)													 //data incorrect
								{	
									SN_GPIO2->BSET_b.BSET0 = 1;
										
									UT_DelayNms(50);		
							
									SN_GPIO2->BCLR_b.BCLR0 = 1;
							
									UT_DelayNms(50);					
								}	
							}	
						}
						while(1)																 //data correct
						{	
							SN_GPIO2->BSET_b.BSET1 = 1;
							
							UT_DelayNms(50);

							
							SN_GPIO2->BCLR_b.BCLR1 = 1;
							
							UT_DelayNms(50);		

						}
				}
				else
				{
					while(1)																 //read process error
					{	
						SN_GPIO2->BSET_b.BSET3 = 1;
						
						UT_DelayNms(50);		
						
						SN_GPIO2->BCLR_b.BCLR3 = 1;
						
						UT_DelayNms(50);		
					}
				}
			}	
			else
			{
				while(1)																 	 //write process error
				{	
					SN_GPIO2->BSET_b.BSET2 = 1;
					
					UT_DelayNms(50);	
					
					SN_GPIO2->BCLR_b.BCLR2 = 1;
					
					UT_DelayNms(50);	
				}		
			}	
	}	
}

/*****************************************************************************
* Function		: HardFault_Handler
* Description	: ISR of Hard fault interrupt
* Input			: None
* Output		: None
* Return		: None
* Note			: None
*****************************************************************************/
__irq void HardFault_Handler(void)
{
	NVIC_SystemReset();
}

