IIC协议详解

news/2024/5/19 7:12:36/文章来源:https://blog.csdn.net/Sup_klz/article/details/126669956

文章目录

    • 1 IIC简介
    • 2 IIC物理层
      • 2.1 IIC硬件
      • 2.2 IIC协议特点
    • 3 IIC协议层
    • 4数据传输
      • 4.1 IIC写数据
      • 4.2 IIC读数据

1 IIC简介

  IIC(Inter-Integrated Circuit)总线是一种由 NXP(原 PHILIPS)公司开发的两线式串行总线, 用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合 使用,传输距离短,任意时刻只能有一个主机等特性。
   在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。
  PS: 这里要注意 IIC 是为了与低速设备通信而发明的,所以 IIC 的传输速率比不上 SPI。
图1
             图1 IIC总线物理拓扑图

2 IIC物理层

2.1 IIC硬件

  IIC有两条总线,一条双向的串行数据线SDA,一条串行时钟线SCL。
  SDA(Serial data):串行数据线,用来传送数据;
  SCL(Serial clock line):时钟线,用来控制数据发送的时序。
  所有接到IIC总线上的设备的SDA线都接到总线的SDA上,各设备的时钟线SCL都接到总线的SCL上。IIC总线上的每一个设备都有一个唯一的地址,以确保不同设备之间的访问互不干扰。

2.2 IIC协议特点

  • IIC主设备(master):主要产生时钟,产生起始和结束信号;
  • IIC从设备(slave):可编程的IIC地址检测,停止位检测等;
  • 支持不同的通信速率(100KHz~400KHz);
  • SCL和SDA都需要接上拉电阻 (大小由速度和容性负载决定一般在3.3K-10K之间) 保证数据的稳定性,减少干扰;
  • IIC是半双工,而不是全双工,同一时间只可以单向通信。

物理层小结
  I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,SCL和SDA被上拉电阻Rp拉高,使SDA和SCL线都保持高电平。
  I2C通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,SPI和uart通信为全双工。

3 IIC协议层

  • 开始信号(Start): SCL为高电平时,SDA由高电平向低电平跳变,标志着开始传输数据;

  • 结束信号(Stop): SCL为高电平时,SDA由低电平向高电平跳变,标志着结束传输数据;
    在这里插入图片描述
              图2 Start和Stop信号

  • 应答信号(ACK/NACK): 所有地址和数据都以8bit为单位传输,如果接受端正确接收了8bit数据,则回复一个bit的“0”信号——ACK信号,如果未正确接收8bit数据,或者接收端不再接受数据,则回复一个bit的“1”信号——NACK信号。即每8bit数据,就会跟1bit ACK/NACK信号。
    在这里插入图片描述
                     图3 ACK信号

  • 数据有效性: IIC信号在传输过程中,当SCL为高电平(SCL=1)时,数据线SDA必须保持稳定状态,不允许有电平跳变。只有当SCL处于低电平期间,SDA的高、低电平才可以交替变化。也就是说发送数据时,bit数据“0”和“1”的交替是发生在SCL的低电平期间。
    在这里插入图片描述
                   图4 IIC bit有效性

4数据传输

4.1 IIC写数据

在这里插入图片描述

                图5 IIC 写(发送)数据格式
字段解析
  Start: 数据传输的开始信号,由主机产生;
  Slave address: 标识从设备的地址,bit7~bit1;
  R/W: W(write)为主机向从机写数据,R(read)为主机向从机读数据,bit0;
  ACK: 主机读数据时,从机做接收,由从机产生ACK信号;
  Word Address: Slave设备内部的数据地址,即主机要往从机的这个地址写数据,上图中Word Address只体现了一个字节,实际上可以有多个字节。如访问8K bytes的 eeprom,就需要2个字节的Word Address来寻址;
  Data: 发送的数据,以字节为单位,每8bit数据,从设备回一个ACK信号;
  Stop: 数据传输的结束信号,由主机产生。

主机向从机写(发送)数据流程:
  1.主机首先产生START信号;
  2.然后紧跟着发送一个从机地址,这个地址共有7位,紧接着的第8位是数据方向位(R/W),
   0表示主机发送数据(写),1表示主机接收数据(读);
  3.主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,若相同,
    主机则认为自己正在被主机寻址,根据R/W位将自己确定为发送器和接收器;
   (注:不要把发送器/接收器主设备/从设备混淆,当主设备向从设备写数据的时候,主设备做发送器,
   从设备做接收器;当主设备向从设备读数据的时候,主设备做接收器,从设备做发射器)
  4.这时候主机等待从机的应答信号(ACK);
  5.当主机收到应答信号时,发送要访问从机的哪个地址, 继续等待从机的应答信号;
  6.当主机收到应答信号时,发送N个字节的数据,继续等待从机的N次应答信号;
  7.主机产生停止信号,结束传送过程。

