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

STM32:I²C通信原理概要

一、IIC通信原理

        IIC通信和串口通信有一定的相似之处,都有一根共地线和两根数据线。但是传递外部信息,串口有两根数据线可以进行双向通信,也就是全双工通信。而在IIC通信下,其中一条数据线是用于提供同步时钟脉冲的时钟线(SCL),只有一根数据线(SDA)能够用于传递外部信息。因此,虽然IIC可以进行双向通信,但是不能够同时进行,也就是半双工通信。

        IIC采用主从模式,支持多设备通信。即一台被当作主机,剩下的当作从机。由主机率先发起通信,从机才能根据主机的指令回复相应的信息。

        像这种支持多个设备进行通信的通信协议我们称之为总线协议。在IIC总线上,每个从机都有其唯一的设备地址。例如AHT20的设备地址是0x70,OLED设备地址是0x7A。当主机需要与AHT20进行通信时,在通信开始时主机就会发送AHT20设备地址。当从机收到主机发来是自己的设备地址后就会向主机发送响应数据(ACK)。如果不是自己的设备地址就把信息抛弃。

        在串口中,通信的双方首先约定通信的速度,即比特率。然后双方按照这一速度在合适的时机去设置/读取数据线上的高低电平,这种模式称之为异步模式。这种的优点就是通信便捷,但是缺点就是要保证双方各自的时钟系统是精确的。

        但是有很多小型传感器并没有精确的晶振提供时钟基准,因此IIC选择了同步通信方式。由主机通过SCL发送固定频率的时钟脉冲信号来作为IIC总线上的统一时钟源。

二、IIC通信步骤

       

        主机负责提供同步的脉冲信号与从机进行时间同步。具体就是当时钟线处于低电平时,数据发送方有权设置数据线的电平;当时钟线为高电平时,无数据线控制权的设备读取数据线电平。

        首先,IIC数据线与时钟线上往往有一个上拉电阻进行上拉。所以在未开始通信时,数据线和时钟线都处于高电平。在通信开始时,数据线的控制权在主机上,从机负责在时钟线在高电平时读取数据。在时钟线依旧是高电平时,将数据线提前下拉。所有从机就读取到一个低电平,意味着开始接收主机指令。而后时钟线提供一个恒定频率的时钟脉冲信号,主从机根据这个时钟信号开始通信操作。例如主机要发送0x71(0111001)数据。

        在时钟线低电平时,数据线为高电平,说明主机发送的数据是1,数据线为低电平时,数据发送的就是0;在时钟线高电平时,数据线为高电平,说明从机读取到的数据是1,数据线为低电平时,从机读取到的就是0..

        将0x71发送完后,从机AHT20收到主机与自身建立通信的信息,返回一个ACK信号,并获得数据线控制权。在物理上的表现就是,时钟线处于低电平时,从机将数据线电平拉低。而后,就与之前的方式相反了。主机负责在时钟线在高电平时读取数据,从机在时钟线低电平时写数据。如此反复直到AHT20返回所有数据。而后在时钟线为高电平时,主机将数据线拉高,表示IIC通信结束。 

也就是说当时钟线为高电平时,主机拉低数据线就代表通信开始,时钟线为高电平的期间, 拉高数据线, 就表示本次通讯结束。

相关文章:

  • 可视化 | 数据可视化降维算法梳理
  • gorilla/websocket的chat示例代码简单分析
  • Web3公链之Cosmos生态的项目Celestia
  • Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作
  • Redis Functions 介绍(一)
  • go中“哨兵错误”的由来及使用建议
  • Docker compose容器编排
  • Python 自动化(十六)静态文件处理
  • 在跑腿App系统开发中,如何构建系统架构?
  • 循环神经网络 - RNN
  • MySQL数据库入门到精通——运维篇(1)
  • 图像处理:图片二值化学习,以及代码中如何实现
  • 【实现多个接口的使用】
  • 软件测试面试,一定要准备的7个高频面试题(附答案,建议收藏)
  • QMS质量检验管理|攻克制造企业质量检验难题,助力企业提质增效
  • CSS 提示工具(Tooltip)
  • CSS居中完全指南——构建CSS居中决策树
  • Java方法详解
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • MySQL几个简单SQL的优化
  • Node 版本管理
  • Web Storage相关
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 前端学习笔记之观察者模式
  • 巧用 TypeScript (一)
  • 数据科学 第 3 章 11 字符串处理
  • 提醒我喝水chrome插件开发指南
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • PostgreSQL之连接数修改
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (1)STL算法之遍历容器
  • (13)Hive调优——动态分区导致的小文件问题
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (70min)字节暑假实习二面(已挂)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (二)Linux——Linux常用指令
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (七)Java对象在Hibernate持久化层的状态
  • (三)c52学习之旅-点亮LED灯
  • (三)docker:Dockerfile构建容器运行jar包
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)Dubbo快速入门、介绍、使用
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .Net IE10 _doPostBack 未定义
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NetCore部署微服务(二)
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • [AIGC] Redis基础命令集详细介绍
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [bbk5179]第66集 第7章 - 数据库的维护 03