IIC
IIC
目录
IIC
BH1750型号的光照传感器
IIC通信协议
iic物理层
IIC软件层协议
-- 那么一主多从,怎么选中与指定的从机通信呢?
从机设备地址 -- 从手册中查看
IIC 写操作
IIC 读操作
硬件IIC和模拟 IIC 使用
模拟 IIC 使用
!!!注意:模拟iic的代码最好手敲一遍熟悉一下。
-- 这节课新增一个传感器,就是光照传感器
-- 之前单片机上的光敏传感器只能测出几千几千的数据,测不出真正的光照数据
BH1750型号的光照传感器
-- BH1750
-- 学习一个模块,还是按照之前的学习方法,要先找到这个模块的官方手册
-- 找到手册之后先看引脚定义,咱们这个模块一共5个引脚
-- 可以看到有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电平标准
-- 需要接上拉电阻
它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。
一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
也就是说所有IIC设备的SCL,以及SDA都连在一起,设备SCL和SDA都要配置成开漏模式,SCL和SDA各添加一个上拉电阻,阻值一般为4.7k欧姆左右。
-- !!那么怎么判别是哪一个从机向主机发送的数据呢?
每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问.
IIC软件层协议
-- I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
- 1、开始信号(双方通信的开始):SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
- 2、结束信号(双方通信的结束):SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
-- 对比: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 位。每个设备出厂时,都会被分配一个地址。若相同芯片接同一个总线,可手动改变(改变从机某个引脚的电平)最后几位地址。
-- 在开始通信的第一个字节一般是 7bit 的地址位+1bit 的读写位(也可以称之为读写位)。数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。
- 注意:就算可以修改同类型设备的地址,一个总线上也不能挂载很多个。
最多能挂载同样地址的三个器件,有拉低,拉高,悬空的方法
IIC 写操作
- 1、产生 start
- 2、传送器件地址 Device_Address,器件地址的最后一位为数据的传输方向位,R/W 低电平0 表示主机往从机写数据(W),1 表示主机从从机读数(R)。ACK 应答,应答是从机发送给主机的应答。
- 3、传送写入器件寄存器地址分别传送高地址和低地址,即数据要写入的位置。
- 4、传送要写入的数据 Data。
- 5、产生 stop 信号
-- SCL默认是高电平,SCL如果变成低电平,只能是主机控制这个引脚发送低电平。主机要想发送,就会先将SCL拉低,这就说明主机正在占用总线,从机就不能发送。主机将数据的一位放到SDA线上,怎么放?就是将SDA数据线拉高就是1,拉低就是0.
IIC 读操作
-- 与写操作类似
- 1、产生 start 信号
- 2、 传送器件地址(写 Device_Address)+读写位,ACK。
- 3、传送字地址,ACK。
- 4、再次产生 start 信号
- 5、 再传送一次器件地址,ACK。
- 6、 读取一个字节的数据,读数据最后结束前无应答 ACK 信号。
- 7、 产生 stop 信号
-- 再看官方手册上是怎么说的
- 总结:想要实现 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 使用
-- 参照官方代码
-- 1、首先配置引脚模式这里拿举例 --开漏模式
- PB6--iic 时钟引脚 SCL
- PB7--iic 数据引脚 SDA --开漏模式
-- 2、封装时序信号
- (1) 起始信号
SDA=1;
SCL=1;
Dealyus(5);
SDA=0;
Dealyus(5);
SCL=0;
Dealyus(5);
- (2) 停止信号
SDA=0;
SCL=1;
Dealyus(5);
SDA=1;
Dealyus(5);
- (3) 发送单字节 -高位先发
- (4) 接收单字节
- (5) 主机发送应答
SDA=0;
- (6) 主机接收应答
SDA=1;
-- 注意:在IO初始化中,我们并没有配置上拉电阻,但是前面我们明明讲过要用上拉电阻,这是为什么呢?
- 答:是我们封装的模块上面有:
-- 应答
-- 接收数据
-- 硬件连接 -- 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,可以设置填充的颜色、样式(如实心、渐变、纹理等)…...

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:拦截器,能拦截到数据,处理完毕以后发送给下游,它和过滤器不同并不是丢弃数据,而是将数据处理完毕再次发送出去,这个默认是不…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...