📄 at24c02.c
字号:
/*
作者:刘文广
日期:2007-9-30
说明:AT24C02驱动程序
*/
#ifndef _I2C24C02_C_
#define _I2C24C02_C_
/********************************************************************************************
* 函数名称:I2C_Start()
* 功 能:启动I2C总线
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void I2C_Start(void)
{
SDA=1;
NOP;
SCL=1;
NOP;
NOP;
NOP;
SDA=0;
NOP;
NOP;
NOP;
SCL=0;
NOP;
}
/********************************************************************************************
* 函数名称:I2C_Stop()
* 功 能:终止I2C总线
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void I2C_Stop(void)
{
SDA=0;
NOP;
SCL=1;
NOP;
NOP;
NOP;
SDA=1;
NOP;
NOP;
NOP;
}
/********************************************************************************************
* 函数名称:I2C_Check_Ack()
* 功 能:发送完一个字节后检验设备的应答信号
* 入口参数:无
* 出口参数:返回值为True,成功
* 返回值为False,失败
*********************************************************************************************/
bit I2C_Check_Ack(void)
{
SDA=1;
NOP;
SCL=1;
NOP;
NOP;
F0=SDA;
SCL=0;
if(F0==1) return FALSE;
return TRUE;
}
/***********************************************
函数名字:Ack()
功 能:mcu对器件进行连续读操作时,回应器件。
入口参数:无
出口参数:无
**********************************************/
void Ack(void)
{
SDA=0; //数据线保持低,时钟线上升沿
NOP;
SCL=1;
NOP;
SCL=0;
NOP;
SDA=1;
}
//非应答
void NoAck()
{
SDA=1;
NOP;
NOP;
SCL=1;
NOP;
NOP;
SCL=0;
}
/********************************************************************************************
* 函数名称:I2C_Write8Bit()
* 功 能:向I2C总线写入8bit数据
* 入口参数:I2C_data 将要写入I2C总线的8bit数据
* 出口参数:无
*********************************************************************************************/
void I2C_Write8Bit(uint8 I2C_data)
{
uint8 i;
for(i=8;i!=0;i--)
{
SDA=(bit)(I2C_data&0x80); //写一个BIT
NOP;
NOP;
SCL=1;
NOP;
NOP;
SCL=0;
I2C_data=I2C_data<<1;
}
}
/********************************************************************************************
* 函数名称:I2C_Read8Bit()
* 功 能:从I2C总线接收8bit数据
* 入口参数:无
* 出口参数:返回值为从I2C总线上接收到的8bit数据
*********************************************************************************************/
uint8 I2C_Read8Bit(void) //reentrant
{
uint8 I2C_data=0,i;
for(i=0;i<8;i++)
{
SCL=1;
NOP;
NOP;
NOP;
F0=SDA;
NOP;
SCL=0;
if(F0==1)
{
I2C_data=I2C_data<<1;
I2C_data=I2C_data|0x01;
}
else
I2C_data=I2C_data<<1;
}
return I2C_data;
}
/********************************************************************************************
* 函数名称:AT24C02_Write1Byte()
* 功 能:向AT24C02指定地址上写入1字节数据
* 入口参数:AT24C02_Address AT24C02内的地址
* AT24C02_1Byte 将要写入AT24C02的1字节数据
* 出口参数:无
*********************************************************************************************/
void AT24C02_Write1Byte(uint8 AT24C02_Address,uint8 AT24C02_1Byte)
{
bit AckTemp=1;
I2C_Start();
I2C_Write8Bit(AT24C02_WriteDeviceAddress);
AckTemp=I2C_Check_Ack();
I2C_Write8Bit(AT24C02_Address);
AckTemp=I2C_Check_Ack();
I2C_Write8Bit(AT24C02_1Byte);
AckTemp=I2C_Check_Ack();
I2C_Stop();
}
/********************************************************************************************
* 函数名称:AT24C02_Read1Byte()
* 功 能:从AT24C02指定地址上读出1字节数据
* 入口参数:AT24C02_Address AT24C02内的地址
* 出口参数:从AT24C02指定地址上读出的1字节数据
*********************************************************************************************/
uint8 AT24C02_Read1Byte(uint8 AT24C02_Address)
{
bit AckTemp=1;
uint8 AT24C02_1Byte;
I2C_Start();
I2C_Write8Bit(AT24C02_WriteDeviceAddress);
AckTemp=I2C_Check_Ack();
I2C_Write8Bit(AT24C02_Address);
AckTemp=I2C_Check_Ack();
I2C_Start();
I2C_Write8Bit(AT24C02_ReadDeviceAddress);
AckTemp=I2C_Check_Ack();
AT24C02_1Byte=I2C_Read8Bit();
AckTemp=I2C_Check_Ack();
I2C_Stop();
return AT24C02_1Byte;
}
/***********************************************************************
*函数名称:AT24C02_WriteNByte()
*功 能:连续写n个字节到AT24C02
*入口参数:Address: 内部储存开始地址,*Wdata:数据起始指针,number:个数
*出口参数:无
*备 注:每8个字节一页,一次最多只能写8个字节(超过则会与前面的重叠)
************************************************************************/
void AT24C02_WriteNByte(unsigned char Address,unsigned char *Wdata,unsigned char number)
{
unsigned char i;
bit AckTemp=1;
I2C_Start();
I2C_Write8Bit(AT24C02_WriteDeviceAddress);
AckTemp=I2C_Check_Ack();
I2C_Write8Bit(Address); //开始的地址
AckTemp=I2C_Check_Ack();
for(i=0;i<number;i++)
{
I2C_Write8Bit(*Wdata); //数据
while(I2C_Check_Ack()==FALSE);
Wdata++;
}
I2C_Stop();
}
/***********************************************************************
*函数名称:AT24C02_ReadNByte()
*功 能:连续从AT24C02读n字节出来
*入口参数:Address: 内部储存开始地址,*Wdata:数据存储起始指针,number:个数
*出口参数:无
*备 注:每8个字节一页,一次最多只能读8个字节
************************************************************************/
void AT24C02_ReadNByte(unsigned char Address,unsigned char *Wdata,unsigned char number)
{
unsigned char i;
bit AckTemp=1;
I2C_Start();
I2C_Write8Bit(AT24C02_WriteDeviceAddress);
AckTemp=I2C_Check_Ack();
I2C_Write8Bit(Address);
AckTemp=I2C_Check_Ack();
I2C_Start();
I2C_Write8Bit(AT24C02_ReadDeviceAddress);
AckTemp=I2C_Check_Ack();
for(i=0;i<number;i++)
{
*Wdata = I2C_Read8Bit();
Ack();
Wdata++;
}
NoAck();
I2C_Stop();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -