• 【雕爷学编程】Arduino动手做(68)---AT24C256存储模块


    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。

    【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)

    实验六十八:AT24C256 I2C接口 EEPROM 存储模块 IIC

    AT24C256
    是ATMEL公司256kbit串行电可擦的可编程只读存储器,8引脚双排直插式封装,具有结构紧凑、存储容量大等特点,可以在2线总线上并接4片该IC,特别适用于具有高容量数据储存要求的数据采集系统。AT24C256采用SOP-8封装。

    芯片参数
    芯片有3种工作电压;
      5.0V(VCC=4.5V~5.5V)
      2.7V(VCC=2.7V~5.5V)
      1.8V(VCC=1.8V~3.6V)
    特性:
      内部可以组成32k×8存储单元
      2线串行接口
      斯密特触发,滤波输入抑制噪声
      双向数据传送协议
      硬件写保护引脚和软件数据保护功能
      具有64字节页写模式

    A0、A1:地址选择输入端。在串行总线结构中,可以连接4个AT24C256IC。用A0、A1来区分各IC。A0、A1悬空时为0。
    SCL:串行时钟输入。上升沿将SDA上的数据写入存储器,下降沿从存储器读出数据送SDA上。
    SDA:双向串行数据输入输出口。用于存储器与单片机之间的数据交换。
    WP:写保护输入。此引脚与地相连时,允许写操作;与VCC相连时,所有的写存储器操作被禁止。如果不连,芯片内部下拉到地。
    VCC:电源。
    GND:地。
    NC:空。

    AT24C256的工作原理
    AT24C256内部有512页,每一页为64字节,任一单元的地址为15位。地址范围0000H~7FFFH。
    芯片工作状态
    1)时钟和数据传送
    一般情况下,SDA被外部的设备拉到高,只有当SCL为低电平时,SDA上的数据变化,表示要传送数据。SCL为高时SDA变化表示状态变化。
    2)开始状态(START)
    当SCL为高时,SDA由高到低表示数据传送开始,这一状态必须在所有命令之前。
    3)结束状态(STOP)
    当SCL为高时,SDA由低到高表示数据传送结束状态。
    4)应答状态(ACK)
    所有的地址和数据都是以8位的形式串行传送给存储器或从存储器读出的。存储器在第9个时钟周期SDA发零信号表示已经收到8位数据。见图总线协议图。

    AT24C256 I2C接口 EEPROM 存储模块

    1.板载芯片AT24C256进口芯片;
    2.板载I2C通讯所需的上拉电阻;
    3.所有管脚均引出并标注;
    4.PCB板子尺寸:1.9(CM)x1.1(CM)

    模块电原理图

    /*
    
    【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
    
    实验六十八:AT24C256 I2C接口 EEPROM 存储模块 IIC
    
    */
    
    
    
    #include <Wire.h>
    
    #define ADDRESS_AT24C256 0x50
    
    word wordAddress = 0x0F00; 
    
    char str[] = "This is ZLBG."; 
    
    byte buffer[30]; 
    
    int i;
    
    void setup()
    
    {
    
      Wire.begin();
    
      Serial.begin(9600);
    
      //write
    
      Wire.beginTransmission(ADDRESS_AT24C256);
    
      Wire.write(highByte(wordAddress));
    
      Wire.write(lowByte(wordAddress));
    
      for (i = 0; i < sizeof(str); i++)
    
      {
    
        Wire.write(byte(str));
    
      }
    
      Wire.endTransmission();  
    
      delay(10); 
    
    }
    
    void loop()
    
    {
    
       
    
      Wire.beginTransmission(ADDRESS_AT24C256);
    
      Wire.write(highByte(wordAddress));
    
      Wire.write(lowByte(wordAddress));
    
      Wire.endTransmission();
    
      Wire.requestFrom(ADDRESS_AT24C256, sizeof(str));
    
      if(Wire.available() >= sizeof(str))
    
      {
    
        for (i = 0; i < sizeof(str); i++)
    
        {
    
          buffer = Wire.read();
    
        }
    
      }
    
       
    
      for(i = 0; i < sizeof(str); i++)
    
      {
    
        Serial.print(char(buffer));
    
      }
    
      Serial.println();
    
      delay(2000);
    
    }
    

      

    /*
    
    【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
    
    实验六十八:AT24C256 I2C接口 EEPROM 存储模块 IIC
    
    程序之二
    
    */
    
    
    
    #include <Wire.h>
    
    #define EEPROM_ADDR 0x50   
    
        
    
    void setup()
    
    {
    
     Wire.begin();            
    
     Serial.begin(9600);
    
     // TESTS FOR EACH FUNCTION BEGIN HERE
    
     Serial.println("Writing Test:");
    
     for (int i=0; i<20; i++){      
    
      i2c_eeprom_write_byte(EEPROM_ADDR,i,i+65);  
    
      Serial.print(". ");
    
      delay(10);             
    
     }
    
     Serial.println("");
    
     delay(500);
    
     Serial.println("Reading Test:");
    
     for (int i=0; i<20; i++){      
    
      Serial.write(i2c_eeprom_read_byte(EEPROM_ADDR, i));
    
      Serial.print(" ");
    
     }
    
     byte PageData[30];          
    
     byte PageRead[30];          
    
     for (int i=0; i<30; i++){      
    
      PageData = 0;
    
      PageRead = 0;
    
     }
    
     Serial.println("");
    
     for (int i=0; i<30; i++) PageData = i+33; 
    
     Serial.println("Writing Page Test:");
    
     i2c_eeprom_write_page(EEPROM_ADDR, 100, PageData, 28 ); 
    
     Serial.println("Reading Page Test:");
    
     i2c_eeprom_read_buffer( EEPROM_ADDR, 100, PageRead, 28);
    
     for (int i=0; i<28; i++){
    
      Serial.write(PageRead);  
    
      Serial.print(" ");
    
     }
    
    }
    
    void loop()
    
    {
    
    }
    
    void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data )
    
    {
    
     int rdata = data;
    
     Wire.beginTransmission(deviceaddress);
    
     Wire.write((int)(eeaddress >> 8));  
    
     Wire.write((int)(eeaddress & 0xFF)); 
    
     Wire.write(rdata);
    
     Wire.endTransmission();
    
    }
    
    void i2c_eeprom_write_page
    
    ( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length )
    
    {
    
     Wire.beginTransmission(deviceaddress);
    
     Wire.write((int)(eeaddresspage >> 8)); 
    
     Wire.write((int)(eeaddresspage & 0xFF)); 
    
     byte c;
    
     for ( c = 0; c < length; c++)
    
      Wire.write(data[c]);
    
     Wire.endTransmission();
    
     delay(10);              
    
    }
    
    byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress )
    
    {
    
     byte rdata = 0xFF;
    
     Wire.beginTransmission(deviceaddress);
    
     Wire.write((int)(eeaddress >> 8));  
    
     Wire.write((int)(eeaddress & 0xFF)); 
    
     Wire.endTransmission();
    
     Wire.requestFrom(deviceaddress,1);
    
     if (Wire.available()) rdata = Wire.read();
    
     return rdata;
    
    }
    
    void i2c_eeprom_read_buffer( int deviceaddress, unsigned int eeaddress, byte *buffer, int length )
    
    {
    
     Wire.beginTransmission(deviceaddress);
    
     Wire.write((int)(eeaddress >> 8));  
    
     Wire.write((int)(eeaddress & 0xFF)); 
    
     Wire.endTransmission();
    
     Wire.requestFrom(deviceaddress,length);
    
      
    
     for ( int c = 0; c < length; c++ )
    
      if (Wire.available()) buffer[c] = Wire.read();
    
    }
    

      

  • 相关阅读:
    Python基础笔记:线程与进程
    Python爬虫笔记:爬取豆瓣图书TOP250单页数据
    Python爬虫笔记:爬取单个页面
    【转】WCHAR,CHAR,TCHAR的区别
    CString转换为LPSTR和LPSTR转化为CString
    关于反射调用方法的一个log
    Java框架的思考
    Java中反射性能测试
    oracle extend
    ubuntu maven环境安装配置
  • 原文地址:https://www.cnblogs.com/eagler8/p/13994888.html
Copyright © 2020-2023  润新知