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

IIC

IIC

目录

IIC

BH1750型号的光照传感器

IIC通信协议

iic物理层

IIC软件层协议

-- 那么一主多从,怎么选中与指定的从机通信呢?

从机设备地址 -- 从手册中查看

IIC 写操作

IIC 读操作

硬件IIC和模拟 IIC 使用

模拟 IIC 使用

!!!注意:模拟iic的代码最好手敲一遍熟悉一下。


-- 这节课新增一个传感器,就是光照传感器

-- 之前单片机上的光敏传感器只能测出几千几千的数据,测不出真正的光照数据

BH1750型号的光照传感器

-- BH1750

-- 学习一个模块,还是按照之前的学习方法,要先找到这个模块的官方手册

-- 找到手册之后先看引脚定义,咱们这个模块一共5个引脚

alt text

alt text

-- 可以看到有SCL和SDA引脚,这就是IIC通信的引脚

  • 以后见到SCL和SDA,就是IIC通信

-- 然后要了解它的通信方式

-- IIC是一种通信方式,为什么有时候会叫做IIC协议?

  • 因为像SPI和IIC通信方式自带的有自身的协议。

-- 什么叫协议?

  • 协议一般指的是通信过程中数据传输的格式或者是数据传输的方式

  • 比如kqm6600,通信协议是规定他传输数据的格式。(一次8字节)

iic也是一种通信时自带协议的通信

-- 补充:spi是全双工通信,优点:快。iic是半双工通信,优点:占用引脚资源少,但是没有SPI的速度快。

-- iic是串行通信,什么叫串行通信(一位一位发),要发送一字节,就要发送8次.

IIC通信协议

IIC其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线(总线是连接各个部件的信息传输线,使各个部件共享的传输介质),使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。

-- 我们之前也学过总线,有SPI总线,单总线

  • 总线:在通信方式上能够连接多个设备

-- iic的应用十分广泛,例如:

  • 1、飞行器当中的陀螺仪:

  • 2、EEPROM-存储器

  • 3、触摸屏(触摸芯片)

  • 各种传感器等


iic物理层

-- 两根通信线:SCL(时钟线) 、 SDA(数据线)

-- 电平标准:一般TTL电平标准

-- 需要接上拉电阻

alt text

它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。
一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步。

也就是说所有IIC设备的SCL,以及SDA都连在一起,设备SCL和SDA都要配置成开漏模式,SCL和SDA各添加一个上拉电阻,阻值一般为4.7k欧姆左右。

-- !!那么怎么判别是哪一个从机向主机发送的数据呢?

每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问.

IIC软件层协议

-- I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。

  • 1、开始信号(双方通信的开始):SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
  • 2、结束信号(双方通信的结束):SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

alt text

-- 对比:SPI有一个缺点:发送过去的数据不知道对方到底收到没。iic避免了这个问题:专门有一个信号叫做应答信号:等待接收方的应答信号。

-- 从机收到这个数据,就会发送一个应答信号,主机收到应答信号,就知道数据发送成功。在iic通信中,每发送一个字节,从机都会发送一个应答。高电平1叫做非应答,0叫做应答。也就是说主机发送数据,从机收到数据,主机会检测到低电平,从机没接收到信号,主机会检测到高电平。双方不通信的时候会是高电平,所以一般将高电平叫做非应答

-- 如果整条iic总线保持静默,两条设备线都是处于高低平

(起始信号和终止信号都是由主机发送的。在起始信号产生之后,总线就处于被占用的状态,在终止信号产生之后,总线就处于空闲状态,起始信号: 一般时钟在最后再回拉低方便时序的拼接)

  • 3、主机发送一个字节:SCL低电平期间,主机将数据的一位放到SDA线上(高位先行),然后拉高SCL(也叫做释放SCL),从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,一次循环8次就可以发送一个字节。

  • 4、主机接收一个字节:(主机在接收之前,主机需要释放SDA,若不释放,不论从机发送什么,SDA始终都是低电平)SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL(置高电平),主机将在SCL高电平期间读取数据位所以SCL高电平期间SDA不允许有数据变化,循环上述过程8次即可接收一个字节 。

  • 5、应答信号: 发送数据的设备:发送完8bit一个字节的数据之后,会等待一定的时间,等接接收方的应答信号(SDA在接收前,拉高释放SDA ),接收端通过拉低SDA数据线,给发送端发送一个应答信号,以提醒发送端我这边已经接受完成,数据可以继续传输,接下来,发送端就可以继续发送数据了。
    接收数据的设备:接收到 8bit一个字节数据后,在下一个时钟,需要向发送数据的设备发出一位数据,其中数据0低电平信号,通知发送方已收到数据,数据1 高电平信号,就是没有通知。


