AT24C16页写和多页写

article/2025/10/9 12:06:40

AT24C16 2K字节(存储内存) = 128(页面数)* 16 (每页的字节数) = 2^11 (寻址地址位数 11位)。

AT24C16有128(2^7=128)页只需要7位地址,分为高3位和低4位,高3位在设备地址中,低4位在字地址中。

    设备地址:1010+页地址高3位+读写方向(1:读  0:写)

    字地址:页地址高4位+4位页内偏移地址

    例如读写地址:1864 ,首先计算该地址是多少页的多少个字节,1864/16=116(0x74)页,1864%16=8(0x08),即116页的第8个字节

    其中页地址0x74=0 1 1 1 0 1 0 0,最高位忽略,剩下分为D6、D5、D4(高3位)和D3~D0(低4位)两个部分 。

    可以计算出 设备地址和字地址:

    设备地址:1010 111 0/1  (AT24C16设备地址高4位固定为1010)

    字地址:0100 1000(高4位是页地址低4位,低4位是页内偏移地址,即0x08)

    AT24C16 BYTE WRITE,比较简单,我们看看多页的写入
    
    PAGE WRITE
    查看手册

简单翻译 

16K EEPROM 能够进行16字节的页写入

页写的初始化和字节写入是同样的,但是在第一个数据被写入后,微控制器不需要发送停止信号。相反,EEPROM收到第一个数据之后,进行应答,微控制器可以传送剩下的15个字节, EEPROM在接收到每个数据字后,将以一个0响应。微控制器必须用一个停止条件终止页面写入序列。

当内部自动递增地址到达页面边界时,后面的字节被放置在同一页的开头。如果超过16个数据被传输到EEPROM,数据字地址将“滚动”,以前的数据将被覆盖。

 上图是一页写入过程,多页写入时,首先检查写入总数据字节数是否大于一页,大于一页,就进行跨页处理,上面手册,提到过,如果超过16个数据被传输到EEPROM,数据字地址将“滚动”,以前的数据将被覆盖,为了防止覆盖前面写入,地址要增加。

先看代码

