电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
【雕爷学编程】Arduino动手做(68)---AT24C256存储模块
分 享
扫描二维码分享
【雕爷学编程】Arduino动手做(68)---AT24C256存储模块
雕爷学编程
雕爷学编程
关注
发布时间: 2020-11-17
丨
阅读: 818
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。 #### 【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真) #### 实验六十八:AT24C256 I2C接口 EEPROM 存储模块 IIC ![](https://cf01.ickimg.com/bbsimages/202011/977b389577e334e4dfe136ee3abfeb01.jpg) AT24C256 是ATMEL公司256kbit串行电可擦的可编程只读存储器,8引脚双排直插式封装,具有结构紧凑、存储容量大等特点,可以在2线总线上并接4片该IC,特别适用于具有高容量数据储存要求的数据采集系统。AT24C256采用SOP-8封装。 ![](https://cf01.ickimg.com/bbsimages/202011/da1794b79ab8d618d832df62becbfb1d.jpg) 芯片参数 芯片有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字节页写模式 ![](https://cf01.ickimg.com/bbsimages/202011/f6849aeb8dcca317d84105cbbecca767.jpg) ![](https://cf01.ickimg.com/bbsimages/202011/24a28e912317aa4720403083208476aa.jpg) A0、A1:地址选择输入端。在串行总线结构中,可以连接4个AT24C256IC。用A0、A1来区分各IC。A0、A1悬空时为0。 SCL:串行时钟输入。上升沿将SDA上的数据写入存储器,下降沿从存储器读出数据送SDA上。 SDA:双向串行数据输入输出口。用于存储器与单片机之间的数据交换。 WP:写保护输入。此引脚与地相连时,允许写操作;与VCC相连时,所有的写存储器操作被禁止。如果不连,芯片内部下拉到地。 VCC:电源。 GND:地。 NC:空。 ![](https://cf01.ickimg.com/bbsimages/202011/cb543cae273db0f96ec0a033370e9bd8.jpg) 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位数据。见图总线协议图。 ![](https://cf01.ickimg.com/bbsimages/202011/33d3ad34459317afe44a318e424a2eb6.jpg) AT24C256 I2C接口 EEPROM 存储模块 ![](https://cf01.ickimg.com/bbsimages/202011/d580f0861956149d2144236447fc670b.jpg) 1.板载芯片AT24C256进口芯片; 2.板载I2C通讯所需的上拉电阻; 3.所有管脚均引出并标注; 4.PCB板子尺寸:1.9(CM)x1.1(CM) ![](https://cf01.ickimg.com/bbsimages/202011/59e0a61da2efac2dd642a706b1ee2ef0.jpg) 模块电原理图 ![](https://cf01.ickimg.com/bbsimages/202011/f60583175e98ff7633be7830a5e59d57.jpg) ```cpp /@@* 【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真) 实验六十八:AT24C256 I2C接口 EEPROM 存储模块 IIC */ #include
#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); } ``` ![](https://cf01.ickimg.com/bbsimages/202011/ad86de9597244edd9f469a3eb98ed62a.jpg) ```cpp /@@* 【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真) 实验六十八:AT24C256 I2C接口 EEPROM 存储模块 IIC 程序之二 */ #include
#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(); } ``` ![](https://cf01.ickimg.com/bbsimages/202011/92da343d5d7854c28511d794c7e6463e.jpg) ![](https://cf01.ickimg.com/bbsimages/202011/998f633176cf9772abf20f581397151f.jpg) ![](https://cf01.ickimg.com/bbsimages/202011/ab212a0eaba1d41f6c655ca42d40ec32.jpg) ![](https://cf01.ickimg.com/bbsimages/202011/6089d437e9882ce775ae7f2093edd6fd.jpg)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
雕爷学编程
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交