AT24C16页写和多页写

news2024/12/25 22:27:53

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://www.coloradmin.cn/o/518201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter GetX Tag 属性使用详解

Flutter GetX Tag 属性使用详解 了解 Flutter GetX Tag 属性的定义、用途、实现方式和常见问题。 前言 Flutter中&#xff0c;GetX是一款非常流行的状态管理库。它不仅提供了状态管理的功能&#xff0c;还有路由、依赖注入和许多其他功能。在这篇文章中&#xff0c;我将介绍如…

Node.js简易教程

目录 介绍 fs模块 演示 writeFile 异步写入 appendFile/appendFileSync 追加写入 createWriteStream流式写入 readFile异步读取文件/readFileSync同步读取文件 createReadStream流式读取 文件移动与重命名 文件删除 http模块 创建服务 url 格式化 获取静态文件服务 node模…

“卷爆了“的IT互联网行业,为啥至今还有人头铁往里冲?

细数互联网过往的发展史&#xff0c;造就了成千上万的企业家、创业者&#xff0c;众多职场人趋之若鹜地选择互联网行业&#xff0c;想从这个领域捞一桶金。 但不知道从什么时候开始&#xff0c;一篇篇关于互联网红利消失&#xff0c;流量枯竭的文章接踵而至&#xff0c;现在转…

没关系,前端还死不了

前言 网络上的任何事情都可以在《乌合之众》书中找到答案。大众言论没有理性&#xff0c;全是极端&#xff0c;要么封神&#xff0c;要么踩死。不少人喷前端&#xff0c;说前端已死&#xff1f;前端内卷&#xff1f;前端一个月800包吃住&#xff1f; 对此我想说&#xff0c;“…

【python】批量采集次元岛cos美图,只是为了学习~

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 这里写目录标题 前言开发环境:模块使用:代码展示美图欣赏尾语 &#x1f49d; 开发环境: Python 3.8 Pycharm 模块使用: 第三方模块 需要安装 在cmd里面 进行 pip install requests requests >>> 数据请求模块 …

ACWING 高精度-加减乘除 791 - 794

读取字符串的高精度数字&#xff0c;然后用int数组存上&#xff0c;通过最基础的每位加减乘除和进位等操作完成。 下方给出了所有的操作函数&#xff0c;注意函数的所有输入均为vector 的数组&#xff0c;并且数组存储是从数的低位开始存1000 [0,0,0,1]&#xff0c;和正常存储…

Linux -- 进阶 Web服务器 虚拟主机 -- 基于端口号

虚拟主机 一个Web 服务器&#xff0c;如果只能运行一个网站的话&#xff0c;那么对于一些经费不是很足的小公司来说&#xff0c; 那就有些奢侈了&#xff0c;资源没有办法完全利用上 &#xff08; 无论是 内存&#xff0c;CPU&#xff0c;硬盘&#xff0c;带宽等等 &#xff09…

EIScopus检索 | 2023年智能交通与未来出行国际会议(CSTFM 2023)

会议简介 Brief Introduction 2023年智能交通与未来出行国际会议(CSTFM 2023) 会议时间&#xff1a;2023年7月28日-30日 召开地点&#xff1a;中国长沙 大会官网&#xff1a; CSTFM 2023-2023 International Conference on Smart Transportation and Future Mobility(CSTFM 202…

OpenCL编程指南-3.3矢量数据类型

矢量数据类型 OpenCL C还增加了对矢量数据类型的支持。矢量数据类型如下定义&#xff0c;首先是类型名&#xff0c;具体包括char、uchar、short、ushort、int、uint、float、long或ulong&#xff0c;后面是一个字面值n来定义矢量中的元素个数。对于所有矢量数据类型&#xff0…

母亲节快到了,祝所有母亲节日快乐!Happy Mother‘s Day

《游子吟》唐孟郊 慈母手中线&#xff0c;游子身上衣。 临行密密缝&#xff0c;意恐迟迟归。 谁言寸草心&#xff0c;报得三春晖。 My kind mother has a needle and thread in her hand,Making new clothes for her son who is to travel far away. She is busy sewing c…

FE_Vue学习笔记 Vue监视数据的原理

1 通过更新时的一个问题-this.personList[0] { 更新值 } 不起作用 引入 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script type"text/javascript" src"…

每日一博 - 闲聊“突发流量”的应对之道

文章目录 概述思路 概述 面对“突发流量”的情况,我会采取以下应急措施: 扩容现有资源。这是最直接和最常用的方法。可以通过增加CPU、内存、节点等来扩容。典型案例是双11等大促期间,阿里会大规模扩容幕布等系统以应对流量激增。横向扩展,增加更多服务器或节点。通过增加服务…

lambda处理异常四种方式

最近对接第三方呼叫系统&#xff0c;第三方SDK的所有方法里都有异常抛出&#xff0c;因为用到了lambda&#xff0c;所以异常处理还是很必要的。 本文主要用到了四种解决方案&#xff1a; 直接代码块处理自定义函数式接口&#xff0c;warp静态方法通过Either 类型包装通过Pair 类…

目前收集到好用且免费的ChatGPT镜像站

ChatGPT是一个基于人工智能的聊天机器人&#xff0c;它可以与用户进行自然语言交互。ChatGPT使用了最新的自然语言处理技术&#xff0c;包括深度学习和神经网络&#xff0c;以便更好地理解用户的意图和回答用户的问题。 ChatGPT可以回答各种问题&#xff0c;包括但不限于常见问…

Linux——进程信号2

阻塞信号 信号其他相关常见概念 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作. 注意,阻塞和忽略…

一文4000字用Jmeter +Maven+jenkins实现接口性能全自动化测试

背景&#xff1a; 首先用jmeter录制或者书写性能测试的脚本&#xff0c;用maven添加相关依赖&#xff0c;把性能测试的代码提交到github&#xff0c;在jenkins配置git下载性能测试的代码&#xff0c;配置运行脚本和测试报告&#xff0c;配置运行失败自动发邮件通知&#xff0c…

分布式id解决方法--雪花算法

uuid&#xff0c;jdk自带&#xff0c;但是数据库性能差&#xff0c;32位呀。 mysql数据库主键越短越好&#xff0c;Btree产生节点分裂&#xff0c;大大降低数据库性能&#xff0c;所以uuid不建议。 redis的自增&#xff0c;但是要配置维护redis集群&#xff0c;就为了一个id&a…

【前后端分离博客】学习笔记01 --- 登录模块Sa-Token

前言 用于记录自己学习博客项目的流程 基于Springboot Vue3 开发的前后端分离博客 项目源码&#xff1a;Blog: 基于SpringBoot Vue3 TypeScript Vite的个人博客&#xff0c;MySQL数据库&#xff0c;Redis缓存&#xff0c;ElasticSearch全文搜索&#xff0c;支持QQ、Gite…

20230509MTCNN2

卷积切分图片 怎么切分图片? 使用opencv,PIL切分图片有什么问题? 慢 使用 卷积来切分图片 卷积的运算过程 类似于切图 卷积 对输入图片的尺寸 有没有 的要求? 就是 输入的图片尺寸 必须大于 卷积核的大小 test1.py import torch from torch import nn""&quo…

springboot + vue3实现视频播放Demo

文章目录 学习链接前言ffmpeg安装ffmpeg配置环境变量分割视频文件 后台配置WebConfig 前端代码video.js示例安装依赖视频播放组件效果 Vue3-video-play示例安装依赖main.js中使用视频播放组件效果 学习链接 ffmpeg官网 长时长视频java存储及vue播放解决方法 【 攻城略地 】vue…