/******************************************************************//**
* @file		lpc_i2c_m24256.c
* @brief	Contains all functions support for I2C based E2PROM
*           M24256-BWMN6P library on LPC17xx
* @version	1.0
* @date		11. Dec. 2013
* @author	Dwijay.Edutech Learning Solutions
**********************************************************************/

/* Peripheral group ----------------------------------------------------------- */
/** @addtogroup EEPROM
 * @{
 */

/* Includes ------------------------------------------------------------------- */
#include "lpc_i2c_m24256.h"

/* If this source file built with example, the LPC17xx FW library configuration
 * file in each example directory ("lpc17xx_libcfg.h") must be included,
 * otherwise the default FW library configuration file must be included instead
 */



/** @addtogroup EEPROM_Public_Functions
 * @{
 */

/* Public Functions ----------------------------------------------------------- */

/*********************************************************************//**
 * @brief	    Writes byte at given address
 * @param[in]	eep_address    Word Address range[0000 - 4000]
 * @param[in]   byte_data      Byte value
 * @return 		status
 **********************************************************************/
char I2C_IEeprom_Write_Byte (uint16_t eep_address, uint8_t byte_data)
{
	/* Transmit setup */
	I2C_M_SETUP_Type txsetup;

	I2C_Tx_Buf[0] =(eep_address & 0x8FFF) >> 8;     // 1st byte extract
 //   printf(LPC_UART0,"%x02",set_addr);

    I2C_Tx_Buf[1] = (uchar)(eep_address & 0xFF);    // 2st byte extract
    I2C_Tx_Buf[2] = byte_data;

	txsetup.sl_addr7bit = E2PM24256_ID;
	txsetup.tx_data = I2C_Tx_Buf;
	txsetup.tx_length = 3;
	txsetup.rx_data = NULL;
	txsetup.rx_length = 0;
	txsetup.retransmissions_max = 50;

	/* write byte to addr  */
	if(I2C_MasterTransferData(LPC_I2C0, &txsetup, I2C_TRANSFER_POLLING)==SUCCESS) //return status
	{
		return (0);
	}
	else
	{
		return (-1);
	}
}


/*********************************************************************//**
 * @brief	    Writes byte at given address
 * @param[in]	eep_address    Word Address range[0000 - 4000]
 * @param[in]   byte_data      Byte value
 * @return 		status
 **********************************************************************/
char I2C_IEeprom_Write (uint16_t eep_address, uint8_t* byte_data, uint16_t length)
{
	/* Transmit setup */
	I2C_M_SETUP_Type txsetup;
	uint16_t ip_len,new_length,i;
	uint16_t new_address;

	/* Intern page length(ip_len) gives length from address that can be occupied in page */
	ip_len = 0x40 - (eep_address % 0x40);
	new_address = eep_address + ip_len;

	I2C_Tx_Buf[0] =(eep_address & 0x8FFF) >> 8;     // 1st byte extract
  //  printf(LPC_UART0,"%x02",I2C_Tx_Buf[0]);

    I2C_Tx_Buf[1] = (uchar)(eep_address & 0xFF);    // 2st byte extract

	if(length > ip_len)
	{
		new_length = length - ip_len;

		for(i=2;i<(ip_len+2);i++)
		{
			I2C_Tx_Buf[i]=*byte_data++;
		}
		txsetup.sl_addr7bit = E2PM24256_ID;
		txsetup.tx_data = I2C_Tx_Buf;
		txsetup.tx_length = ip_len+2;
		txsetup.rx_data = NULL;
		txsetup.rx_length = 0;
		txsetup.retransmissions_max = 50;

		if(I2C_MasterTransferData(LPC_I2C0, &txsetup, I2C_TRANSFER_POLLING)==ERROR) //return status
		{
			return (-1);
		}

		// Recursive function
		delay_ms(5);
		I2C_IEeprom_Write(new_address,byte_data,new_length);
	}

	if(length <= ip_len)
	{
		for(i=2;i<(length+2);i++)
		{
			I2C_Tx_Buf[i]=*byte_data++;
		}
		txsetup.sl_addr7bit = E2PM24256_ID;
		txsetup.tx_data = I2C_Tx_Buf;
		txsetup.tx_length = length+2;
		txsetup.rx_data = NULL;
		txsetup.rx_length = 0;
		txsetup.retransmissions_max = 50;

		if(I2C_MasterTransferData(LPC_I2C0, &txsetup, I2C_TRANSFER_POLLING)==SUCCESS) //return status
		{
			return (0);
		}
		else
		{
			return (-1);
		}
	}
}