-- 在iic通信中,从机不会主动传输数据的,一般主动发起通信的是主机,起始信号和结束信号都是由主机发送的(与SPI一样)

-- tip:通信最基础的就是发送和接收(类似usart和SPI)

-- 什么叫串行通信(一位一位发),要发送一字节,就要发送8次

-- 疑问:上述的情况下MCU都是做主机的,为什么从机没有发送和接收

因为一般从机的通信都是订死的,主机会根据不同的从机做调整。


-- 那么一主多从,怎么选中与指定的从机通信呢?

  • 就像SPI通信是通过片选实现的从机通信的。

  • 而iic是通过地址实现的从机通信的。在iic总线上的每个设备都有唯一的设备地址 。iic实际上是一个地址通信,每一个iic的从机器件都有自身的地址

  • 比如触摸屏有自身的地址,EEPROM也有自身的地址

  • 但是一条iic总线上不会有地址相同的从机,如果地址一样,是不允许连接到一个iic总线上

  • 每个iic的从设备地址都不一样,从设备的地址只能从手册上查看

-- 在一个项目中,光照传感器的地址是一样的,如果想接多个光照传感器呢?怎么实现?

  • 1、选择不同型号的光照传感器

-- 如果只有一个型号怎么办?

  • 2、再开一个iic总线或者改器件的地址

-- 器件的地址怎么改?

  • iic模块会有一个引脚ADDR,就是用来修改器件地址的引脚。

从机设备地址 -- 从手册中查看

-- 主机根据从机的地址与从机通信。在I2C协议里,分为 7 位和 10 位地址,大多使用 7 位。每个设备出厂时,都会被分配一个地址。若相同芯片接同一个总线,可手动改变(改变从机某个引脚的电平)最后几位地址。

alt text

-- 在开始通信的第一个字节一般是 7bit 的地址位+1bit 的读写位(也可以称之为读写位)。数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据

  • 注意:就算可以修改同类型设备的地址,一个总线上也不能挂载很多个。

最多能挂载同样地址的三个器件,有拉低,拉高,悬空的方法

IIC 写操作

  • 1、产生 start
  • 2、传送器件地址 Device_Address,器件地址的最后一位为数据的传输方向位,R/W 低电平0 表示主机往从机写数据(W),1 表示主机从从机读数(R)。ACK 应答,应答是从机发送给主机的应答。
  • 3、传送写入器件寄存器地址分别传送高地址和低地址,即数据要写入的位置。
  • 4、传送要写入的数据 Data。
  • 5、产生 stop 信号

alt text


-- SCL默认是高电平,SCL如果变成低电平,只能是主机控制这个引脚发送低电平。主机要想发送,就会先将SCL拉低,这就说明主机正在占用总线,从机就不能发送。主机将数据的一位放到SDA线上,怎么放?就是将SDA数据线拉高就是1,拉低就是0.

IIC 读操作

-- 与写操作类似

  • 1、产生 start 信号
  • 2、 传送器件地址(写 Device_Address)+读写位,ACK。
  • 3、传送字地址,ACK。
  • 4、再次产生 start 信号
  • 5、 再传送一次器件地址,ACK。
  • 6、 读取一个字节的数据,读数据最后结束前无应答 ACK 信号。
  • 7、 产生 stop 信号

alt text


-- 再看官方手册上是怎么说的

alt text

alt text

alt text


  • 总结:想要实现 iic 通信就是要主机与从机之间产生 iic 的时序信号。

第一种,是通过配置两个引脚 为开漏模式,然后通过 cpu 执行代码控制引脚输出高电平,编写逻辑,生成 iic 的通信时序。
第二种,使用 stm32 上的片上外设,通过寄存器操作,直接产生 iic 时序。

硬件IIC和模拟 IIC 使用

-- 在讲硬件I2C之前不得不吐槽一下这个硬件I2C外设,有时候就突然会卡在某个事件的检测,需要关闭电源重新启动才有用,不过虽然可能硬件I2C可能会有问题,可能以后不一定用的到但是我们主要是学习如何用硬件实现I2C协议,对我们以后学别的协议肯定会有帮助。

