文章目录

  • 10 bit地址
    • 写操作
    • 组合操作
  • 10位地址中的保留地址
    • 1.广播寻址
    • 2.Start Byte
    • 3.Bus clear

系列文章: 《I2C总线(1)–数据传输格式与7位地址读写》; 《I2C总线(3)–时钟同步和仲裁》; 《I2C总线(4)–高速模式》; 《I2C总线(5)–线与和上拉电阻》; 《I2C总线(6)–START BYTE》

10 bit地址

I2C总线中使用10位地址扩展了7位地址位数,但是10位地址和7位地址的设备可以连接到相同的I2C总线中,并且7位和10位地址均可以在所有总线速度模式中使用。

  • 在产生开始条件或重复开始后,紧跟其后产生10位地址。
  • 10位地址要占据两个字节。
  • 第一个字节中,前7位是组合1111 0XX,其中后两位XX是10位地址的两个最高有效位(MSB)。
  • 第一个字节中,第8位是R/W位,决定传输方向。
  • 第二个字节(XXXX XXXX)用于多个从设备应答的情况,可进一步比较地址。

写操作

采用10bit地址读写和7bit地址读写是相同的,下面重点是阐述出不同之处。

  • 在启动条件满足后,会发送从地址的第一个字节(之前说过,10bit地址要发送两个字节)。
  • 每个从设备将从地址第一个字节的前七位(1111 0XX)与自己的地址进行比较,并检测第8位是否为0。
  • 与从地址第一个字节相匹配的从设备会返回一个ACK(记为A1),
  • 但是,有个能会有多个从设备匹配并生成应答信号(A1)
  • 紧接发送10bit从地址的第二个字节,所有应答A1的从设备的地址与第二个字节(XXXX XXXX)进行比较,最终只有一个从设备地址匹配,并生成应答信号ACK(记为A2)
  • 主设备生成停止条件,或者生成重复开始条件。

组合操作

单纯的读操作与7bit无太大差异,这里不再赘述。下面介绍先写后读的操作,有些地方需要注意。

  • 下图传输方向在第2个RW位改变,所以在应答信号A2之前为读操作。
  • 重复开始信号启动后,匹配的从设备会记住它之前被寻址过
  • 然后这个从设备会检查Sr条件后的前7位,是否与之前读操作时从地址第一个字节相同,并检测第8位是否为1。
  • 如果匹配,则从设备认为它已经作为一个发送器被寻址,并生成确认信号ACK(A3),不会再比较10位从地址的第二个字节

10位地址中的保留地址

有两组地址(0000 XXX 和 1111 XXX)是保留的,用以实现其他的功能。如下:

下面分别介绍几个特殊功能。

1.广播寻址

广播寻址(0000 0000)用于同时寻址连接到I2C总线的每个设备。

  • 如果设备不需要广播提供的任何数据,它可以回复NACK来忽略广播地址;
  • 如果设备需要来自广播的数据,会对广播地址进行ACK,并作为一个从接收设备;
  • 如果多个设备响应广播地址ACK,主设备并不知道有多少个设备回应。每个能够处理此数据的从接收设备第二个和后面的字节ACK。

一般广播地址的含义总是在地址的第二个字节中指定,如下图:

对于LSB(最低有效位)要分为两种情况考虑:

  • LSB为 0 时
广播地址(第二字节) 描述
0000 0110 (10‘h06) 1.从设备回应广播地址复位,并接受地址可编程部分;2.必须采取防御措施 ,以确保设备在施加电压后不会拉低SDA或SCL,因为这些低电平会阻塞总线
0000 0100 (10‘h04) 1.设备不复位;2.通过硬件编写从地址的可编程部分;3.也有要防御措施
0000 0000 (10‘h00) 这个代码不允许出现在第二个字节
  • LSB为 1 时

当LSB=1时,2个字节的地址序列是一个硬件通用调用。这意味着地址序列是由硬件主设备传输的,例如键盘扫描器。第二个字节剩下的7位包含硬件主设备地址,这个地址会被一个连接到总线的智能设备(例如微控制器)识别,然后总线接受来自硬件设备的信息。

由于硬件主设备实现不知道消息必须要传输到 哪个设备,因此它只能生成这个硬件通用调用和他自己的地址,然后标识给系统。

2.Start Byte

微控制器连接I2C总线上,如果微控制器上有片上硬件I2C接口,那么这个控制器可以被编程为“只能被总线的请求中断”。而当微控制器没有这样的接口时,它必须不断地通过软件监控总线。显然,微控制器监控或轮询总线的次数越多,它执行预期功能所需要的时间越短。然后,这种情况下,由于微控制器对总线的监控和轮询,数据传输之前就要使用一个比正常情况要长得多start启动。

启动过程:启动条件(S)+ 启动字节(0000 0001,Start Byte的地址)+ 确认时钟脉冲(ACK)+ 重复开始条件(Sr)

3.Bus clear

在概率极低地情况中,时钟SCL会一直卡在低电平,那么就要对总线进行复位。

  • 如果I2C设备有硬件复位输入,优先考虑使用这个;
  • 如果没有,则激活强制的内部通电复位(POR)电路;此时主设备应该发送9个时钟脉冲,控制总线拉低的设备要在这个9个时钟内释放总线。

