原创 AT24Cxx系列通用驱动(测试通过) zhuan

2008-11-29 16:44 1857 8 8 分类: MCU/ 嵌入式

/********************************************************************
//DataBuff为读写数据输入/输出缓冲区的首址
//ByteQuantity 为要读写数据的字节数量
//Address 为EEPROM的片内地址
//ControlByte 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
//表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;
//EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256;
//函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
//ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1
//SDA和SCL由用户自定义,这里暂定义为P0^0和P0^1;
//其余的用户不用管,只要把只子程序放在你的程序中并调用它就可以了;
// 11.0592MHz  测试通过             更新时间:2006.09.10
********************************************************************/


#i nclude "regx52.h"


sbit SDA = P0^0;
sbit SCL = P0^1;


#define  ERRORCOUNT 10
enum  eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
enum  eepromtype EepromType;


 


/***********************************************************************************/
bit   RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
                     unsigned char ControlByte,enum  eepromtype EepromType)
{
  void Delay(unsigned char DelayCount);
  void IICStart(void);
  void IICStop(void);
  bit  IICRecAck(void);
  void IICNoAck(void);
  void IICAck(void);
  void IICSendByte(unsigned char sendbyte);
  unsigned char IICReceiveByte(void);
  unsigned char data j,i=ERRORCOUNT;
  bit errorflag="1";
  while(i--)
  {
    IICStart();
    IICSendByte(ControlByte&0xfe);
    if(IICRecAck())
      continue;
    if(EepromType > M2416) //判断地址是否16bit,AT24C16以下为8bit
    {
      IICSendByte((unsigned char)(Address >> 8));
      if(IICRecAck())
        continue;
    }
    IICSendByte((unsigned char)Address);
    if(IICRecAck())
      continue;
    if(!(ControlByte&0x01))
    {
      j = ByteQuantity;
      errorflag = 0;                      //********clr errorflag
      while(j--)
      {
        IICSendByte(*DataBuff++);
        if(!IICRecAck())
          continue;
        errorflag = 1;
        break;
      }
      if(errorflag==1)
        continue;
      break;
    }
    else
    {
      IICStart();
      IICSendByte(ControlByte);
      if(IICRecAck())
        continue;
      while(--ByteQuantity)
      {
        *DataBuff++ = IICReceiveByte();
        IICAck();
      }
      *DataBuff = IICReceiveByte();        //read last byte data
      IICNoAck();
      errorflag = 0;
      break;
    }
  }
  IICStop();
  if(!(ControlByte&0x01))
  {
    Delay(255);
    Delay(255);
    Delay(255);
    Delay(255);
  }
  return(errorflag);
}



/*****************以下是对IIC总线的操作子程序***/
/*****************启动总线**********************/
void IICStart(void)
{
  SCL = 0;                  //
  SDA = 1;
  SCL = 1;
  _nop_();
  _nop_();
  _nop_();
  SDA = 0;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  SCL = 0;
  SDA = 1;                  //
}


/*****************停止IIC总线****************/
void IICStop(void)
{
  SCL = 0;
  SDA = 0;
  SCL = 1;
  _nop_();
  _nop_();
  _nop_();
  SDA = 1;
  _nop_();
  _nop_();
  _nop_();
  SCL = 0;
}


/**************检查应答位*******************/
bit IICRecAck(void)
{
  SCL = 0;
  SDA = 1;
  SCL = 1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  CY = SDA;                 //因为返回值总是放在CY中的
  SCL = 0;
  return(CY);
}


/***************对IIC总线产生应答*******************/
void IICACK(void)
{
  SDA="0";
  SCL="1";
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  SCL="0";
  _nop_();
  SDA="1";
}


/*****************不对IIC总线产生应答***************/
void IICNoAck(void)
{
  SDA="1";
  SCL="1";
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  SCL="0";
}


/*******************向IIC总线写数据*********************/
void IICSendByte(unsigned char date)
{
  ACC = date; 
  for(date=8;date>0;date--) 
  {
    SCL = 0;       
    SDA = ACC & 0x80; 
    SCL = 1;
  }
  SCL = 0;
}


/**********************从IIC总线上读数据子程序**********/
unsigned char IICReceiveByte(void)
{
  uchar i;
  SCL = 0;
  for(i=8;i>0;i--)
  {
 SCL = 1;
 CY = SDA;
 CY = ACC & 0x80;  
 SCL = 0;
  }
  return(ACC);
}


/***************一个简单延时程序************************/
void Delay(unsigned char DelayCount)
{
  while(DelayCount--);
}

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条