EEPROM at24c256读写

/******************************************
*
* Description: EEPROM Read/Write.
* Author:LY
* Date: 2013-07-24 
*
******************************************/
#include <c8051f340.h>
#include "at24c128.h"
//Write:0xA0,Read:0xA1 读写间须延时
#define  EEPROM_ADDR    0xA0 
#define  DELAY_TIME       1  
extern void delay(uint uiCnt);


unsigned char i2c_eeprom_byte_write(unsigned int uiAddr, unsigned char ucData)
{
  unsigned char ucTmp;
  unsigned int    uiTmp;
  unsigned char i;
  
   SDA = 1;
   SCL = 1;
   delay(DELAY_TIME);


   //start bit
   SDA = 0;
   delay(DELAY_TIME);
   
  //device addr
  ucTmp = 0xA0;
  for(i = 0; i<8;i++)
  {
      SCL = 0;


 delay(DELAY_TIME);
      if(ucTmp & 0x80)
      {
      SDA = 1;
      }
 else
   {
      SDA = 0;
   }
 delay(DELAY_TIME);
 ucTmp <<=  1;
 SCL = 1;
      delay(DELAY_TIME);
  }


  //ack read
  SCL = 0;
  SDA = 1;
   delay(DELAY_TIME);
   
   if(SDA == 0)  //ack ok
   {
      SCL = 1;  
      delay(DELAY_TIME);  
   }
   else //ack error
   {
      SCL = 1;  
      delay(DELAY_TIME);  
 
     //stop bit send 
     SCL = 0;
     SDA = 0;
      delay(DELAY_TIME);  
      SCL = 1;  
      delay(DELAY_TIME);  


      SDA = 1; 


      return 1;
   }


   //high address
   uiTmp = uiAddr;
   uiTmp >>= 8;
   ucTmp = uiTmp;
  for(i = 0; i<8;i++)
  {
      SCL = 0;
 delay(DELAY_TIME);
      if(ucTmp & 0x80)
      {
      SDA = 1;
      }
 else
   {
      SDA = 0;
   }


 delay(DELAY_TIME);


 ucTmp <<=  1;


 SCL = 1;
      delay(DELAY_TIME);


  }


  //ack read
  SCL = 0;
  SDA = 1;
   delay(DELAY_TIME);
   
   if(SDA == 0)  //ack ok
   {
      SCL = 1;  
      delay(DELAY_TIME);  
   }
   else //ack error
   {
      SCL = 1;  
      delay(DELAY_TIME);  
 
     //stop bit send 
     SCL = 0;
     SDA = 0;
      delay(DELAY_TIME);  
      SCL = 1;  
      delay(DELAY_TIME);  


      SDA = 1; 


      return 1;
   }
  
   //low address
   ucTmp = uiAddr;
  for(i = 0; i<8;i++)
  {
      SCL = 0;
 delay(DELAY_TIME);
      if(ucTmp & 0x80)
      {
      SDA = 1;
      }
 else
   {
      SDA = 0;
   }


 delay(DELAY_TIME);


 ucTmp <<=  1;


 SCL = 1;
      delay(DELAY_TIME);


  }


  //ack read
  SCL = 0;
  SDA = 1;
   delay(DELAY_TIME);
   
   if(SDA == 0)  //ack ok
   {
      SCL = 1;  
      delay(DELAY_TIME);  
   }
   else //ack error
   {
      SCL = 1;  
      delay(DELAY_TIME);  
 
     //stop bit send 
     SCL = 0;
     SDA = 0;
      delay(DELAY_TIME);  
      SCL = 1;  
      delay(DELAY_TIME);  


      SDA = 1; 


      return 1;
   }


    //data send
   ucTmp = ucData;
  for(i = 0; i<8;i++)
  {
      SCL = 0;
 delay(DELAY_TIME);
      if(ucTmp & 0x80)
      {
      SDA = 1;
      }
 else
   {
      SDA = 0;
   }


 delay(DELAY_TIME);


 ucTmp <<=  1;


 SCL = 1;
      delay(DELAY_TIME);


  }


  //ack read
  SCL = 0;
  SDA = 1;
   delay(DELAY_TIME);
   
   if(SDA == 0)  //ack ok
   {
      SCL = 1;  
      delay(DELAY_TIME);  
   }
   else //ack error
   {
      SCL = 1;  
      delay(DELAY_TIME);  
 
     //stop bit send 
     SCL = 0;
     SDA = 0;
      delay(DELAY_TIME);  
      SCL = 1;  
      delay(DELAY_TIME);  


      SDA = 1; 


      return 1;
   }


     //stop bit send 
     SCL = 0;
     SDA = 0;
      delay(DELAY_TIME);  
      SCL = 1;  
      delay(DELAY_TIME);  


      SDA = 1; 


     return 0;


}




