24C04 FF后读写 问题

2019-03-24 19:50发布

我在用51 向24C04读写。遇到了问题,就是在读写地址 0xff  以后的  就超过8位地址了。要怎样读取0xff  地址以后的数据呢?
由于24C04是4Kbit的容量,所以换算成字节有512个字节,而我们在操作的时候地址只有八位,从00到FF,一共256个,
所以如果只靠这一个字节是读写不完的,而且我看了下芯片资料 也没有B0这个引脚,所以没有分页之说咯?
那FF后面的地址我要怎么处理呢?

刚接触EEPROM 还不是很懂。请指教!谢谢了!

程序如下:

//----------------------------------------24C04.c-------------------------------------------------------
// 24C04 IIC 读/写程序
//------------------------------------------------------------------------------------------------------


void Start()
{
  SDA = 1; SCL = 1; Delay4us(); SDA = 0; Delay4us(); SCL = 0;
}
//IIC停止
void Stop()
{
  SDA = 0; SCL = 0; Delay4us(); SCL = 1; Delay4us(); SDA = 1;
}

//IIC总线初始化
void IIC_24C04_Init()
{
  SCL = 0; Stop();
}

//发送应答信号
void ACK()
{
  SDA = 0; SCL = 1; Delay4us(); SCL = 0; SDA = 1;
}
 
//读取应答
void RACK()
{
  SDA = 1; Delay4us(); SCL = 1; Delay4us(); SCL = 0;
}


//发送非应答信号
void NO_ACK()
{
  SDA = 1; SCL = 1; Delay4us(); SCL = 0; SDA = 0;
}
 
//从24C04中读一字节
uchar RecByte()
{
  uchar i,d;
  d = 0x00;
  SDA = 1;
  for(i = 0; i < 8; i++)  
  {
    SCL = 1; d <<= 1; d |= SDA; Delay4us(); SCL = 0; Delay4us();
  }
  SCL = 0;
  Delay4us();
  return d;
}
 
//向24C04中写一字节
uchar SendByte(uchar wd)
{
  uchar i;
  bit ack0;
  for(i = 0; i < 8; i++)            //循环移入8位
  {
    SDA = (bit)(wd & 0x80);
    _nop_(); _nop_();SCL = 1; Delay4us(); SCL = 0; wd <<= 1;
  }
  Delay4us();                          //释放总线并准备读取应答
  SDA = 1;                 
  SCL = 1;                
  Delay4us();
  ack0 = !SDA;                       //0表示无应答
  SCL = 0;
  Delay4us();
  return ack0;                         //返回应答
}

//发送多字节数据函数
uchar SendString(uchar Slave, uchar Subaddr, uchar *Buffer, uchar N)
{
  uchar i;
  Start();
  if(!SendByte(Slave))  return 0;     //发送器件地址
  if(!SendByte(Subaddr))  return 0;   //发送器件子地址
  for(i = 0; i < N; i++)
  {
    if(!SendByte(Buffer))  return 0;  //发送数据
  }
  Stop();
  return 1;
}

//接受多字节数据函数
uchar RecString(uchar Slave, uchar Subaddr,uchar * Buffer,uchar N)
{
  uchar i;
  Start(); 
  if(!SendByte(Slave))  return 0;     //发送器件地址
  if(!SendByte(Subaddr))  return 0;   //发送器件子地址
  Start();
  if(!SendByte(Slave + 1))  return 0;  //器件地址,读操作
  for(i = 0;i < N-1; i++)
  {
    Buffer = RecByte();           //接收数据
    ACK();                           //发送应答位
  }
  Buffer[N-1] = RecByte();           //接收最后一位
  NO_ACK();                          //发送非应答位
  Stop();
  return 1;
}


//向24C04中写一字节
void Write_A_Byte(uchar byte)
{
  uchar i;                 
  for(i = 0; i < 8; i++)   //循环移入8位
  {
    byte <<= 1; SDA = CY; _nop_();SCL = 1; Delay4us(); SCL = 0;
  }
  RACK();                  //读取应答
}

//从24C04中读一字节
uchar Receive_A_Byte()
{
  uchar i,d;
  for(i = 0; i < 8; i++)  
  {
    SCL = 1; d <<= 1; d |= SDA; SCL = 0;
  }
    return d;
}

//任意地址写数据
void Write_Random_Address_Byte(uchar addr, uchar dat)
{
  Start();
  Write_A_Byte(0xa8); Write_A_Byte(addr); Write_A_Byte(dat);
  Stop();
  DelayMS(10);
}

//当前地址读数据
uchar Read_Current_Address_Data()
{
  uchar dat;
  Start();
  Write_A_Byte(0xa9); dat = Receive_A_Byte(); NO_ACK();
  Stop();
  return dat;
}


//任意地址读取数据
uchar Random_Read(uchar addr)
{
  Start();
  Write_A_Byte(0xa8); Write_A_Byte(addr);
  Stop();
  return Read_Current_Address_Data();
}
[ 本帖最后由 米兰的小工匠 于 2011-8-10 14:14 编辑 ] 此帖出自小平头技术问答
0条回答

一周热门 更多>