热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IIC协议与编程序列

注:本文转自赛灵思中文社区论坛,源文链接在此。本文原作者为XILINX工程师。以下为个人译文,仅供参考,如有疏漏之处&#x

注:本文转自赛灵思中文社区论坛,源文链接在此。本文原作者为XILINX工程师。

以下为个人译文,仅供参考,如有疏漏之处,还请不吝赐教。

I2C 属于串行通信协议,供双线接口用于连接 EEPROM、传感器、RTCADC/DAC 等低速器件以及嵌入式系统中的其它兼容 I/O 接口。 

在本文中,您将了解有关内部集成电路总线(I2C IIC)的基础知识以及将此协议总线应用于短距离通信的方法。

何谓 I2C?

在本文中,您将了解有关内部集成电路总线(I2C IIC)的基础知识以及将此协议总线应用于短距离通信的方法。

I2C 属于串行通信协议,供双线接口用于连接 EEPROM、传感器、RTCADC/DAC 等低速器件以及嵌入式系统中的其它兼容 I/O 接口。 

I2C 简介

I2C 包含 2 线路:1 条为 SCL(串行时钟),另 1 条为 SDA(串行数据)。这 2 条线路都必须通过电阻上拉到 Vcc。借助使用 I2C 多路复用器可访问各条通道以连接外设,还可通过电平移位器来转换这 2 I2C 线路/信号上的电压电平。

注:SCL 为时钟信号,SDA 为数据信号。 

I2C 的数据传输格式如下所述。

单次数据传输包含 9 个时钟脉冲,用于驱动 8 位数据和 1 ACK/NACK

数据传输帧包含 1 START 1 STOP 条件。

地址类型传输的启动顺序为:1 START 条件,后接 1 7 /10 位地址、1 1 R/~W 1 1 ACK/NACK。随后,数据类型传输包含 8 位数据和 1 ACK/NACK

 

I2C 总线条件

启动 (Start) 条件 - SDA 上执行从高到低转换时,SCL 线路应处于高位。

停止 (Stop) 条件 - SDA 上执行从低到高转换时,SCL 线路应处于高位。

数据有效性 - SCL 处于高位状态时,SDA 线路上的数据有效。

数据变更 - SCL 处于低位状态时,在 SDA 线路上发生数据变更。

总线繁忙 - 处于 START STOP 条件之间时,总线处于繁忙状态。

ACK - SCL 的第 9 次时钟脉冲时,SDA 应处于低位

NACK - SCL 处于第 9 次时钟脉冲时,SDA 应处于高位

 

主器件写 (Master Write) 传输

Master Write 操作从 START 条件开始,后接 7 /10 位从器件地址和 1 位写操作(等于 0)。如果从器件寻址成功,则应由从器件发出确认 (ACK)。后续,主器件 (master) 启动到从器件 (slave) 的数据写入,从器件将在响应中提供 N-1 字节的 ACK。当 N-1 字节完成传输后,主器件会在第 N 字节传输上发送 Not Acknowledged (NACK) 以生成 STOP 条件。

主器件执行的从器件寻址操作失败将导致总线上出现 NACK,故而将不启动数据传输,并生成 STOP 条件。 

主器件读 (Master Read) 传输

Master Read 操作从 START 条件开始,后接 7 /10 位从器件地址和 1 位读操作(等于 1)。如果从器件寻址成功,则应由从器件发出确认 (ACK)。之后,从器件会向主器件发送数据,主器件将在响应中提供 N-1 字节的 ACK。当主器件收到 N-1 字节后,它会在第 N 字节传输上发送 NACK 以生成 STOP 条件。

主器件执行的从器件寻址操作失败将导致总线上出现 NACK,故而将不启动数据读取,并生成 STOP 条件。

 

时钟拉伸 (Clock Stretching)

SCL 由处于活动状态的总线主器件生成。从器件有时可强制时钟处于低位以延迟主器件发送更多数据(或者在主器件尝试切断从器件时钟前,从器件需要更多时间来准备数据)。这称为时钟拉伸或时钟降频。欲知详情,请参阅 https://learn.sparkfun.com/tutorials/i2c/all 的协议页面

 

动态编程序列

使用如下示例中所示伪操作步骤并将其与您所看到的行为进行比较可便于您理解赛灵思 AXI IIC 仿真中的协议行为。

请保留以下步骤的副本,以便您后续在自己的设计中对其进行编辑,如省略或追加步骤。

或者,只需填入适用于的测试案例的任意内容即可。

 

初始化


  1. 将 RX_FIFO 深度设置为最大值:设置 RX_FIFO_PIRQ = 0x _ _
  2. 将 TX_FIFO 复位为 0x_ _
  3. 启用 AXI IIC、移除 TX_FIFO 复位,并禁用通用调用

 

IIC 器件地址 0x_ _ 读字节数据


  1. 读取状态 (Status) 寄存器以检查确认所有 FIFO 均为空,并且总线未处于繁忙状态
  2. 将 0x___ 写入 TX_FIFO(设置启动位,器件地址设置为 0x__,读权限)
  3. 将 0x___ 写入 TX_FIFO(设置停止位,4 字节,将由 AXI IIC 接收)
  4. 等待至 RX_FIFO 不为空为止。

