• AT24C02跨页写数据


    AT24C02

    EEPROM的写数据分为:字节写数据模式和页写数据模式;字节写就是一个地址一个数据的写,页写是连续写数据,一个地址多个数据的写,但是页写不能自动跨页,如果超出一页长度,超出的数据会覆盖原先写入的数据。

    跨页写数据实现方法:通过IIC读写AT24C02,百度上面有一大堆例程。但向AT24C02写一个字符串时,例程上基本上都是以页写的形式呈现。页写入的方式只能写满一页,不能跨页继续写。

     在此补充一个实现跨页写的函数,希望可以帮助到大家:

     

    #define Page_Byte 8 //页字节8个
    
     #define Max_Addr 0xff   //最大可访问地址
    
     unsigned char AT24C02_Write(unsigned char WriteAddr,unsigned char* buffer) 
    
    { 
    
      unsigned short int BufSize = strlen(buffer); //获取要写入的字符串长度
    
       if((Max_Addr-WriteAddr) < BufSize) //空间不足返回0 
    
       return 0; 
    
      I2C_Start(); //发I2C起始信号
    
      I2C_Send_Byte(0XA0); //写器件地址
    
      I2C_Wait_Ack(); //等待应答信号
    
      I2C_Send_Byte(WriteAddr); //发送地址
    
      I2C_Wait_Ack(); //等待应答信号
    
      while(*buffer++ != 0) 
    
      { 
    
        I2C_Send_Byte(*buffer); //发送数据
    
        I2C_Wait_Ack(); //等待应答信号
    
        WriteAddr++; //写入地址加1 
    
        if(WriteAddr % Page_Byte == 0) //新的一页
    
        { 
    
          I2C_Stop(); 
    
          delay_24c02();// AT24C02的写入周期是5ms,延时一定要大于或者等于5ms 
    
          I2C_Start(); 
    
          I2C_Send_Byte(0XA0); 
    
          I2C_Wait_Ack(); //等待应答信号
    
          I2C_Send_Byte(WriteAddr); //发送地址
    
          I2C_Wait_Ack(); //等待应答信号
    
        } 
    
      } 
    
        I2C_Stop(); 
    
        delay_24c02(); 
    
        return 1; 
    
    } 

    在上面的代码中,有两个宏定义,第一个是一页可以写入的字节。在进行页写入的时候,比如写到了地址0x08,那么我们就要对这个地址进行判断,因为0x08已经是新的一页,所以 我们就要给一个停止信号,重新开始一次IIC通信,如何判断一个地址是否是新的一页,就是通过if(WriteAddr % Page_Byte == 0)这条语句实现的。

    第二个宏定义是最大可写入地址,当写入的字节数大于剩余的可写入空间时,就可以通过if((Max_Addr-WriteAddr) < BufSize)这条语句实现,这样的代码更加规范、安全。

     

     

     

  • 相关阅读:
    vfork与fork的区别
    常见的六种设计模式以及应用场景
    Java中常见的集合类比较
    排序——总结
    排序——交换排序
    排序——选择排序
    排序——归并排序
    排序——基数排序
    排序——插入排序
    设计模式
  • 原文地址:https://www.cnblogs.com/leo0621/p/8252175.html
Copyright © 2020-2023  润新知