当前位置: 首页 > news >正文

Page Select 窗口映射怎么理解?用“文件柜的抽屉“讲清楚

一句话: I2C 只能访问 256 个地址,但很多芯片的寄存器远不止 256 个。Page Select 用"下半区固定、上半区可切换"的窗口映射机制解决这个问题。这篇用文件柜做比喻,5 分钟看懂。

系列文章:《嵌入式外设实战》 — NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通

📄 附完整代码 ✅ 用文件柜抽屉讲透 📄 用分和元讲透(附代码) 📄 省引脚绝招 📄 一张表讲清四种模式 📄 多一根线差多远 📄 电压不同的区别 📄 用VTEC波动代替硬件信号 📄 连续N次满足才算数 📄 硬件脚悬空了也别慌 📄 pid-feedforward-lookup 📄 when-to-drop-pid-d-term 📄 pid-deadzone-silence



@[TOC]

适合谁读:适合嵌入式开发者、单片机初学者及遇到类似问题的工程师

问题:256 个地址不够用

I2C 通信协议里,一个设备地址对应 256 个寄存器位置(0x00 到 0xFF)。

但实际芯片——比如光模块的 CMIS 协议——动不动就好几百个寄存器。光 Page 00h 就有 256 字节,加上 Page 01h、Page 02h、Page 1Ah、Page 1Bh……总共有上千字节要管理。

256 个门牌号,怎么塞下上千个房间?


解法:把地址空间劈成两半

把 256 个地址切成两个区域:

区域地址范围特点
下半区0x00 — 0x7F(128 字节)永远不变,放最常用的东西
上半区0x80 — 0xFF(128 字节)可变,根据"当前页"显示不同内容

比喻:一个文件柜

想象一个文件柜:

┌─────────────────────┐ │ 0x00 - 0x7F │ ← 下半区:固定抽屉 │ 温度 | 电压 | 状态 │ 永远在这里,直接拉开就能看 │ 告警 | 版本 | 控制 │ ├─────────────────────┤ │ 0x80 - 0xFF │ ← 上半区:只有一个抽屉口 │ │ 但后面有多个"页"可以切换 │ [当前显示的页] │ └─────────────────────┘

下半区像常用的工具挂在墙上——不用翻找,伸手就拿。

上半区像只有一个开口的文件柜抽屉——你只能看到当前选中的那一页。想看另一页?先拨一下选择开关,抽屉里的内容就换了。


实际操作:怎么切换页

第一步:写 Page Select 寄存器

地址0x7F(在下半区!所以永远可以直接访问)是 Page Select 寄存器。写入页码:

主机 → I2C 写 0x7F = 0x00 // 选择 Page 00h // 此时 0x80-0xFF 显示 Page 00h 的上半区 主机 → I2C 写 0x7F = 0x01 // 选择 Page 01h // 同一个 0x80-0xFF,内容全换了 主机 → I2C 写 0x7F = 0x1A // 选择 Page 1Ah // 又换了——ELSFP 通道控制信息

第二步:读写上半区

页切换后,正常读写0x80-0xFF就行——硬件自动帮你映射到正确的物理寄存器。

// 读 Page 1Ah 的 0x90 寄存器 I2C_Write(0x7F, 0x1A); // 先切页 uint8_t data = I2C_Read(0x90); // 再读——拿到的就是 Page 1Ah 0x90

主机读温度的例子

主机想知道模块温度(在 Page 00h 的0x0E-0x0F):

1. 主机 I2C 读地址 0x0E → 直接读,因为 0x0E < 0x80 在下半区 → 拿到温度高字节 2. 主机 I2C 读地址 0x0F → 同样在下半区 → 拿到温度低字节 全程不需要动 Page Select。

主机想读 ELSFP 通道状态(在 Page 1Ah 的0xDC):

1. 主机 I2C 写 0x7F = 0x1A ← 先选 Page 1Ah 2. 主机 I2C 读 0xDC ← 此时 0xDC 位于上半区,显示 Page 1Ah 的内容 → 拿到通道状态

固件侧怎么实现

从设备(MCU I2C 从机)内部维护一个g_u8CurrentPage变量:

展开查看完整代码(31行)
展开查看完整代码(31行)
展开查看完整代码(31行)
展开查看完整代码(31行)
展开查看完整代码(31行)
volatile uint8_t g_u8CurrentPage = 0x00; // 默认 Page 00h // I2C 写事件处理 void I2C_WriteHandler(uint8_t u8Addr, uint8_t u8Data) { if (u8Addr == 0x7F) { // 写 0x7F → 切换当前页 g_u8CurrentPage = u8Data; return; } if (u8Addr >= 0x80) { // 上半区 → 写入当前页对应的物理位置 WritePageRegister(g_u8CurrentPage, u8Addr, u8Data); } else { // 下半区 → 直接写 WriteLowerRegister(u8Addr, u8Data); } } // I2C 读事件处理 uint8_t I2C_ReadHandler(uint8_t u8Addr) { if (u8Addr >= 0x80) { // 上半区 → 从当前页对应的物理位置读 return ReadPageRegister(g_u8CurrentPage, u8Addr); } else { // 下半区 → 直接读 return ReadLowerRegister(u8Addr); } }