unsigned char i2c_eeprom_byte_read(unsigned int uiAddr)
{
  unsigned char ucTmp;
  unsigned int  uiTmp;
  unsigned char i;
  unsigned char ucData;
   F0=0;
   SDA = 1;
   SCL = 1;
   delay(DELAY_TIME);


   //start bit
   SDA = 0;
   delay(DELAY_TIME);
   
  //device addr
  ucTmp = 0xA0;
  for(i = 0; i<8;i++)
  {
      SCL = 0;
 delay(DELAY_TIME);
      if(ucTmp & 0x80)
      {
      SDA = 1;
      }
 else
   {
      SDA = 0;
   }


 delay(DELAY_TIME);


 ucTmp <<=  1;


 SCL = 1;
      delay(DELAY_TIME);


  }


  //ack read
  SCL = 0;
  SDA = 1;
   delay(100);
   
   if(SDA == 0)  //ack ok
   {
      SCL = 1;  
      delay(DELAY_TIME);  
   }
   else //ack error
   {
    F0=1;
   /*   SCL = 1;   //111
      delay(DELAY_TIME);  
 
     //stop bit send 
     SCL = 0;
     SDA = 0;
      delay(DELAY_TIME);  
      SCL = 1;  
      delay(DELAY_TIME);  


      SDA = 1; 


      return 1; //*/
   }


   //high address
   uiTmp = uiAddr;
   uiTmp >>= 8;
   ucTmp = uiTmp;
  for(i = 0; i<8;i++)
  {
      SCL = 0;
 delay(DELAY_TIME);
      if(ucTmp & 0x80)
      {
      SDA = 1;
      }
 else
   {
      SDA = 0;
   }


 delay(DELAY_TIME);


 ucTmp <<=  1;


 SCL = 1;
      delay(DELAY_TIME);


  }


  //ack read
  SCL = 0;
  SDA = 1;
   delay(DELAY_TIME);
   
   if(SDA == 0)  //ack ok
   {
      SCL = 1;  
      delay(DELAY_TIME);  
   }
   else //ack error
   {  F0=1;
  /*    SCL = 1;    //111
      delay(DELAY_TIME);  
 
     //stop bit send 
     SCL = 0;
     SDA = 0;
      delay(DELAY_TIME);  
      SCL = 1;  
      delay(DELAY_TIME);  


      SDA = 1; 


      return 1; //*/
   }
  
   //low address
   ucTmp = uiAddr;
  for(i = 0; i<8;i++)
  {
      SCL = 0;
 delay(DELAY_TIME);
      if(ucTmp & 0x80)
      {
      SDA = 1;
      }
 else
   {
      SDA = 0;
   }


 delay(DELAY_TIME);


 ucTmp <<=  1;


 SCL = 1;
      delay(DELAY_TIME);


  }


  //ack read
  SCL = 0;
  SDA = 1;
   delay(DELAY_TIME);
   
   if(SDA == 0)  //ack ok
   {
      SCL = 1;  
      delay(DELAY_TIME);  
   }
   else //ack error
   {   F0=1;
/*      SCL = 1;    //111
      delay(DELAY_TIME);  
 
     //stop bit send 
     SCL = 0;
     SDA = 0;
      delay(DELAY_TIME);  
      SCL = 1;  
      delay(DELAY_TIME);  


      SDA = 1; 


      return 1; //*/
   }


   //start bit
   SCL = 0;
   SDA = 1;
   delay(DELAY_TIME);  
   SCL = 1;
   delay(DELAY_TIME);  
   SDA = 0;
   delay(DELAY_TIME);  


   //device address, read
  ucTmp = 0xA1;
  for(i = 0; i<8;i++)
  {
      SCL = 0;
 delay(DELAY_TIME);
      if(ucTmp & 0x80)
      {
      SDA = 1;
      }
 else
   {
      SDA = 0;
   }


 delay(DELAY_TIME);


 ucTmp <<=  1;


 SCL = 1;
      delay(DELAY_TIME);


  }


  //ack read
  SCL = 0;
  SDA = 1;
   delay(DELAY_TIME);
   
   if(SDA == 0)  //ack ok
   {
      SCL = 1;  
      delay(DELAY_TIME);  
   }
   else //ack error
   {   F0=1;
 /*     SCL = 1;      //111
      delay(DELAY_TIME);  
 
     //stop bit send 
     SCL = 0;
     SDA = 0;
      delay(DELAY_TIME);  
      SCL = 1;  
      delay(DELAY_TIME);  


      SDA = 1; 


      return 1; //*/
   }


   //read data
  ucData = 0;
  for(i = 0; i<8;i++)
  {
      SCL = 0;
      delay(DELAY_TIME);
      if(SDA)
      {
      ucData |= 0x01;
      }
else
  {
      ucData &= (~0x01);
  }


       if(i<7)
      {
            ucData <<= 1;
       }


SCL = 1;
delay(DELAY_TIME);
  }
   
  //ack read, no ack----
  SCL = 0;
  SDA = 1;
   delay(DELAY_TIME);
   if(SDA == 1)  //ack ok
   {
      SCL = 1;  
      delay(DELAY_TIME);  
   }
   else //ack error
   {
      SCL = 1;  
      delay(DELAY_TIME);  
 


   }
   
     //stop bit send 
     SCL = 0;
     SDA = 0;
      delay(DELAY_TIME);  
      SCL = 1;  
      delay(DELAY_TIME);  


      SDA = 1;
 
 return   ucData;


}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: AT24C256是一款存储器芯片,可以用于读写数据。下面是一个简单的AT24C256读写程序示例。 首先,需要将AT24C256与微控制器(如Arduino)连接。AT24C256有8位地址总线,可以连接到微控制器的I2C总线上。确保正确连接SDA(串行数据线)和SCL(串行时钟线)。 读取数据的程序示例如下: 1. 首先,初始化I2C总线。 2. 发送AT24C256的设备地址和要读取的内存地址。 3. 发送读取命令。 4. 读取数据。 5. 关闭I2C总线。 下面是一个简单的AT24C256读取数据的程序示例: #include <Wire.h> //引用Wire库 #define EEPROM_ADDR 0x50 //AT24C256设备地址 byte readData(int address) { Wire.beginTransmission(EEPROM_ADDR); //初始化I2C总线,发送设备地址 Wire.write((address >> 8) & 0xFF); //发送要读取的内存地址的高8位 Wire.write(address & 0xFF); //发送要读取的内存地址的低8位 Wire.endTransmission(false); //不关闭I2C总线 Wire.requestFrom(EEPROM_ADDR, 1); //请求读取数据 if (Wire.available()) { return Wire.read(); //读取数据 } return 0; //读取失败,返回0 } void setup() { Wire.begin(); //初始化I2C总线 Serial.begin(9600); //设置串口波特率为9600 } void loop() { int address = 0; //要读取的内存地址 byte data = readData(address); //读取数据 Serial.print("Address: "); Serial.print(address); Serial.print(", Data: "); Serial.println(data, HEX); //以16进制显示数据 delay(1000); //延迟1秒 } 上述程序中,readData函数用于读取指定内存地址的数据。setup函数用于初始化I2C总线和串口。loop函数则循环读取数据并通过串口输出。 需要注意的是,写入数据的程序与读取数据的程序类似,只需将读取命令改为写入命令,并发送要写入的数据即可。 希望以上示例能够帮助你理解AT24C256读写程序。如果需要更详细的帮助,请参考AT24C256数据手册或者相关文档。 ### 回答2: AT24C256是一种串行EEPROM存储器芯片,其容量为256K位,可以通过I2C总线进行读写操作。下面是一个简单的AT24C256 EEPROM的读写程序示例: 首先,需要包含I2C库的头文件,并且定义AT24C256芯片的I2C地址和页大小: #include <Wire.h> #define EEPROM_ADDR 0x50 // AT24C256芯片的I2C地址 #define PAGE_SIZE 64 // AT24C256芯片的页大小为64字节 然后,在setup函数中初始化I2C总线: void setup() { Wire.begin(); // 初始化I2C总线 Serial.begin(9600); } 接下来,可以实现一个函数来向AT24C256芯片写入数据: void writeEEPROM(int addr, byte data) { Wire.beginTransmission(EEPROM_ADDR); // 发送I2C启动信号 Wire.write((byte)(addr >> 8)); // 写入地址的高字节 Wire.write((byte)(addr & 0xFF)); // 写入地址的低字节 Wire.write(data); // 写入数据 Wire.endTransmission(); // 发送I2C停止信号 delay(5); // 等待数据写入完成 } 然后,可以实现一个函数来从AT24C256芯片读取数据: byte readEEPROM(int addr) { byte data = 0; Wire.beginTransmission(EEPROM_ADDR); // 发送I2C启动信号 Wire.write((byte)(addr >> 8)); // 写入地址的高字节 Wire.write((byte)(addr & 0xFF)); // 写入地址的低字节 Wire.endTransmission(); // 发送I2C停止信号 Wire.requestFrom(EEPROM_ADDR, 1); // 从AT24C256芯片请求1字节数据 if (Wire.available()) { data = Wire.read(); // 读取数据 } return data; } 最后,在loop函数中可以调用这些函数实现读写操作: void loop() { byte dataToWrite = 0xAB; int addrToWrite = 0x0000; Serial.print("Writing data "); Serial.print(dataToWrite, HEX); Serial.print(" at address 0x"); Serial.println(addrToWrite, HEX); writeEEPROM(addrToWrite, dataToWrite); delay(2000); int addrToRead = 0x0000; byte dataRead = readEEPROM(addrToRead); Serial.print("Reading data "); Serial.print(dataRead, HEX); Serial.print(" from address 0x"); Serial.println(addrToRead, HEX); delay(2000); } 上述示例中,我们定义了一个要写入的数据和要写入的地址,然后通过writeEEPROM函数写入数据。接着,通过readEEPROM函数从相同地址读取数据,并输出到串行监视器上。循环延迟一段时间后,再次进行写入和读取的操作。 ### 回答3: 以下是AT24C256EEPROM)的读写程序: #include <Wire.h> #include <EEPROM.h> #define EEPROM_ADDR 0x50 void setup() { Wire.begin(); Serial.begin(9600); } void writeData(int addr, byte data) { Wire.beginTransmission(EEPROM_ADDR); Wire.write((int)(addr >> 8)); // 写入高位地址 Wire.write((int)(addr & 0xFF)); // 写入低位地址 Wire.write(data); // 写入数据 Wire.endTransmission(); delay(5); // 延迟确保EEPROM完成写入 } byte readData(int addr) { Wire.beginTransmission(EEPROM_ADDR); Wire.write((int)(addr >> 8)); // 写入高位地址 Wire.write((int)(addr & 0xFF)); // 写入低位地址 Wire.endTransmission(); Wire.requestFrom(EEPROM_ADDR, 1); byte data = Wire.read(); // 读取数据 return data; } void loop() { byte data = 0xAA; int address = 0x0010; writeData(address, data); // 写入数据EEPROM byte readData = readData(address); // 从EEPROM读取数据 Serial.print("写入数据: "); Serial.println(data, HEX); Serial.print("从EEPROM读取的数据: "); Serial.println(readData, HEX); delay(1000); } 以上程序使用了Arduino的Wire库来进行I2C通信。函数writeData用于向EEPROM写入数据,它先发送起始信号,然后发送要写入的地址(由高位和低位组成),最后发送要写入的数据。函数readData用于从EEPROM读取数据,它先发送起始信号,然后发送要读取的地址,接着发送接收数据的请求,并从EEPROM读取一个字节的数据。循环中的代码演示了如何使用这两个函数来进行读写操作。在循环中,我们将0xAA写入地址0x0010,并从该地址读取数据,然后将写入的数据和读取的数据通过串口输出。 该程序只是AT24C256 EEPROM的简单读写示例。你可以根据需求扩展它,例如读取多字节数据,批量写入数据等。请注意始终延迟一定时间以确保EEPROM完成读写操作。此外,注意在编写程序时,需要正确设置EEPROM的I2C地址,并根据需要调整读写的地址范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值