#define SCL_H gpio_set(PORTE,5,1) //库函数
#define SCL_L gpio_set(PORTE,5,0)
#define SDA_H gpio_set(PORTE,0,1)
#define SDA_L gpio_set(PORTE,0,0)
#define SCL_read gpio_get(PORTE,5)
#define SDA_read gpio_get(PORTE,0)
void I2C_delay(void)
{
u8 z= 35; //这里可以优化速度 ,经测试最低到5还能写入,示波器测 约为7.5US
while(z)
{
z--;
}
}
/*********************************************************************
描 述: 产生IIC起始信号
返回值 :
其它说明:
*********************************************************************/
void I2C_Start(void)
{
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
SDA_L;
I2C_delay();
}
/*********************************************************************
描 述: 产生IIC停止信号
返回值 :
其它说明:
*********************************************************************/
void I2C_Stop(void)
{
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();
}
/*********************************************************************
描 述: 产生ACK应答
返回值 :
其它说明:
*********************************************************************/
void I2C_Ack(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
// I2C_delay();
// I2C_delay();
SCL_L;
I2C_delay();
}
/*********************************************************************
描 述: 不产生ACK应答
返回值 :
其它说明:
*********************************************************************/
void I2C_NoAck(void)
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
// I2C_delay();
// I2C_delay();
SCL_L;
I2C_delay();
}
/*********************************************************************
描 述: 等待应答信号到来
返回值 : 1,有ACK
0,无ACK
其它说明:
*********************************************************************/
void I2C_WaitAck(void)
{
u16 i=0;
SCL_H;
I2C_delay();
gpio_init(PORTE,0,GPI,0);//设为输入
while((SDA_read==1)&&(i<255))
{
i++;
}
SCL_L;
gpio_init(PORTE,0,GPO,1); //设为输出
I2C_delay();
}
/*********************************************************************
描 述: I2C发送一位数据的驱动函数
参数 : 待发送的数据
其它说明: 数据从高位到低位
*********************************************************************/
void I2C_SendByte(u8 SendByte)
{
u8 i=8;
while(i--)
{
SCL_L;
I2C_delay();
if(SendByte&0x80)
SDA_H;
else
SDA_L;
SendByte<<=1;
I2C_delay();
SCL_H;
I2C_delay();
}
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
}
/*********************************************************************
描 述: I2C接收一位数据的驱动函数
返回值 : 接收到的数据
其它说明: 数据从高位到低位
*********************************************************************/
u8 I2C_ReceiveByte(void)
{
u8 i=8;
u8 ReceiveByte=0;
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
gpio_init(PORTE,0,GPI,0);
while(i--)
{
ReceiveByte<<=1;
SCL_L;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
ReceiveByte|=0x01;
}
}
SCL_L;
gpio_init(PORTE,0,GPO,1);
return ReceiveByte;
}
u8 I2C_ReadOneByte(u16 ReadAddress)
{
u8 temp ;
u8 adrl=ReadAddress%256; //低8位地址
u8 adrh=ReadAddress/256; //高8位地址
I2C_Start();
I2C_SendByte(0xa0); //发送写命令
I2C_WaitAck();
I2C_SendByte(adrh);//发送高地址
I2C_WaitAck();
I2C_SendByte(adrl); //设置低起始地址
I2C_WaitAck();
I2C_Start();
I2C_SendByte(0xa1);
I2C_WaitAck();
temp=I2C_ReceiveByte();
I2C_NoAck();
I2C_Stop();
return temp;
}
void I2C_WriteOneByte(u16 WriteAddress, u8 DataToWrite)
{
u8 adrl=WriteAddress%256; //低8位地址
u8 adrh=WriteAddress/256; //高8位地址
I2C_Start();
I2C_SendByte(0xa0); //发送写命令
I2C_WaitAck();
I2C_SendByte(adrh);//发送高地址
I2C_WaitAck();
I2C_SendByte(adrl); //设置低起始地址
I2C_WaitAck();
I2C_SendByte(DataToWrite);
I2C_WaitAck();
I2C_Stop();
}
|