4.2 IIC读数据

在这里插入图片描述
                图6 IIC 读(接收)数据格式
字段解析:
  Start: 数据传输的开始信号,由主机产生;
  Slave address: 标识从设备的地址,bit7~bit1;
  R/W: W(write)为主机向从机写数据,R(read)为主机向从机读数据,bit0;
  ACK: 正式接收数据后的ACK信号由主机产生。Data传输前的ACK信号由从机产生,因为Data传输前都是
     主机在给从机“写”数据;
  Word Address: Slave设备内部的数据地址,即主机要往从机的这个地址数据,上图中Word Address只体现了一个字节,实际上可以有多个字节。如访问8K bytes的 eeprom,就需要2个字节的Word Address来寻址;
  RS: restart信号,表现形式和start信号完全一样。只是在读的过程中,再次触发了一次start信号,所以我们称之为restart;
  Data: 接收的数据,以字节为单位,每8bit数据,主设备(接收器)回一个ACK信号;
  NACK: 当主机读完指定长度的数据时,会在最后一个byte接收完成后,产生一个NACK信号;
  Stop: 数据传输的结束信号,由主机产生。

主机向从机读(接收)数据流程:
  主机向从机读数据实际上分了两个步骤,一是把需要希望从从机的哪个地址(Word Address)读数据,通过“写”(W)的方式告诉从机;然后再次发送读(R)信号,这时从机才开始给主机发送信号。
1.主机首先产生START信号;
2.然后紧跟着发送一个从机地址,注意此时该地址的R/W位为0,表明是向从机写命令,
 通知从机,主机要读的地址;
3.这时候主机等待从机的应答信号(ACK);
4.当主机收到应答信号时,发送要访问的地址,继续等待从机的应答信号;
5.当主机收到应答信号后,主机要改变通信模式(主机将由发送变为接收,从机将由接收变
 为发送)所以主机重新发送一个开始start信号,然后紧跟着发送一个从机地址,注意此时该地址的R/W位为1,表明将
 主机设置成接收模式开始读取数据;
6.这时候主机等待从机的应答信号,当主机收到应答信号时,就可以接收n个字节的数据,
当接收完成后,主机发送非应答信号(NACK),表示不再接收数据;
7.主机进而产生停止信号,结束传送过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_4953.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

s19.基于 Kubernetes v1.25.0(kubeadm) 和 Docker 部署高可用集群(一)

基于 Kubernetes v1.25.0 和 Docker 部署高可用集群 主要内容 Kubernetes 集群架构组成容器运行时 CRIKubernetes v1.25 新特性Kubernetes v1.24 之后不再支持 Docker 的解决方案Kubernetes v1.25 高可用集群架构基于 Kubernetes v1.25.0 和 Docker 部署高可用集群实战案例 …

Redis持久化机制分析

什么是持久化? 简单来说持久化就是将数据保存到磁盘,让即使服务宕机、重启、断电等操作后数据仍热存在,并且是完整的。 1、为什么要持久化? 1、Redis是一个内存数据库,宕机之后存储在内存的数据会消失。2、Redis重启…

传述最详细的干货,让简历面试不再成为你找工作的绊脚石

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

【蓝桥杯省赛真题37】Scratch三国演义字数统计 少儿编程scratch编程蓝桥杯省赛真题讲解

​​​​​​​ 目录 scratch三国演义字数统计 一、题目要求 编程实现 二、案例分析 1、角色分析

Linux内核设计与实现 第三章 进程管理

3.1进程 实际上,进程就是正在执行的程序代码的实时结果。 进程是出于执行期的程序以及相关的资源的总称。 进程的另一个名字是任务。 进程不仅仅局限于一段可执行程序代码通常进程还要包含其他资源,像打开的文件,挂起的信号,内核…

springboot项目整理(持续更新)

SpringSecurity 1.导入依赖&#xff1a; 在pom.xml中导入依赖&#xff0c;再访问页面就会出现login&#xff0c;这是SpringSecurity自己写的页面&#xff0c;用于登录认证 <dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

整合流量与资源的分享购商业模式,实现整个生态布局

大多数企业都很容易忽视一个市场&#xff0c;就是我们的日常生活服务板块&#xff0c;所谓民以食为天&#xff0c;我们应该顺应人们的生活习惯而做出来的电商商业模式&#xff0c;才是最贴合民心的&#xff0c;也能够从用户的最基础的需求出发来为其打造商业模式。 将目标放在生…

Room (三) RecyclerView 呈现列表数据

1. 用到的组件 Room&#xff0c;ViewModel&#xff0c;LiveData&#xff0c;Repository&#xff0c;AsyncTack 2. Module 中 build.gradle 文件中添加 dependencies {def room_version "2.4.3"implementation "androidx.room:room-runtime:$room_version&quo…

【Linux操作系统】-- 多线程(三)-- 线程池+单例模式