核心逻辑就一个判断:地址 < 0x80 直接读写,地址 >= 0x80 加上"当前页"去查


为什么下半区放这些

下半区的东西是"无论你在哪一页都需要访问的":

地址内容为什么放下半区
0x0E-0x0F模块温度主机随时要看,不能换页
0x03模块状态一插电就要知道模块在什么状态
0x08-0x0B告警标志出故障了立刻感知,不依赖页
0x7FPage Select 本身自举——开关必须放在固定的地方

上半区放"需要看但不是每时每刻都要的"——比如配置参数、广告信息、每个通道的详细数据。


总结

概念一句说清
Page Select 是什么0x7F寄存器选择上半区映射到哪一页
下半区0x00-0x7F永远不变,放紧急和常用数据
上半区0x80-0xFF根据 Page Select 切换内容
固件实现一个g_u8CurrentPage变量 + 地址判断
类比文件柜的共享抽屉口——转动选择开关,抽屉内容就换

这个技巧不限于 CMIS 光模块,任何"I2C 寄存器太多塞不下"的芯片都这么干。理解一次,终身受用。 点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇:《附完整代码》——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通 点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇:《附完整代码》——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通 点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇:《附完整代码》——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通 点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇:《附完整代码》——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通 点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇:《附完整代码》——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通 点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇:《附完整代码》——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通 点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇:《附完整代码》——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通 点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇:《附完整代码》——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通 点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇:《附完整代码》——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通 点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇:附完整代码——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通 点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇:附完整代码——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通


有用的话点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇:附完整代码——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通

http://www.jsqmd.com/news/1163905/

相关文章:

  • AI视频生成实战:从直播剪辑到提示词设计的完整流程
  • JESD51 系列标准规范 是 JEDEC(Joint Electron Device Engineering Council,电子器件工程联合委员会)制定的半导体器件热特性测量与表征的核心工业标准
  • 百达翡丽售后服务处手表维修保养与机芯检测权威公示(2026年7月最新) - 百达翡丽官方售后中心
  • NVIDIA Profile Inspector中文界面改造:让显卡调校不再有语言障碍
  • lcr监控与日志:实现容器运行状态的可观测性
  • DeepSeek-V4本地部署实战:SGLang推理框架深度解析
  • 2026 知名的青岛短视频推广 / 青岛工厂短视频运营精选公司 行业背景与市场趋势 - 米諾
  • 学生信息管理系统 结构化需求分析:从3类用户需求到7个核心数据流图实战
  • Beyond Compare 5密钥生成器:快速激活完整指南
  • 埃拉菲布拉诺Elafibranor:胆汁淤积性肝病全新治疗路径
  • 我怎么用 AI 一天学完 15 个嵌入式固件源文件
  • SMT 锡珠问题:一次产线排查的完整复盘
  • 2026广州民办高中公费生怎么报?南沙朝晖高级中学 2026 招生政策 - 米諾
  • Python--day6
  • 浪琴中国官方售后服务中心|地址与客服服务热线权威信息通告(2026年7月最新) - 浪琴服务中心
  • 卡地亚中国官方售后服务中心|详细热线电话及全部网点地址权威信息通告(2026年7月最新) - 卡地亚官方售后中心
  • OSAPIChecker社区贡献指南:如何参与这个开源项目的完整教程
  • Agentic Proposing: Enhancing Large Language Model Reasoning via Compositional Skill Synthesis
  • AD7175-8与PIC18F96J94高精度数据采集系统设计
  • 如何为KDNN_torch_adapter贡献代码:开发者入门指南
  • VMware安装CentOS7教程:从下载镜像到网络设置_一步不落_新手零失败
  • 2026广州外贸GEO服务商榜单:独立站获客企业怎么选? - 米諾
  • 2026济南除甲醛公司资质怎么查?看这篇就够了 - 米諾
  • 2026 广州荔湾区长短途搬家全套服务明细,租房搬家完整流程与行业收费套路拆解 - gzdjxd
  • STM32基础
  • 劳力士中国官方售后服务中心|官方电话和网点地址权威信息公告(2026年7月最新) - 劳力士服务中心
  • 亲身到店探访杭州亨得利官方名表服务中心|地址及官方联系电话(2026年7月更新) - 亨得利官方
  • 2026 年 6 月企业资质代办|北京金三科技股份有限公司怎么样?实力与落地案例深度解析
  • KDNN_torch_adapter与MKL-DNN对比:在AArch64上的性能基准测试
  • Moving Beyond Downstream Task Accuracy for Information Retrieval Benchmarking超越下游任务准确率:信息检索基准测试的新方向