/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
* File Name : i2c_ee.c
* Author : MCD Application Team
* Date First Issued : 05/21/2007
* Description : This file provides a set of functions needed to manage the
* communication between I2C peripheral and I2C M24C08 EEPROM.
********************************************************************************
* History:
* 01/03/2013: V0.3 jumshine
*******************************************************************************
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS 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.
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "i2c_ee.h"
#include "Usart.h"
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
#define I2C_DEBUG
#define SCL_PIN GPIO_Pin_6
#define SDA_PIN GPIO_Pin_7
#define I2C1_PORT GPIOB
#define SET_I2C_CLK_HIGH GPIO_WriteBit(I2C1_PORT,SCL_PIN,Bit_SET)
#define SET_I2C_CLK_LOW GPIO_WriteBit(I2C1_PORT,SCL_PIN,Bit_RESET)
#define SET_I2C_DATA_HIGH GPIO_WriteBit(I2C1_PORT,SDA_PIN,Bit_SET)
#define SET_I2C_DATA_LOW GPIO_WriteBit(I2C1_PORT,SDA_PIN,Bit_RESET)
#define GET_I2C_DATA_BIT GPIO_ReadInputDataBit(I2C1_PORT, SDA_PIN)
#define GET_I2C_SCL_BIT GPIO_ReadInputDataBit(I2C1_PORT, SCL_PIN)
u16 EEPROM_ADDRESS;
u16 EEPROM_BlockNumber=BlockNumber;
u32 EEPROM_MemorySize=MemorySize;
u16 EEPROM_SUB_ADDRESS=SUB_ADDRESS;
#define Device_Read 0x01
#define Delay5us 2
#define Delay10us 5
#define Delay20us 10
static void I2C_delay(unsigned int us)
{
uint8 i2d;
while(us--)
for(i2d=0;i2d<10;i2d++);
}
extern int GetSysTick();
extern int SYS_Tick;
static void Delay_IIC(int ms);
static void Delay_IIC(int ms)
{
int a;
SYS_Tick=0;
for(a=0;a<ms;)
{
a=GetSysTick();
}
}
void SET_I2C_DATA_INPUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure I2C1 pins: SCL and SDA */
GPIO_InitStructure.GPIO_Pin = SDA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SET_I2C_DATA_OUTPUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure I2C1 pins: SCL and SDA */
GPIO_InitStructure.GPIO_Pin = SDA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SET_I2C_CLK_Input(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure I2C1 pins: SCL and SDA */
GPIO_InitStructure.GPIO_Pin = SCL_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SET_I2C_CLK_OUTPUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure I2C1 pins: SCL and SDA */
GPIO_InitStructure.GPIO_Pin = SCL_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void I2C_Start(void)
{
SET_I2C_CLK_OUTPUT(); //Set I2C CLK pin as output
SET_I2C_DATA_OUTPUT(); //Set I2C DATA pin as output
SET_I2C_DATA_HIGH; //I2C DATA pin output high(1)
SET_I2C_CLK_HIGH; //I2C CLK pin output high(1)
I2C_delay(Delay20us); //Delay 20uS
SET_I2C_DATA_LOW; //I2C DATA pin output low(0)
I2C_delay(Delay10us); //Delay 10uS
SET_I2C_CLK_LOW; //I2C CLK pin output low(0)
I2C_delay(Delay10us); //Delay 10uS
}
void IIC_Stop (void)
{ //I2C Stop signal generation: Data pin rises up when clock in is high
I2C_delay(Delay20us); //Delay 10uS
SET_I2C_CLK_HIGH; //I2C CLK pin output high(1)
I2C_delay(Delay20us); //Delay 10uS
SET_I2C_DATA_HIGH; //I2C DATA pin output high(1)
}
void IIC_RepeatedStart(void)
{ //I2C Repeat Start signal generation: Data pin falls down when clock is high
I2C_delay(Delay20us); //Delay 20uS
I2C_delay(Delay20us); //Delay 20uS
SET_I2C_DATA_HIGH; //I2C DATA pin output high(1)
I2C_delay(Delay10us); //Delay 10uS
SET_I2C_CLK_HIGH; //I2C CLK pin output high(1)
I2C_delay(Delay20us); //Delay 20uS
I2C_delay(Delay20us); //Delay 20uS
SET_I2C_DATA_LOW; //I2C DATA pin output low(0)
I2C_delay(Delay10us); //Delay 10uS
SET_I2C_CLK_LOW; //I2C CLK pin output low(0)
I2C_delay(Delay10us); //Delay 10uS
}
void IIC_OneClk(void)
{ //I2C CLK pin output one clock: CLK pin rises up before falls down
I2C_delay(Delay10us);
SET_I2C_CLK_HIGH; //I2C CLK pin output high(1)
I2C_delay(Delay10us); //Delay 10uS
SET_I2C_CLK_LOW; //I2C CLK pin output low(0)
I2C_delay(Delay10us);
}
void IIC_SendByte(uint8 sData)
{ //I2C send one byte out
uint8 i;
for (i=0; i<8; i++)//Loop 8 times to send 8 bits
{
if (sData&0x80) //Judge output 1 or 0
SET_I2C_DATA_HIGH; //I2C DATA pin output high(1) if output 1
else
SET_I2C_DATA_LOW; //I2C DATA pin output low(0) if output 0
sData=sData<<1;
IIC_OneClk(); //Output one clock pulse after data pin is ready
}
}
uint8 IIC_ChkAck(void)
{ //Check I2C Acknowledgement signal
SET_I2C_DATA_INPUT(); //Set I2C DATA pin as input
I2C_delay(Delay20us); //Delay 5uS
SET_I2C_CLK_HIGH; //I2C CLK pin output high(1)
I2C_delay(Delay10us); //Delay 5uS again
if (GET_I2C_DATA_BIT)
{ //Read I2C DATA pin
I2C_delay(Delay5us); //Delay 5uS
SET_I2C_CLK_LOW; //I2C CLK pin output low(0)
I2C_delay(Delay5us); //Delay 5us again
SET_I2C_DATA_OUTPUT(); //Set I2C DATA pin as output
SET_I2C_DATA_LOW; //I2C DATA pin output low(0)
return 1; //Return 1 if read 1 from I2C DATA pin
}
else
{ //If I2C DATA pin is invalid for acknowledgement signal
I2C_delay(Delay10us); //Delay 5uS
SET_I2C_CLK_LOW; //I2C CLK pin output low(0)
I2C_delay(Delay10us); //Delay 5uS again
SET_I2C_DATA_OUTPUT(); //Set I2C DATA pin as output
SET_I2C_DATA_LOW; //I2C DATA pin output low(0)
return 0; //Return 0 if read 0 from I2C DATA pin
}
}
uint8 IIC_ReadByteACK(void)
{ //Read one byte and send an acknowledgement signal
uint8 i;
uint8 data;
SET_I2C_DATA_INPUT(); //Set I2C DATA pin as input
I2C_delay(Delay10us); //Delay 5uS
data = 0; //Prepare to receive data
for (i=0; i<8 ;i++)
{
data=data<<1;
if (GET_I2C_DATA_BIT)
data |= 0x01; //If read a 1, set to data bit
else
data |= 0x00; //If read a 1, set to data bit
IIC_OneClk();
} //Output one clock pu