【雕爷学编程】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();

}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容