void testPage(){uchar pDataWrite[LEN];//用于写入的数组for(num = 0; num < LEN; num++){pDataWrite[num] = num+1;}at24xxWrite(0x64, pDataWrite, LEN);//从地址 开始写入多个数据
}
//首先检查写入总数据字节数是否大于一页
void at24xxWrite(uint16_t addr, const char* pBuff, uint16_t size)
{uchar writeLen, pageOffset;while(size > 0){// AT24C16有128(2^7=128)页,需要7位地址,分为高3位和低4位, 页低4位和页内偏移地址(4位),组成word address 8位 // 如读写地址:1864 ,1864/16=116(0x74)页,1864%16=8(0x08),即116页的第8个字节// 0x74=0 1 1 1  0 1 0 0, 最高位忽略,分为D6、D5、D4(高3位)和D3~D0(低4位)两个部分// 设备地址:1010 111 0/1, word address: 0100 1000(页低4位 和 页内偏移地址(4位)) // addr & (PAGE_SIZE - 1) 取出低4位 页内偏移地址pageOffset = PAGE_SIZE - (addr & (PAGE_SIZE - 1));writeLen = size > pageOffset ? pageOffset : size;page_write(addr, pBuff, writeLen);size = size - writeLen;if(size > 0){pBuff = pBuff + writeLen;addr = addr + writeLen;}}
}

at24xxWrite(0x64, pDataWrite, LEN); 定义 LEN = 18,一次写入18个字节(写入数据1~18),超过一页

看下图表明数据写入成功

I2C Debugger仪器,在仿真调试期中,该仪器可以显示I2C数据传送时间、S(START状态)、Sr(ReStart状态)、A(Ask响应)、N (No ask状态)、P(Stop状态)、数据(同时显示数据的16进制值和每位的值)。通过查看I2C Debugger窗口的显示,可以知道I2C总线上发送和接受的数据是否正确。

 proteus I2C Debugger 查看 写入过程

S:start()
A0:write_byte(slaveAddr);发送器件写地址 0xa0:1010 0000
A:host_wait_ask()
64:write_byte(newAddr);发送地址(0x64)
A:host_wait_ask()
01:write_byte(*pData);发送数据1
A:host_wait_ask()
...依次发送0x2...0xC(12)共12位数据
P:stop()
    
从地址 0x64,开始,发送0x1~0xC(1~12)共12位数据,为什么只发送了12位,而不是16位?
前面,有提到过,word address高4位是页地址,低4位是页内偏移地址,而0x64 = 0110 0100
高4位0110页地址(第0x110=6页), 低4位0100页内偏移地址,从第4个字节开始写入,总共可写入(16-4=12)个字节
 第6页写完后,要跨到下一页,0x64 + 0xC(12) = 0x70

S:start()
A0:write_byte(slaveAddr);发送器件写地址 0xa0:1010 0000
A:host_wait_ask()
70:write_byte(newAddr);发送地址( 0x70)
A:host_wait_ask()
0D:write_byte(*pData);发送数据13(0xD)
A:host_wait_ask()
...依次发送0xE...0x12(18)后面共5位数据
P:stop() 

后续,试试 读操作:当前地址读取、随机地址读取、顺序连续读取。然后LCD液晶显示结果。

源程序和仿真下载


http://chatgpt.dhexx.cn/article/Qbfi97sJ.shtml

相关文章

EEPROM(AT24C16)页写算法

1. 写在前面 学习单片机或者从事嵌入式开发的&#xff0c;对于EEPROM绝不会陌生&#xff0c;尤其的24系列的EEPROM很是经典&#xff0c;或者与此兼容的FRAM系列&#xff0c;如AT24C02、AT24C16、FM24C16等。 驱动起这个系列的EEPROM&#xff0c;可以说是没有任何难点&#xff0…

AT24C16 读写注意点

开篇一张时序图镇楼&#xff1a; 这篇文章介绍了AT24C16的页写、连续读、写保护功能&#xff1a;AT24C16 读写_D.luffy的博客-CSDN博客_at24c16 页写算法我是参考这篇文章的&#xff1a;https://acuity.blog.csdn.net/article/details/78550427?utm_ char ee_24clxx_writeby…

AT24C16 读写

at24c16 有8块 256字节组成&#xff0c;共2K字节16K bit I2C开始信号后&#xff0c;第一个字节为器件地址&#xff0c;由10103位块地址1位读写标志组成&#xff0c; 3位块地址刚好可以表示 8个块&#xff0c; 所以一次写完256字节&#xff0c;换到下一下块的时候&#xff0c;要…

进程间通信的方式(附代码分析)

进程间通信的方式 1. 进程间通信的几种方式 管道 比如 ls | grep 1;也就是将 进程 ls 拿到的结果作为 grep 1 这个进程的输入。实现了进程间的通信。 消息队列 消息队列就是我们的内核给我们创建的一种消息队列。我们可以往其中发送消息&#xff0c;也可以从其中接收消息。 …

linux进程--进程间通信方式(一)

一、多进程 首先&#xff0c;先来讲一下fork之后&#xff0c;发生了什么事情。 由fork创建的新进程被称为子进程&#xff08;child process&#xff09;。该函数被调用一次&#xff0c;但返回两次。两次返回的区别是子进程的返回值是0&#xff0c;而父进程的返回值则是新进程…

进程间通信的方式——信号、管道、消息队列、共享内存

进程间通信的方式——信号、管道、消息队列、共享内存 多进程&#xff1a; 首先&#xff0c;先来讲一下fork之后&#xff0c;发生了什么事情。 由fork创建的新进程被称为子进程&#xff08;child process&#xff09;。该函数被调用一次&#xff0c;但返回两次。两次返回的区别…

Android 进程间通信的几种实现方式

一、概述 由于应用程序之间不能共享内存。在不同应用程序之间交互数据&#xff08;跨进程通讯&#xff09;&#xff0c;在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件&#xff1a;Activity、Content Provider、Broadcast和S…

进程间通信的方式及原理

# 进程间通信的方式 文章目录 # 进程间通信的方式消息队列使用步骤 管道 消息队列 信号 信号量 socket 消息队列 首先消息队列就是内核维护的一块链表区域&#xff0c;只要是有足够权限的进程都可以向队列中添加消息&#xff0c;只要是有读权限的进程都可以在里面拿出消息 克…

C | 进程间通信的方式

C | 进程间通信的方式 1.无名管道 无名管道是实现亲缘间进程通信的一种方式&#xff0c;属于半双工通信。 无名管道的实现是队列&#xff0c;不能使用lseek对读写指针偏移。 无名管道有两个端&#xff1a;数据流入端和数据流出端&#xff0c;也叫写端和读端。它们是两个固定…

面试题:进程间通信的方式

liunx六大进程间通信方式 管道&#xff0c;消息队列&#xff0c;共享内存&#xff0c;信号量&#xff0c;socket&#xff0c;信号&#xff0c;文件锁 1&#xff0c;管道 1&#xff0c;匿名管道&#xff1a; 概念&#xff1a;在内核中申请一块固定大小的缓冲区&…

进程间通信的几种方式浅谈(上)

程序员必须让拥有依赖关系的进程集协调&#xff0c;这样才能达到进程的共同目标。可以使用两种技术来达到协调。第一种技术在具有通信依赖关系的两个进程间传递信息。这种技术称做进程间通信&#xff08;interprocess communication&#xff09;。第二种技术是同步&#xff0c;…

进程间通信的几种方式

一、管道 在Linux 中&#xff0c;管道是一种使用非常频繁的通信机制。从本质上说&#xff0c;管道也是一种文件&#xff0c;但它又和一般的文件有所不同&#xff0c;管道可以克服使用文件进行通信的两个问题&#xff0c;具体表现如下所述。 • 限制管道的大小。实际上&#x…

【进程间通信】进程间通信方式汇总

个人主页&#xff1a;董哥聊技术 我是董哥&#xff0c;嵌入式领域新星创作者 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; 文章目录 1、管道模型1.1 匿名管道1.2 命名管道 2、消息队列2.1 创建消息队列2.2 发送消息2.3 接收消息 3、共…

android中进程间通信的几种方式

进程间通信&#xff08;IPC&#xff09;方式 使用Bundle使用文件共享使用Messenger使用AIDL使用COntentProvider使用Socket 一、使用Bundle 我们都知道Android中三大组件Activity&#xff0c;Service&#xff0c;Receiver都支持在Intent中传递Bundle数据&#xff0c;而Bundle…

操作系统——进程间通信

文章目录 其他文章管道消息队列共享内存信号量信号Socket总结 个人博客网站&#xff1a; https://xingkongdiyiren.github.io/myblog/,完整的Java知识体系&#xff0c;包括408&#xff0c;架构&#xff0c;业务&#xff0c;产品&#xff0c;软技能等 其他文章 操作系统——概…

进程间的通信方式(六种)

进程之间的通信 参考文章&#xff1a;https://blog.csdn.net/qq_34827674/article/details/107678226 前提知识&#xff1a;每个进程都有自己的用户空间&#xff0c;而内核空间是每个进程共享的。因此进程之间想要进行通信&#xff0c;就需要通过内核来实现。 管道&#xff1…

【操作系统】进程间通信的五种方式

引言1.进程对白&#xff1a;管道、记名管道、套接字1.管道2.虫洞&#xff1a;套接字3.信号 4.信号旗语&#xff1a;信号量5.进程拥抱&#xff1a;共享内存 引言 进程作为人类的发明&#xff0c;自然免不了脱离人类的习性&#xff0c;也有通信需求。如果进程之间不进行任何通信…

进程之间的通信方式

进程之间的通信方式包括管道&#xff0c;消息队列&#xff0c;共享内存&#xff0c;信号&#xff0c;信号量&#xff0c;socket六种方式&#xff0c;下面来对这6种方式分别进行介绍。 一、管道 管道的结构示意图如上所示&#xff0c;管道包含一个输入端和一个输出端&#xff0…

进程间通信的六种常见方式

目录 进程间通信&#xff08;IPC&#xff09;&#xff1a; 一、管道 二、FIFO 三、消息队列 四、共享内存 五、信号 六、信号量 七、进程间通信方式总结&#xff1a; 进程间通信&#xff08;IPC&#xff09;&#xff1a; 进程间通信的方式有很多&#xff0c;这里主要…

idea数据库管理工具配置连接数据库

idea数据库管理工具配置连接数据库 —————————————————————————————————————————————————————— 在cmd中操作数据库太麻烦了&#xff0c;还好idea为我们提供了很方便的数据库管理工具&#xff0c;下面看看如何用idea连接…