/**************************************************************************//**
 * @file     wm_i2c_demo.c
 * @version  
 * @date 
 * @author    
 * @note
 * Copyright (c) 2014 Winner Microelectronics Co., Ltd. All rights reserved.
 *****************************************************************************/
#include "wm_include.h"
#include "wm_i2c.h"
#include <string.h>
#include "wm_gpio_afsel.h"

#if DEMO_I2C

#define I2C_FREQ		(200000)

/**
 * @brief	read one byte from the specified address of the eeprom
 * @param addr the eeprom address will be read from
 * @retval     the read data
 */
u8 AT24CXX_ReadOneByte(u16 addr)
{				  
	u8 temp=0;		  	    																 
	//printf("\nread addr=%x\n",ReadAddr);
	tls_i2c_write_byte(0xA0,1);   
	tls_i2c_wait_ack(); 
    	tls_i2c_write_byte(addr,0);   
	tls_i2c_wait_ack();	    

	tls_i2c_write_byte(0xA1,1);
	tls_i2c_wait_ack();	 
	temp=tls_i2c_read_byte(0,1);
	//printf("\nread byte=%x\n",temp);
	return temp;
}

/**
 * @brief	read multibytes from the specified address of the eeprom
 * @param[in] addr the eeprom address will be read from
 * @param[in] buf 	Pointer to data buffer
 * @param[in] len	amount of data to be read
 * @retval    null
 */
void AT24CXX_ReadLenByte(u16 addr,u8 *buf,u16 len)
{				  
	//printf("\nread len addr=%x\n",ReadAddr);
	tls_i2c_write_byte(0xA0,1);   
	tls_i2c_wait_ack(); 
    	tls_i2c_write_byte(addr,0);   
	tls_i2c_wait_ack();	    
	tls_i2c_write_byte(0xA1,1);
	tls_i2c_wait_ack();	
	while(len > 1)
	{
		*buf++ = tls_i2c_read_byte(1,0);
		//printf("\nread byte=%x\n",*(pBuffer - 1));
		len --;
	}
   	*buf = tls_i2c_read_byte(0,1);
}

/**
 * @brief	write one byte to the specified address of the eeprom
 * @param addr the eeprom address will be write to
 * @retval     null
 */
void AT24CXX_WriteOneByte(u16 addr, u8 data)
{				   	  	    																 
	tls_i2c_write_byte(0XA0, 1); 
	tls_i2c_wait_ack();	   
	tls_i2c_write_byte(addr, 0);
	tls_i2c_wait_ack(); 	 										  		   
	tls_i2c_write_byte(data, 0); 				   
	tls_i2c_wait_ack();  	   
 	tls_i2c_stop();
	tls_os_time_delay(1);
}

/**
 * @brief	check the eeprom is normal or not
 * @retval 
 *     0---success
 *     1---failed
 * @note 
 *	different 24Cxx chip will use the different addr
 */
u8 AT24CXX_Check(void)
{
	u8 temp;
	temp=AT24CXX_ReadOneByte(255);
	if (temp==0x55)return 0;		   
	else
	{
		AT24CXX_WriteOneByte(255, 0x55);
		tls_os_time_delay(1);
		temp=AT24CXX_ReadOneByte(255);	  
		if (temp==0x55)return 0;
	}

	return 1;											  
}


/**
 * @brief	read multibytes from the specified address of the eeprom
 * @param[in] addr the eeprom address will be read from
 * @param[in] buf 	Pointer to data buffer
 * @param[in] len	amount of data to be read
 * @retval    null
 */
void AT24CXX_Read(u16 addr, u8 *buf, u16 len)
{
	while(len)
	{
		*buf++=AT24CXX_ReadOneByte(addr++);	
		len--;
	}
}  

/**
 * @brief	write multibytes from the specified address of the eeprom
 * @param[in] addr the eeprom address will be read from
 * @param[in] buf 	Pointer to data buffer
 * @param[in] len	amount of data to be write
 * @retval    null
 */
void AT24CXX_Write(u16 addr, u8 *buf, u16 len)
{
	while(len--)
	{
		AT24CXX_WriteOneByte(addr,*buf);
		addr++;
		buf++;
	}
} 

int i2c_demo(char *buf)
{
	u8 testbuf[] = {"AT24CXX I2C TEST OK"};
	u8 datatmp[32];

    wm_i2c_scl_config(WM_IO_PA_01);
    wm_i2c_sda_config(WM_IO_PA_04);
    
	tls_i2c_init(I2C_FREQ);

	while(AT24CXX_Check())
	{
		printf("\nAT24CXX check faild\n");
	}
	tls_os_time_delay(1);
	printf("\nAT24CXX check success\n");

	AT24CXX_Write(0,(u8 *)testbuf,sizeof(testbuf));
	tls_os_time_delay(1);
	memset(datatmp,0,sizeof(datatmp));
	//AT24CXX_Read(0,datatmp,sizeof(testbuf));
	AT24CXX_ReadLenByte(0,(u8 *)datatmp,sizeof(testbuf));
	printf("\nread data is:%s\n",datatmp);
	
	return WM_SUCCESS;
}

#endif

/*** (C) COPYRIGHT 2014 Winner Microelectronics Co., Ltd. ***/
