⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at24c02.c

📁 PCF8563,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 + -