a) 读取 RX_FIFO 字节。

b) 如果读取的是最后一个字节,则退出;否则,只要 RX_FIFO 不为空,则继续检查。

 

IIC 从器件地址 0x_ _ 写字节数据

将数据置于从器件地址 0x__:

  1. 读取 SR 以检查确认所有 FIFO 均为空,并且总线未处于繁忙状态
  2. 将 0x___ 写入 TX_FIFO(设置启动位,器件地址,写权限)
  3. 将 0x__ 写入 TX_FIFO(数据的从地址)
  4. 将 0x__ 写入 TX_FIFO(字节 1)
  5. 将 0x__ 写入 TX_FIFO(字节 2)
  6. 将 0x__ 写入 TX_FIFO(停止位,字节 x)

 

IIC 从器件地址 0x_ _ 读字节数据

数据位于从地址 0x _ _ 

首先,需要写权限才能设置从器件地址,然后读权限之后执行重复启动。

  1. 读取状态 (Status) 寄存器以检查确认所有 FIFO 均为空,并且总线未处于繁忙状态。
  2. 将 0x_ _ _ 写入 TX_FIFO(设置启动位,器件地址设置为 0x__,写权限)。
  3. 将 0x__ 写入 TX_FIFO(数据的从地址)。
  4. 将 0x___ 写入 TX_FIFO(设置重复启动的启动位,器件地址设置为 0x_ _,读权限)。
  5. 将 0x___ 写入 TX_FIFO(设置停止位,4 字节,将由 AXI IIC 接收)。
  6. 等待至 RX_FIFO 不为空为止。

a) 读取 RX_FIFO 字节。

b) 如果读取的是最后一个字节,则退出;否则,只要 RX_FIFO 不为空,则继续检查。

AXI IIC 仿真

本文随附了一个在 Vivado 2018.1 工程中经过修改的仿真测试激励文件。

请将所提供的测试激励文件与 AXI IIC IP 配合使用。它已经过测试,可在 Vivado 环境中正常运行。

以下是根据 AXI IIC 产品指南 (PG090) 所提供的部分编程序列建议的示例。

 

 

以下提供了有关示例案例的说明:

测试 1 - 建议的顺序

将数据置于从器件地址 0x6C(含 1 个数据字节)。

  1. 读取 SR 以检查确认所有 FIFO 均为空,并且总线未处于繁忙状态。
  2. 将 0x1D8 写入 TX_FIFO(设置启动位,器件地址,写权限)。
  3. 将 0x212 写入 TX_FIFO(停止位,最后一个字节)

 

测试 2 - 建议的顺序

将数据置于从器件地址 0x6C(含 2 个数据字节)。

  1. 读取 SR 以检查确认所有 FIFO 均为空,并且总线未处于繁忙状态。
  2. 将 0x1D8 写入 TX_FIFO(设置启动位,器件地址,写权限)。
  3. 将 0x011 写入 TX_FIFO(字节 1)。
  4. 将 0x012 写入 TX_FIFO(字节 2)。
  5. 将 0x2EF 写入 TX_FIFO(停止位,最后一个字节)

 

测试 3 - 建议的顺序

将数据置于从器件地址 0x6C(含 2 个数据字节)。使用错误的从器件地址重新启动。

  1. 读取 SR 以检查确认所有 FIFO 均为空,并且总线未处于繁忙状态。
  2. 将 0x1D8 写入 TX_FIFO(设置启动位,器件地址,写权限)。
  3. 将 0x011 写入 TX_FIFO(字节 1)。
  4. 将 0x012 写入 TX_FIFO(字节 2)。
  5. 将 0x2EF 写入 TX_FIFO(停止位,最后一个字节)
  6. 将 TX FIFO 复位
  7. 将错误的地址 0x108 写入 TX_FIFO(设置启动位,器件地址,写权限)。

 

测试 4 - 不建议

将数据置于从器件地址 0x6C(含 1 个数据字节以及 START 位和 STOP 位):

  1. 读取 SR 以检查确认所有 FIFO 均为空,并且总线未处于繁忙状态。
  2. 将 0x3D8 写入 TX_FIFO(设置启动位,停止位,器件地址,写权限)。

 

由于该字节为停止位,故将被视为最后一个字节。

对其将不会生成 TX FIFO 空中断传输,因此它将产生总线不繁忙中断。

根据 IIC 协议,我们不建议在任一字节中同时包含启动位和停止位。

 

请参阅如下有关此行为的示例:

建议遵循测试案例 12 3 进行操作,但不建议使用测试案例 4

这也将有助于您遵循编程序列来进行操作。

注释:

1) 请留意 ISR interrupt(4) 而不是 interrupt(2),以检测最后一个字节的结束位置。在 interrupt(2) 上会将监测到的最后一个字节前发生的中断判定为正常。

2) 根据 IIC 协议,请勿将启动位和停止位与数据/地址字节置于一处。


推荐阅读
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 开发笔记:Spark Java API 之 CountVectorizer
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了SparkJavaAPI之CountVectorizer相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 你知道Kafka和Redis的各自优缺点吗?一文带你优化选择,不走弯路 ... [详细]
author-avatar
武艺最新单曲问月09
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有