硬件 I2C:是指直接利用 STM32 芯片中的硬件 I2C 外设,该硬件 I2C 外设跟 USART串口外设类似,只要配置好对应的寄存器,外设就会产生标准串口协议的时序。使用它的I2C外设则可以方便地通过外设寄存器来控制硬件I2C外设产生I2C协议方式的通讯,而不需要内核直接控制引脚的电平。

软件模拟I2C:即直接使用CPU内核按照 I2C 协议的要求控制GPIO输出高低电平。如控制产生 I2C 的起始信号时,先控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的GPIO引脚在此期间完成由高电平至低电平的切换,最后再控制SCL 线切换为低电平,这样就输出了一个标准的 I2C 起始信号。

-- 硬件 I2C 直接使用外设来控制引脚,可以减轻 CPU 的负担。不过使用硬件I2C 时必须使用某些固定的引脚作为 SCL 和 SDA,软件模拟 I2C 则可以使用任意 GPIO 引脚,相对比较灵活。

模拟 IIC 使用

-- 参照官方代码

alt text

-- 1、首先配置引脚模式这里拿举例 --开漏模式

  • PB6--iic 时钟引脚 SCL
  • PB7--iic 数据引脚 SDA --开漏模式

-- 2、封装时序信号

  • (1) 起始信号
SDA=1;
SCL=1;
Dealyus(5);
SDA=0;
Dealyus(5);
SCL=0;
Dealyus(5);

alt text

  • (2) 停止信号
SDA=0;
SCL=1;
Dealyus(5);
SDA=1;
Dealyus(5);

alt text

  • (3) 发送单字节 -高位先发

alt text

alt text

  • (4) 接收单字节

alt text

  • (5) 主机发送应答

SDA=0;

  • (6) 主机接收应答

SDA=1;


alt text

-- 注意:在IO初始化中,我们并没有配置上拉电阻,但是前面我们明明讲过要用上拉电阻,这是为什么呢?

  • 答:是我们封装的模块上面有:

alt text


alt text

-- 应答

alt text

-- 接收数据

alt text

-- 硬件连接 -- 4个引脚要连

  • PB6 -- SCL

  • PB7 -- SDA

  • vcc -- 3.3v

  • GND


!!!注意:模拟iic的代码最好手敲一遍熟悉一下。

相关文章:

IIC

IIC 目录 IIC BH1750型号的光照传感器 IIC通信协议 iic物理层 IIC软件层协议 -- 那么一主多从,怎么选中与指定的从机通信呢? 从机设备地址 -- 从手册中查看 IIC 写操作 IIC 读操作 硬件IIC和模拟 IIC 使用 模拟 IIC 使用 !&…...

LLM Observability: Azure OpenAI (一)

作者:来自 Elastic Vinay Chandrasekhar•Andres Rodriguez 我们很高兴地宣布 Azure OpenAI 集成现已全面上市,它提供了对 Azure OpenAI 服务性能和使用的全面可观察性!另请参阅本博客的第 2 部分 虽然我们已经提供了对 LLM 环境的可视性一段…...

qt QBrush详解

