//IIC.c
#include "jpheat.h"
#include "delay.h"
//4M晶振, pDelayNus(3)为6us
#define I2C_Delay() pDelayNus(15)
#define I2C_SCL PA3
#define I2C_SDA PA2
#define I2C_DDR DDRA
#define I2C_POTR PORTA
#define I2C_SCL_Reset() I2C_POTR&=~BIT(I2C_SCL)
#define I2C_SCL_Set() I2C_POTR|=BIT(I2C_SCL)
#define I2C_SDA_Reset() I2C_POTR&=~BIT(I2C_SDA)
#define I2C_SDA_Set() I2C_POTR|=BIT(I2C_SDA)
#define TRUE 1
#define FALSE 0
#define DELAY_nT 2
//***********************************************************************
// 函数名称:I2C_Start()
// 功 能:启动I2C总线
// 入口参数:无
// 出口参数:无//***********************************************************************
void I2C_init(void)
{
I2C_SDA_Set();
I2C_SCL_Set();
I2C_DDR|=BIT(I2C_SDA)|BIT(I2C_SCL);
pDelayNms(1);
}
void I2C_Start(void)
{
I2C_SDA_Set();
I2C_SCL_Set();
I2C_Delay(); // 大于4.7us
I2C_SDA_Reset();
I2C_Delay(); // 大于4us
}
//***********************************************************************
// 函数名称:I2C_Stop()
// 功 能:终止I2C总线
// 入口参数:无
// 出口参数:无
//***********************************************************************
void I2C_Stop(void)
{
I2C_SDA_Reset();
I2C_Delay();
I2C_SCL_Set();
I2C_Delay();
I2C_SDA_Set();
I2C_Delay();
}
//***********************************************************************
// 函数名称:I2C_Send_Bit_0()
// 功 能:发送比特0
// 入口参数:无
// 出口参数:无
//***********************************************************************
void I2C_Send_Bit_0(void)
{
I2C_SCL_Reset();
I2C_Delay();
I2C_SDA_Reset();
I2C_Delay();
I2C_SCL_Set();
I2C_Delay(); // 大于4us
I2C_SCL_Reset();
I2C_Delay();
}
//***********************************************************************
// 函数名称:I2C_Send_Bit_1()
// 功 能:发送比特1
// 入口参数:无
// 出口参数:无
//***********************************************************************
void I2C_Send_Bit_1(void)
{
I2C_SCL_Reset();
I2C_Delay();
I2C_SDA_Set();
I2C_Delay();
I2C_SCL_Set();
I2C_Delay(); //
I2C_SCL_Reset();
I2C_Delay(); //
}
//***********************************************************************
// 函数名称:I2C_Check_Ack()
// 功 能:发送完一个字节后检验设备的应答信号
// 入口参数:无
// 出口参数:返回值为True,成功
// 返回值为False,失败
//***********************************************************************
unsigned char I2C_Check_Ack(void)
{
unsigned char temp;
I2C_SCL_Reset();
I2C_Delay();
I2C_DDR&=~BIT(2);
I2C_Delay();
I2C_SCL_Set();
I2C_Delay();
if (PINA&BIT(2))
{temp = FALSE;}
else
{temp = TRUE;}
I2C_SCL_Reset();
I2C_Delay();
I2C_DDR|=BIT(2);
I2C_Delay();
return temp;
}
//***********************************************************************
// 函数名称:I2C_WriteByte()
// 功 能:向I2C总线写入8bit数据
// 入口参数:I2C_data 将要写入I2C总线的8bit数据
// 出口参数:无
//***********************************************************************
void I2C_WriteByte(unsigned char I2C_data)
{
unsigned char i;
unsigned char state;
for(i=0;i<8;i++)
{
I2C_SCL_Reset();
I2C_Delay();
if(I2C_data&0x80)
{
I2C_SDA_Set();
}
else
{
I2C_SDA_Reset();
}
I2C_data<<=1;
I2C_SCL_Set();
I2C_Delay();
}
state=I2C_Check_Ack();//等待应答
}
//***********************************************************************
// 函数名称:I2C_ReadByte()
// 功 能:从I2C总线接收1个字节
// 入口参数:无
// 出口参数:返回值为从I2C总线上接收到的8bit数据
//***********************************************************************
unsigned char I2C_ReadByte(void)
{
unsigned char i, I2C_data = 0;
I2C_SDA_Set();
I2C_DDR&=~BIT(2);
for (i=0;i<8;i++)
{
I2C_Delay();
I2C_SCL_Set();
I2C_Delay();
I2C_data <<= 1;
if (PINA&BIT(2))
{
I2C_data|= 0x01;
}
I2C_SCL_Reset();
}
I2C_DDR|=BIT(2);
return I2C_data;
}