
#define EEPROM_I2C_ADDR 		0xA0
#define I2C_SELECTED			I2C1



void I2C_Configuration(void)
{
    I2C_InitTypeDef  I2C_InitStructure;
    GPIO_InitTypeDef  GPIO_InitStructure;

    /* I2C Periph clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

    /* GPIO Periph clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

    // /* GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE); */

    /* Configure I2C_EE pins: SCL and SDA */
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    I2C_DeInit(I2C1);
    /* I2C configuration */
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddress1 = 0x01;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = 200000;

    /* Apply I2C configuration after enabling it */
    I2C_Init(I2C1, &I2C_InitStructure);

    /* I2C Peripheral Enable */
    I2C_Cmd(I2C1, ENABLE);
}


/***************************************************************************
 *
 *   @brief
 *
 ***************************************************************************/
int
eeprom_wait_for_ready (void) {

	unsigned char SR1_Reg;

	while(1)
    {
		// Send START condition
		I2C_GenerateSTART(I2C_SELECTED, ENABLE);

		// Test on EV5 and clear it
		while(!I2C_CheckEvent(I2C_SELECTED, I2C_EVENT_MASTER_MODE_SELECT));
		// Sent slave address for write
		I2C_Send7bitAddress(I2C_SELECTED, EEPROM_I2C_ADDR, I2C_Direction_Transmitter);

		SR1_Reg = I2C_SELECTED->SR1;

		if ((SR1_Reg & (I2C_SR1_ADDR | I2C_SR1_AF)) != 0)
		{
		  // Clear ADDR Flag by reading SR1 then SR2 registers (SR1 have already been read)
		  (void)I2C_SELECTED->SR2;

		  // STOP condition
		  I2C_GenerateSTOP(I2C_SELECTED, ENABLE);

		  // Exit the function
		  return 1;
		}
		else
		{
		  // Clear AF flag
		  I2C_ClearFlag(I2C_SELECTED, I2C_FLAG_AF);
		}
    }

	/*
	 Delay(1); */
	return 0;
}



int eeprom_write_byte(unsigned int iAddress, char cByte, char cContinued) {

	while(I2C_GetFlagStatus(I2C_SELECTED, I2C_FLAG_BUSY));

	//eeprom_wait_for_ready();

    /* Send STRAT condition */
    I2C_GenerateSTART(I2C_SELECTED, ENABLE);

    /* Test on EV5 and clear it */
    while(!I2C_CheckEvent(I2C_SELECTED, I2C_EVENT_MASTER_MODE_SELECT));

    /* Send Slave address for write */
    I2C_Send7bitAddress(I2C_SELECTED, EEPROM_I2C_ADDR, I2C_Direction_Transmitter);

    /* Test on EV6 and clear it */
    while(!I2C_CheckEvent(I2C_SELECTED, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    // Sent Address MSByte
    I2C_SendData(I2C_SELECTED, (uint8_t)((iAddress & 0xFF00) >> 8));
    while(!I2C_CheckEvent(I2C_SELECTED, I2C_EVENT_MASTER_BYTE_TRANSMITTED));


    // Sent Address LSByte
    I2C_SendData(I2C_SELECTED, (uint8_t)(iAddress & 0x00FF));
    while(!I2C_CheckEvent(I2C_SELECTED, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

    // Sent Data Byte
    I2C_SendData(I2C_SELECTED, cByte);
    while(!I2C_CheckEvent(I2C_SELECTED, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

    // Close Communication
    I2C_GenerateSTOP(I2C_SELECTED, ENABLE);

}

char eeprom_read_byte (unsigned int iAddress) {

		char DataByte = 0;

		while(I2C_GetFlagStatus(I2C_SELECTED, I2C_FLAG_BUSY));

		eeprom_wait_for_ready();

		/* While the bus is busy */
		while(I2C_GetFlagStatus(I2C_SELECTED, I2C_FLAG_BUSY));

		/* Send START condition */
		I2C_GenerateSTART(I2C_SELECTED, ENABLE);
		/* Test on EV5 and clear it */
		while(!I2C_CheckEvent(I2C_SELECTED, I2C_EVENT_MASTER_MODE_SELECT));
		
		/* Send RTC address for write */
		I2C_Send7bitAddress(I2C_SELECTED, EEPROM_I2C_ADDR, I2C_Direction_Transmitter);
		/* Test on EV6 and clear it */
		while(!I2C_CheckEvent(I2C_SELECTED, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

		/* Send the internal address pointer to the required register */
		I2C_SendData(I2C_SELECTED, (uint8_t)((iAddress & 0xFF00) >> 8));
		/* Test on EV8 and clear it */
		while(!I2C_CheckEvent(I2C_SELECTED, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

		/* Send the internal address pointer to the required register */
		I2C_SendData(I2C_SELECTED, (uint8_t)(iAddress & 0x00FF));
		/* Test on EV8 and clear it */
		while(!I2C_CheckEvent(I2C_SELECTED, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

		/* Repeat STRAT condition */
		I2C_GenerateSTART(I2C_SELECTED, ENABLE);
		/* Test on EV5 and clear it */
		while(!I2C_CheckEvent(I2C_SELECTED, I2C_EVENT_MASTER_MODE_SELECT));

		/* Send IC address for read */
		I2C_Send7bitAddress(I2C_SELECTED, EEPROM_I2C_ADDR, I2C_Direction_Receiver);
		/* Test on EV6 and clear it */
		while(!I2C_CheckEvent(I2C_SELECTED, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

		I2C_AcknowledgeConfig(I2C_SELECTED, DISABLE);
		
		while(!I2C_CheckEvent(I2C_SELECTED, I2C_EVENT_MASTER_BYTE_RECEIVED));
		DataByte = I2C_ReceiveData(I2C_SELECTED);

		/* Send STOP condition */
		I2C_GenerateSTOP(I2C_SELECTED, ENABLE);
		
		I2C_AcknowledgeConfig(I2C_SELECTED, ENABLE);

	return DataByte;
}


int main(void)
{
    I2C_Configuration();

    printf("\r\nI2C Test");
	eeprom_write_byte(116, 0xBC, 0);
	Testbyte = eeprom_read_byte (116);
	printf("\r\nI2C End of Test %X", Testbyte);

    /* Infinite loop */
    while (1)
    {
     
    }

  return 0;
}
