#ifndef _IICAPPH_H_
#define _IICAPPH_H_
/*
********************************************************************************************************************
* 变量及函数的引用定义
********************************************************************************************************************
*/
#ifndef _IICAPP_GLOBAL_
#define IICAPP_GLOBAL extern
#else
#define IICAPP_GLOBAL
#endif
#define I2C_SCL_H (PORTD|= (0x01 << PD0))
#define I2C_SCL_L (PORTD&= ~(0x01 << PD0))
#define I2C_SDA_H (PORTD|= (0x01 << PD1))
#define I2C_SDA_L (PORTD&= ~(0x01 << PD1))
#define I2C_SDA_IN (DDRD &= ~(0x01 << DDD1))
#define I2C_SDA_OUT (DDRD |= (0x01 << DDD1))
#define I2C_SDA_Test (PIND & (0x01 << PIND1))
#define WrDevAddr 0xAE
#define RdDevAddr 0xAF
IICAPP_GLOBAL void write_I2C(uchar ContorAdd,uchar T_Data, uchar RomAddress);
IICAPP_GLOBAL uchar read_I2C(uchar ContorAdd,uchar RomAddress);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//I2C延时
void I2CDelay(uchar Ms)
{
uchar i,j;
for (i = 0; i<Ms; i++)
{
for (j = 0; j < 20; j++)
{
NOP();
}
}
}
/************************************************************************************
*函数介绍:启动IIC设备
*输入参数:无
*输出参数:无
*返回值 : 无
*************************************************************************************/
void Start(void)
{
I2CDelay(8);
I2C_SDA_H; // SDA = 1
I2CDelay(8);
I2C_SCL_H; // SCL = 1
I2CDelay(8);
I2C_SDA_L; // SDA = 0
I2CDelay(8);
I2C_SCL_L; // SCL = 0
I2CDelay(8);
}
/************************************************************************************
*函数介绍:停止IIC设备
*输入参数:无
*输出参数:无
*返回值 : 无
*************************************************************************************/
void Stop(void)
{
I2CDelay(8);
I2C_SCL_L; // SCL = 0
I2CDelay(8);
I2C_SDA_L; // SDA = 0
I2CDelay(8);
I2C_SCL_H; // SCL = 1
I2CDelay(8);
I2C_SDA_H; // SDA = 1
I2CDelay(70); // 等待EEPROM内部写完成
}
/************************************************************************************
*函数介绍:ACK信号
*输入参数:无
*输出参数:无
*返回值 : 无
*************************************************************************************/
void Ack(void)
{
I2CDelay(8);
I2C_SDA_L; // SDA = 0
I2CDelay(8);
I2C_SCL_H; // SCL = 1
I2CDelay(8);
I2C_SCL_L; // SCL = 0
I2CDelay(8);
I2C_SDA_H; // SDA = 1
I2CDelay(8);
}
/************************************************************************************
*函数介绍:握手
*输入参数:无
*输出参数:无
*返回值 : 无
*************************************************************************************/
void NoAck(void)
{
I2CDelay(8);
I2C_SDA_H; // SDA = 1
I2CDelay(8);
I2C_SCL_H; // SCL = 1
I2CDelay(8);
I2C_SCL_L; // SCL = 0
I2CDelay(8);
}
/************************************************************************************
*函数介绍:测试ack
*输入参数:无
*输出参数:无
*返回值 : 无
*************************************************************************************/
uchar TestAck(void)
{
uchar AckFlag;
I2CDelay(20);
I2C_SDA_H; // SDA = 1
I2CDelay(20);
I2C_SCL_H; // SCL = 1
I2C_SDA_IN; // SDA Input
I2CDelay(20);
if(I2C_SDA_Test)
{
AckFlag = 1;
}
//AckFlag = PIND & (0x01 << PIND1);
I2C_SCL_L; // SCL = 0
I2CDelay(20);
I2C_SDA_OUT; // SDA Output
return(AckFlag);
}
/************************************************************************************
*函数介绍:写1个字节的数据
*输入参数:待写的数据
*输出参数:无
*返回值 : 无
*************************************************************************************/
void Write8bit(uchar T_Data)
{
unsigned char i ;
for(i = 8; i != 0; i--)
{
if (T_Data & 0x80)
I2C_SDA_H; // SDA = 1
else
I2C_SDA_L; // SDA = 0
I2CDelay(8);
I2C_SCL_H; // SCL = 1
I2CDelay(8);
I2C_SCL_L; // SCL = 0
I2CDelay(8);
T_Data = T_Data << 1 ;
I2CDelay(2);
}
}
/************************************************************************************
*函数介绍:读1个字节的数据
*输入参数:无
*输出参数:无
*返回值 : 无
*************************************************************************************/
uchar Read8bit(void)
{
uchar i = 0 ;
uchar R_Data = 0x00 ;
I2C_SDA_IN; // SDA Input
for(i = 8; i != 0; i--)
{
I2C_SDA_H; // SDA = 1
I2CDelay(8);
I2C_SCL_L; // SCL = 0
I2CDelay(8);
I2C_SCL_H; // SCL = 1
R_Data = R_Data << 1 ;
if (I2C_SDA_Test)
R_Data |= 0x01;
I2CDelay(8);
}
I2C_SDA_OUT; // SDA Output
return(R_Data);
}
/************************************************************************************
*函数介绍:写1个字节的数据到指定的地址
*输入参数:器件地址,待写的数据、指定的地址
*输出参数:无
*返回值 : 无
*************************************************************************************/
void write_I2C(uchar ContorAdd, uchar T_Data, uchar RomAddress)
{
Start();
Write8bit(ContorAdd);
TestAck();
Write8bit(RomAddress);
TestAck();
Write8bit(T_Data);
TestAck();
Stop();
}
/************************************************************************************
*函数介绍:从指定的地址读1个字节的数据
*输入参数:器件写地址,指定的地址.器件读地址=器件写地址+1;
*输出参数:无
*返回值 : 无
*************************************************************************************/
uchar read_I2C(uchar ContorAdd, uchar RomAddress)
{
uchar R_Data = 0x00 ;
Start() ;
Write8bit(ContorAdd);
TestAck();
Write8bit(RomAddress);
TestAck();
Start();
Write8bit(ContorAdd+1);
TestAck() ;
R_Data = Read8bit();
NoAck();
Stop();
return(R_Data);
}
文章评论(0条评论)
登录后参与讨论