目录 线程池 场景 代码实现 线程安全的单例模式 懒汉实现方式和懒汉实现方式 饿汉方式实现单例模式 懒汉方式实现单例模式 实战代码演练单例模式 线程池 在C中用户使用new/malloc都是向操作系统OS申请的&#xff0c;在系统的角度&#xff0c;就相当于new/malloc在底层封…

MySQL之临时表

写在前面 本文一起看下MySQL的临时表。 1&#xff1a;什么是临时表 通过create temporary table t语句创建的表&#xff0c;就是临时表&#xff0c;临时表的临时体现在其是其生命周期是和会话一样的&#xff0c;当会话结束&#xff0c;即连接关闭时MySQL会自动将创建的临时表…

氨丙基咪唑离子液体(AMIBr)改性纤维素气凝胶吸附剂(CAgAMIBr)的实验要求

氨丙基咪唑离子液体(AMIBr)改性纤维素气凝胶吸附剂(CAgAMIBr)的实验要求 离子液体(ILs)&#xff0c;是完全由离子组成的液体&#xff0c;可以进一步定义为熔点低于100C的熔盐。 离子液体是在室温或接近室温下可呈现液体的液态有机盐。离子液体因具有一些优良的特性使其在分离…

树的直径 树形dp+2次dfs

题目描述 给定一棵树 T &#xff0c;树 T 上每个点都有一个权值。 定义一颗树的子链的大小为&#xff1a;这个子链上所有结点的权值和 。 请在树 T 中找出一条最大的子链并输出。 输入描述: 第一行输入一个 n,1≤n≤105。 接下来一行包含n个数&#xff0c;对于每个数 ai,−10^5…

我赢助手小技巧:学会这三招,爆款内容视频完播率提高50%(下)

上一篇我们说了爆款内容的四大共性和底层逻辑&#xff0c;今天我们来看一看如何去设置标题、封面和剧情&#xff0c;实现视频的完播率。 第三个技巧叫内容高潮。 要在3秒钟之内让用户兴趣高涨&#xff0c;把这样的脚本写出来&#xff0c;怎么样去做&#xff1f;你要把特效、悬…

PCL 生成空间圆点云

目录 一、算法原理二、代码实现三、结果展示一、算法原理 三维空间圆形式如下: 三维空间圆的参数方程: { x ( θ ) = c

蚂蚁核心架构师内部Java并发编程进阶笔记,白嫖简直太香了!

并发编程作为Java开发者很重要以及非常核心的知识&#xff0c;我希望读者朋友具备以下的预备知识&#xff1a; 希望你不是一个初学者线程安全问题,需要你接触过Java Web开发、Jdbc 开发、Web服务器、分布式框架时才会遇到基于JDK8 ,最好对函数式编程、lambda 有一定了解采用了…

thinkphp使用dompdf导出pdf(html转pdf)

目录一 、安装二、安装字体&#xff08;解决无法输出中文&#xff09;三、使用3.1 示例3.2 入参声明3.3 调用声明四、总结一 、安装 命令行安装&#xff1a; composer require dompdf/dompdf下载 GitHub Dompdf库 二、安装字体&#xff08;解决无法输出中文&#xff09; 因…

关于内存条的知识要点⑴

这些天在安装神州网信政府版的过程中&#xff0c;遇到很多计算机配置比较低&#xff0c;比如2009、2010、2012年的计算机&#xff0c;为了让用户使用顺畅一些&#xff0c;需要做一些硬件上的更改&#xff0c;比如加装内存条或者更换固态硬盘等。很多人即使是写代码的IT技术人员…

599. 两个列表的最小索引总和

599. 两个列表的最小索引总和https://leetcode.cn/problems/minimum-index-sum-of-two-lists/ 难度简单224 假设 Andy 和 Doris 想在晚餐时选择一家餐厅&#xff0c;并且他们都有一个表示最喜爱餐厅的列表&#xff0c;每个餐厅的名字用字符串表示。 你需要帮助他们用最少的索…

计算机毕业论文选题java毕业设计软件基于SSM实现的固定资产管理系统

&#x1f345;文末获取联系&#x1f345; 目录 一、项目介绍 二、开题报告 三、截图 四、源码获取 一、项目介绍 计算机毕业设计java毕设之固定资产管理系统_哔哩哔哩_bilibili计算机毕业设计java毕设之固定资产管理系统共计2条视频&#xff0c;包括&#xff1a;IT实战营…

【文献研究】国际班轮航运的合作博弈:The coopetition game in international liner shipping

背景&#xff1a;本人在整理资料时翻找出来的以前做的研究自己写的总结&#xff0c;2017年发布在《Maritime Policy & Management》期刊的一篇关于国际班轮航运合作博弈的英文文献&#xff0c;本人本着学习的目的就文献的重点内容进行了浅层次的解读&#xff0c;就自己的理…