1、概述 QBrush是Qt框架中的一个基本图形对象类,它主要用于定义图形的填充模式。QBrush可以用于填充如矩形、椭圆形、多边形等形状,也可以用于绘制背景等。通过QBrush,可以设置填充的颜色、样式(如实心、渐变、纹理等&#xff09…...

Excel函数CUnique连接合并指定区域的唯一值

上一篇文章向大家介绍了如何使用VBA在低版本Excel中创建unique函数的方法,今天我跟大家分享一下如何使用函数连接指定区域的唯一值,也就是将unique函数获取的唯一值连接合并成一个,并指定连接符。 同样,我们需要先创建一个自定义的…...

机械革命屏幕设置为RGB

机械革命屏幕设置为RGB 如何设为机械革命屏幕显示为RGB如何设置1.win菜单下输入“显卡控制中心”2.选择显示器3.设置为RGB4.饱和度大家设为自己舒服的就行5.调整亮度 参考来源 如何设为机械革命屏幕显示为RGB 之前买的显示器,感觉调成sRGB看起来非常舒服。就想着是…...

开源项目-投票管理系统

哈喽,大家好,今天主要给大家带来一个开源项目-投票管理系统 投票管理系统主要有首页,发起投票,管理投票,参与投票,查看投票等功能 首页 为用户提供了一键导航到各个功能模块的便捷途径。 新增投票 用户可以在此轻松创建新的投票活动,设置投票主题、选项等信息。 管理…...

LeetCode 104.二叉树的最大深度

题目描述 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3 示例 2: 输入:root [1…...

Android启动流程_Init阶段

前言 本文将会介绍 Android 启动流程,将基于 Android 10 代码逻辑介绍原生启动过程。 bootloader 上电 -> 加载 recovery 镜像或者 boot 镜像 -> linux kernel 启动 -> 加载 init 进程 -> 加载 zygote 进程 -> systemserver 进程 -> 系统启动 …...

萤火虫算法优化BILSTM神经网络多输入回归分析

目录 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 代码 结果分析 展望 完整代码下载:的MATALB代码(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88755564 背影 bp神经网络是一种成熟的神经网络,应用非常广,本文用萤火虫算法…...

在线QP(QuotedPrintable)编码解码工具

具体前往:Quoted-printable在线编码解码工具-将给定文本编码为:可打印字符引用编码(简称:QP编码),也支持在线解码...

【已解决】cra 配置路径别名 @ 后,出现 ts 报错:找不到模块“@/App”或其相应的类型声明。ts(2307)

cra 配置路径别名 后,出现 ts 报错:找不到模块“/App”或其相应的类型声明。ts(2307) 然后可以在 tsconfig.json 中配置 baseUrl 和 paths : {"compilerOptions": {"target": "es5","lib": [&quo…...

leetcode-643. 子数组最大平均数 I

文章目录 二 解法2.1 每次都重新计算2.2 使用窗口 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。任何误差小于 10-5 的答案都将被视为正确答案。二 解法 2.1 每次都重新计算 超时 pu…...

论分布式架构设计及其实现

一、引言 随着互联网用户规模的扩大和需求的多样化,传统的集中式架构已经难以支撑高并发、高可用的系统要求。分布式架构的出现,提供了将计算和存储分布到不同服务器上的解决方案,有效提高了系统的可扩展性和容灾能力。分布式架构目前已广泛…...

基于BP神经网络的手写体数字图像识别

基于BP神经网络的手写体数字图像识别 摘要 在信息化飞速发展的时代,光学字符识别是一个重要的信息录入与信息转化的手段,其中手写体数字的识别有着广泛地应用,如:邮政编码、统计报表、银行票据等等,因其广泛地应用范围…...

QT——串口调试助手

目录 1.QSerialPort类包含了很多有关串口的API 2.实现串口的打开 2.1 方法一:通过函数实现 2.2 方法二:在ui界面右下角实现 3. 实现定时发送 3.1类的私有成员中添加定时器QTimer timer并去构造函数中初始化它 3.2帮助文档中有QTimer类相关的说明 …...

国产操作系统卖疯了!最营收7.84亿,最低1.5亿

最近看各种报道,似乎国产化有提速的绩效,那么既然如此,各个国产操作系统厂商是不是都起飞了呢? 周末闲暇之余,我们来看看各家的营收表现。 银河麒麟2024年1-9月一共卖了多少钱? 前几天中国软件发布了202…...

2024年华为OD机试真题-最小的调整次数-Python-OD统一考试(E卷)

最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。 题目描述: 有一个特异性的…...

React.js教程:从JSX到Redux的全面解析

文章目录 介绍react脚手架jsx语法和react组件jsx的基本语法jsx的行内样式jsx的类名classNameif条件渲染map循环渲染创建组件方法 可视区渲染 (React- virtualized)React-redux 介绍 javascript库,起源于Facebook的内部项目,类似于vue特点 声明式组件化 …...

二叉苹果树

AcWing 1074. 二叉苹果树【有依赖背包DP】 - AcWing 问题描述 在一棵有权无向树中,从某个节点(这里假设为节点 1)出发,遍历树的子节点,每经过一条边会获得对应的权重值。在访问节点数的限制下(即体积限制…...

【大数据学习 | kafka】producer的参数与结构

1. producer的结构 producer:生产者 它由三个部分组成 interceptor:拦截器,能拦截到数据,处理完毕以后发送给下游,它和过滤器不同并不是丢弃数据,而是将数据处理完毕再次发送出去,这个默认是不…...

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...