I2C中的10bit地址读写相关推荐

  1. I2C之知(五)--I2C总线的10bit地址以及通用广播地址

    其实,10bit地址我没用过,通用广播地址更没用过.通用广播地址应该是在多个mcu之间用i2c进行通信时使用的.虽说没用到,但还是做了翻译,说不定以后有机会用到: 10bit地址 10bit的寻址扩展 ...

  2. 16位I2C寄存器地址读写接口

    16位I2C寄存器地址读写接口 I2C读写接口 static int max96722_read_reg(struct i2c_client *client, unsigned char reg_ad ...

  3. linux应用对I2C设备驱动4种读写方法

    From 一:读写/dev/i2c-x设备结点 /dev/i2c-x设备结点对应的驱动文件为内核目录drivers/i2c下自带的i2c-dev.c文件,通读此文件可以发现它的工作流程.1.通过reg ...

  4. I2C中功能覆盖率的定义

    目录 功能覆盖率包含哪些? 1.target_address_and_slave_address_cg 2.speed_modes_cg 3.bits7_or_bits10_addressing_cg ...

  5. I2C中的时钟同步与仲裁

    文章目录 时钟同步和仲裁 1.时钟同步 2.仲裁 时钟拉伸 系列文章 <I2C总线(1)–数据传输格式与7位地址读写>: <I2C总线(2)–10位地址读写>: <I2C ...

  6. I2C中为什么线与?为什么要有上拉电阻?

    文章目录 为什么采用漏极开路? 为什么要加上拉电阻? 为什么要线与? 总结全文 系列文章: <I2C总线(1)–数据传输格式与7位地址读写>: <I2C总线(2)–10位地址读写&g ...

  7. linux 负数_linux内核提权系列教程(2):任意地址读写到提权的4种方法

    一.漏洞代码分析 代码见arbitrary.h. 1.功能函数介绍 功能 输入结构名 输入结构 功能 ARBITRARY_RW_INIT init_args size 初始化全局对象,存于g_mem_ ...

  8. v8漏洞任意地址读写(CVE-2021-21220)

    V8版本: 9.2.0 commit: 1e4b1c521a491c7487028b7f2aec550c1b36606b 漏洞文件:instruction-selector-x64.cc 漏洞函数:I ...

  9. 利用格式化字符串漏洞实现任意地址读写

    格式化字符串漏洞是一个经典的 pwn 类型漏洞,入门文章很多,例如如下博客 格式化字符串漏洞小总结(上) - 先知社区 (aliyun.com) 原理介绍 - CTF Wiki (ctf-wiki.o ...

  10. linux 写pci配置空间,[转载]应用程序中pci配置空间读写

    应用程序中pci配置空间读写 ~~~~~~~~~~~~~~~~~~~~~~~ 1. 概述 主要讲述在linux操作系统中应用程序如何读写pci配置空间. 2. 基本原理 对于pci设备,由cpu通过一 ...

最新文章

  1. Android多线程死锁定位,Java---多线程之死锁
  2. TensorFlow配置日志等级
  3. @总结 - 4@ 多项式的多点求值与快速插值
  4. mysql引擎测试_MySQL MyISAM引擎和InnoDB引擎的性能测试
  5. python爬虫动态解析js_Python爬虫实战入门五:获取JS动态内容—爬取今日头条
  6. 新希望:拟参与设立总规模40亿元的广西新希望生猪保供专项产业基金
  7. 如何使用 Python 构建 PC 通信?
  8. linux命令-p,Linux-send命令详解
  9. numpy_multiply函数
  10. linux安装阵列卡驱动程序,linux 安装阵列卡驱动
  11. 个人公众号注销方法_微信公众号注销后怎么申请 恢复公众号的方法步骤
  12. GitHub中国区前100名到底是什么样的人?(转载)
  13. 学excel还是学python_以Excel处理为目的学习python还是VBA?
  14. Arduino基础2
  15. MySQL 存储过程的写法
  16. 字母异位词分组-LeetCode49
  17. graphpad画生存曲线怎么样去掉删失点_Graphpad Prism 绘制散点图
  18. Python批量处理图片名
  19. 老树新芽 体验Visual Basic 9.0新功能
  20. 14. echarts画双y轴

热门文章

  1. web工程无法访问本地图片解决方案
  2. 如何发布个人网站(入门全套,小白专用,Linux服务器)
  3. Docker 配置国内镜像加速器,加速下载速度
  4. 解决VirtualBox导入虚拟机文件报错E_INVALIDARG (0x80070057)
  5. 计算机和机械类哪个工资高,机械工程师和软件工程师哪个工资高前景好?
  6. 上海java软件工程师的工资待遇
  7. 计算机左侧没有桌面菜单栏,教您电脑菜单栏不见了
  8. invalid index of a 0-dim tensor
  9. 菜鸟使用RedHat Linux9.0极品笑话
  10. c# 中通快递对接_C# .net实现中通快递单号查询 快递鸟API接口