/*********************************************************************//**
 * @brief	    Reads byte from given address
 * @param[in]	eep_address    Word Address range[0000 - 4000]
 * @return 		Byte value
 **********************************************************************/
uint8_t I2C_IEeprom_Read_Byte (uint16_t eep_address)
{
	/* Receive setup */
	I2C_M_SETUP_Type rxsetup;

	I2C_Tx_Buf[0] = (eep_address & 0x8FFF) >> 8;    // 1st byte extract
//    printf(LPC_UART0,"%x02",set_addr);
	I2C_Tx_Buf[1] = (uchar)(eep_address & 0xFF);    // 2st byte extract

	rxsetup.sl_addr7bit = E2PM24256_ID;
	rxsetup.tx_data = I2C_Tx_Buf;	// Get address to read at writing address
	rxsetup.tx_length = 2;
	rxsetup.rx_data = I2C_Rx_Buf;
	rxsetup.rx_length = 1;
	rxsetup.retransmissions_max = 3;

	if (I2C_MasterTransferData(LPC_I2C0, &rxsetup, I2C_TRANSFER_POLLING) == SUCCESS)
	{
		return (I2C_Rx_Buf[0]);
	}
	else
	{
		return (-1);
	}
}


/*********************************************************************//**
 * @brief	    Reads array from given address
 * @param[in]	eep_address    Word Address range[0000 - 4000]
 * @return 		Byte value
 **********************************************************************/
char I2C_IEeprom_Read (uint16_t eep_address, uint8_t* buf_data, uint16_t length)
{
	/* Receive setup */
	I2C_M_SETUP_Type rxsetup;

	I2C_Tx_Buf[0] = (eep_address & 0x8FFF) >> 8;
 //   printf(LPC_UART0,"%x02",set_addr);

	I2C_Tx_Buf[1] = (uchar)(eep_address & 0xFF);    // 2st byte extract

	rxsetup.sl_addr7bit = E2PM24256_ID;
	rxsetup.tx_data = I2C_Tx_Buf;	// Get address to read at writing address
	rxsetup.tx_length = 2;
	rxsetup.rx_data = buf_data;
	rxsetup.rx_length = length;
	rxsetup.retransmissions_max = 3;

	if (I2C_MasterTransferData(LPC_I2C0, &rxsetup, I2C_TRANSFER_POLLING) == SUCCESS)
	{
		return (0);
	}
	else
	{
		return (-1);
	}
}


/*********************************************************************//**
 * @brief	    Display Read data stored in array
 * @param[in]   *dest_addr     buffer address
 * @param[in]   length         size of buffer
 * @return 		None
 **********************************************************************/
void Display_IEeprom_Array (uint8_t *string, uint16_t length)
{
	while(length)
	{
		printf(LPC_UART0,"%x02  ",*string++);
		length--;
	}
}


/*********************************************************************//**
 * @brief	    Ask for Address Range you want to display
 * @param[in]   *dest_addr     buffer address
 * @param[in]   length         size of buffer
 * @return 		None
 **********************************************************************/
void Display_IEeprom_Loc (uint16_t mem_start_address, uint16_t mem_end_address)
{
	uint8_t line=0,count=0;
	uint8_t dat;
	uint16_t addr;

	printf(LPC_UART0,"EEPROM Range = 0x000 - 0x7FF \r\n");

	clr_scr_rst_cur(LPC_UART0);
	printf(LPC_UART0,"Start: %x03   End: %x03 \r\n",mem_start_address,mem_end_address);

	for(addr=mem_start_address; addr<mem_end_address+1; addr++)
	{
		if(count == 0) printf(LPC_UART0,"%x03   ",addr);

		dat = I2C_IEeprom_Read_Byte(addr);   // read byte from address

		printf(LPC_UART0,"%x02  ",dat);
		count++;

		if(count == 16)                    // check for last digit entered
		{
			line++;
			count = 0;
			printf(LPC_UART0,"\r\n");
		}

		if(line == 16 || addr == mem_end_address)
		{
			printf(LPC_UART0,"\x1b[24;01HPress any key to continue.");
			line = 0;
			getche(LPC_UART0);

			clr_scr_rst_cur(LPC_UART0);
		}
	}
}




/**
 * @}
 */

/* End of Public Functions ---------------------------------------------------- */

/**
 * @}
 */

/* --------------------------------- End Of File ------------------------------ */