半小时搞懂STM32面经知识点——IIC

1.IIC

1.1什么是IIC?

同步半双工通信协议,适用于小数据和短距离传输。

1.2 IIC需要几条线?

IIC总共有2条通信总线(SDA,SCL),SCL为时钟同步线,用于主机和从机间数据同步操作;SDA为数据线;
在这里插入图片描述

1.3 为什么上述两条线要用开漏输出且配上上拉电阻呢?

①多口同线,实现“线与”,防止短路
多个设备挂载在同一个总线上,如果采用推挽输出,其中一个设备输出高电平,另一个设备输出低电平就会造成短路。而开漏输出允许多个设备共享同一个总线或信号线,通过合理的电平控制,实现对总线或信号线的协调使用,避免冲突和干扰。
线与:只要有一个设备输出低电平,那么总线便会变成低电平
②无数据传输时,总线一直保持高电平,减少数据干扰

1.4 IIC最大支持的挂载设备数?

地址组成:7+W/R,高7位为设备地址,最低位为读写位。读写位用低电平0表示写,高电平1表示读。
最大挂载设备为:2^7-1 = 127,剩下一个用作广播地址。 广播只能传输控制命令,如复位,不能传数据。
实际上,已有IIC的设备种类远远多于这个限制,在一条总线上出现相同的地址的IIC设备的概率相当高。IIC标准提出10位的地址方案。当使用10位设备地址,可以挂载的设备理论上可以达到1024个。

10位地址对IIC协议的影响有两点:

      1.地址帧为两个字节长,原来的是一个字节

      2.第一个字节前五位最高有效作用为用作10位地址标识,约定是“11110”

在这里插入图片描述

际设计中的经验值建议不超过8个设备,受到总线电容和总线电压的限制,信号的质量和传输的可靠性可能会受到影响。

1.5 IIC的速度

标准:100 kb/s,适用较长的总线和较慢的设备,如LCD显示屏、温度传感器等
高速模式:3.4Mb/s(可双向传输的最快)适用于对数据传输速度要求非常高的设备,如高清视频处理器、高速闪存等
超快速模式:5Mb/s(只适用于单向传输)适用于需要超高速数据传输的设备,如图像处理器、高速网络接口等

注:上拉电阻越小,电流越大,电平转换效率越高,总线速率越高

1.6 IIC的信号与时序

Start 起始信号

开始条件:SDA,SCL都为高 11

起始信号:SCL为高电平时,SDA从高到低。 01

结束条件:SDA和SCL都处于低电平。 00
在这里插入图片描述

void IIC_Start(void)
{
    SDA_H;            // 拉高SDA
    SCL_H;            // 拉高SCL  先拉高两条线是为了确保空闲状态两个都是高电平
    delay_us(speed);  // 延时控制速度
    SDA_L;            // 启动信号,SCL高电平的时候,SDA从高电平变为低电平
    delay_us(speed);  // 延时,控制速度
    SCL_L;            // 为了准备下一个时钟周期以及接下来的数据传输做准备。
}

Stop 停止信号

开始条件:SDA,SCL都为低

时钟线拉高:SCL拉高先

结束信号:在时钟线为高的时候,SDA从低变高
在这里插入图片描述

void IIC_Stop(void)
{
    SDA_L;  //  
    SCL_L;  // 拉低SCL代码是为了确保从设备能够检测出SDA的变化
    delay_us(speed);
    SCL_H;  //SCL线 
    SDA_H;  // 拉高SDA线,当SCL为高时,SDA线一个上升沿代表停止
    delay_us(speed);
}

ACK 应答信号

应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;
有效应答:SDA为低电平,SCL经历一个完整的时候, 也就是SCL为高电平时候,SDA为低电平
在这里插入图片描述

//产生ACK应答,读取从机一字节数据后还要接着读的时候使用
//SCL在SDA一直为低电平期间完成低高电平转换
void IIC_ACK(void)
{
    SCL_L;   // 拉低SCL是为了让从设备检测到SDA的变化
    SDA_L;   // SDA为低电平表示ACK应答信号
    delay_us(speed);
    SCL_H;   // 经历一个完整的高电平时钟
    delay_us(speed);
    SCL_L;   
}

在这里插入图片描述

//不产生ACK应答,读取从机一字节数据后不读了的时候使用    
//SCL在SDA一直为高电平期间完成低高电平转换
void IIC_NACK(void)
{
    SCL_L;   // 拉低SCL是为了让从设备检测到SDA的变化
    SDA_H;   // SDA为高电平表示ACK应答信号
    delay_us(speed);
    SCL_H;   // 经历一个完整的高电平时钟
    delay_us(speed);
    SCL_L;   
}
//等待ACK应答    
//发送完一个字节后(释放SDA)的下一个时钟高电平时期,读取SDA电平,0为收到应答
bool IIC_Wait_ACK(unsigned int timeOut)
{
    SDA_H;
    delay_us(speed);
    SCL_H;
    delay_us(speed);
    while(SDA_R)
    {
        if(--timeOut)
        {
           printf("Wait IIC timeOut\r\n");
           IIC_Stop();            // 超时未收到应答,停止总线
           return IIC_Err;  //返回失败
        }
        delay_us(speed);
    }
    SCL_L;
    return IIC_OK;   
}

数据信号

发送数据和接收数据时通用。当SCL为高电平,如果SDA始终为高电平时表示逻辑1,如果SDA始终为低电平表示逻辑0.

IIC发送与接受数据帧

在这里插入图片描述
在这里插入图片描述
起始条件+发送要读取的地址(0,为发送数据)+接收应答位+读取的8位数据+发送应答位(0, 应答)+应答位(1,不应答,因为想停止读取)+停止条件
在这里插入图片描述

1.7 IIC仲裁机制

“低电平优先”,谁先发送低电平谁就掌握对总线的控制
通过线与逻辑就可以仲裁主机,如下图所示,在第四个红框的时候,主器件A和主器件B发送的数据为高电平,主器件C为低电平。此时数据线呈现低电平,A和B与数据线电平不相同,退出竞争。C相同获得数据线的归属权。
在这里插入图片描述

1.8 IIC时钟同步

时钟同步发生在仲裁期间,会有多个主机同时发送往SCL上发送时钟信号,需要时钟同步调整速率一致,具体来说就是SCL线上的低电平时间是由时钟低电平最长的设备决定,SCL的高电平则是由高电平时间最短的期间决定 ,通过这一方法可以同步所有设备的时钟,更好的实现仲裁
在这里插入图片描述

1.9 时钟拉伸

时钟拉伸就是完成时钟同步中的事,将主从设备间数据传输同步。
时钟拉伸是用于调整主从设备速率不一致的时候发生的,当从设备速度较慢或需要处理其他事情的时候,从设备主动拉低SCL线通知主设备,直到从设备释放SCL,主设备才进入下一个时许,时钟拉伸解决了I2C主从设备的数率同步问题,使得数据传输更可靠。

1.10 IIC优势

简单且灵活:I2C仅需要两根线(SDA和SCL)来进行通信,使得硬件连接和布线变得简单。
可靠性高:I2C协议采用了主从架构,由主设备控制总线上的数据传输。
多设备支持:IIC支持一主多从,每个设备都有唯一的地址。
低功耗:I2C在基本模式下使用了开漏输出结构,使得设备在非活动状态下可以撤离总线,从而降低功耗。

1.11软件IIC硬件IIC区别

硬件IIC是通过专门的硬件电路实现的,而软件IIC是通过软件控制GPIO口管脚来模拟IIC协议的时许的。
硬件IIC的优势:高速传输 + 低占用率(不需要CPU的干预)+稳定性高(时许由硬件控制,不受外部干扰)
软件IIC的优势:灵活性高(任意GPIO口)+ 可移植性强 + 适用范围广 。

1.12配置失败,一般怎么排查

硬件连接问题
电源供电问题
地址设置问题
软件程序问题
检查时序

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

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

相关文章

SSM【Spring SpringMVC Mybatis】—— Spring(一)

目录 1、初识Spring 1.1 Spring简介 1.2 搭建Spring框架步骤 1.3 Spring特性 1.5 bean标签详解 2、SpringIOC底层实现 2.1 BeanFactory与ApplicationContexet 2.2 图解IOC类的结构 3、Spring依赖注入数值问题【重点】 3.1 字面量数值 3.2 CDATA区 3.3 外部已声明be…

JVM之运行时数据区

Java虚拟机在运行时管理的内存区域被称为运行时数据区。 程序计数器: 也叫pc寄存器,每个线程会通过程序计数器记录当前要执行的字节码指令的地址。程序计数器在运行时是不会发生内存溢出的,因为每个线程只存储一个固定长度的内存地址。 JAVA虚…

Electron学习笔记(四)

文章目录 相关笔记笔记说明 六、数据1、使用本地文件持久化数据(1) 用户数据目录(2) 读写本地文件(3) 第三方库 2、读写受限访问的 Cookie3、清空浏览器缓存 相关笔记 Electron学习笔记(一)Electron学习笔记(二)Electron学习笔记…

文献阅读——ESG的说与做

The cost of hypocrisy: Does corporate ESG decoupling reduce labor investment efficiency? 主要学习借鉴ESG decoupling 如何构造的!!! 1.引言 在碳峰值和碳中和目标的背景下,尽管上市公司ESG信息披露率不断上升&#xff0c…

【网络基础】网络层 之 IP协议与分片、网段划分、IP地址分类、子网掩码与路由

文章目录 网络层1. IP协议段格式1.1 分片1.2 *为什么存在分片 / 分片是什么 ?*1.3 *如何理解 / 实现 分片与组装*1.4 深入具体:分片 和 组装 的过程1.5 为什么不推荐 分片 2. 网段划分2.1 举例:国际间通信 && 国家内通信2.2 理解网段划分 3. IP…

数据库系统理论——关系数据库标准语言SQL

文章目录 一、数据定义1、基本表的定义、删除与修改2、索引的建立于删除(了解) 二、数据查询(会其中一种)1、单表查询(1)这里出现重复元组,怎么处理??(2&…

39-5 入侵检测系统(IDS)- 安装配置IDS(第三天安装成功)

官网:Snort Rules and IDS Software Download 参考: (这位大佬分享了安装包下载链接):https://www.cnblogs.com/taoyuanming/p/12722263.html (安装过程参考这位大佬):Snort 安装与配置(CentOS 7)_centos 7 snort-CSDN博客一、安装 IDS(我这里在 CentOS 7 虚拟机中安…

关于一致性,你该知道的事儿(下)

关于一致性,你该知道的事儿(下) 前言一、并发修改单个对象1.1 原子写操作1.2 显示加锁1.3 原子的TestAndSet1.4 版本号机制 二、 多个相关对象的一致性2.1 最大努力实现2.2 2PC && TCCC2.3.基于可靠消息的一致性方案2.4.Saga事务 三、…

Flink container exit 143 问题排查

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

centos7.9系统安全加固

1、限制用户登陆 vim /etc/hosts.deny,若禁止192.168.0.158对服务器进行ssh的登陆,添加如下内容 sshd : 192.168.0.158 添加完毕后就生效了,直接用192.168.0.158访问主机,就无法连接了,显示 Connection closing...Soc…

【密评】 | 商用密码应用安全性评估从业人员考核题库(9/58)

Hill密码是重要古典密码之一,其加密的核心思想的是()。 A.线性变换 B.非线性变换 C.循环移位 D.移位 著名的Kerckhoff原则是指()。 A.系统的保密性不但依赖于对加密体制或算法的保密,而且依赖于密钥 B.系统…

【JUC】并发编程 Synchronized 锁升级原理

Synchronized如何实现同步/互斥的效果? monitorenter: 将锁对象对象头中Mark Word的前30bit替换成指向操作系统中与其关联的monitor对象,将锁记录位状态改为10 monitorexit: 将锁对象对象头中Mark Word进行重置,重新恢…

Open CASCADE 教程 – AIS:自定义呈现

文章目录 开始 (Getting Started)呈现构建器 (Presentation builders)基元数组 (Primitive arrays)基元外观 (Primitive aspects)二次构建器 (Quadric builders)计算选择 (Computing selection)突出显示选择所有者 (Highlighting selection owner)突出显示的方法 (Highlighting…

【网站项目】SpringBoot796水产养殖系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

vi\vim编辑器

root用户(超级管理员) 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中,拥有最大权限的账户名为:root(超级管理员) root用户拥有最大的系统操作权限,而普通…

改进YOLOv5,YOLOv5+CBAM注意力机制

目录 1. 目标检测模型 2. YOLOv5s 3. YOLOv5s融合注意力机制 4. 修改yolov5.yaml文件 5. ChannelAttentionModule.py 6. 修改yolo.py 1. 目标检测模型 目标检测算法现在已经在实际中广泛应用,其目的是找出图像中感兴趣的对象,并确定对象的类别和位…

牛客NC343 和大于等于K的最短子数组【困难 前缀和 Java/Go】

题目 题目链接: https://www.nowcoder.com/practice/3e1fd3d19fb0479d94652d49c7e1ead1 思路 本答案利用前缀和解答,Java,Go答案通过,但是同样的代码用PHP的话有一个测试用例超时 应该还有更优秀的答案,后面找到更优…

如何远程操作服务器中的Python编译器并将运行结果返回到Pycharm

文章目录 一、前期准备1. 检查IDE版本是否支持2. 服务器需要开通SSH服务 二、Pycharm本地链接服务器测试1. 配置服务器python解释器 三、使用内网穿透实现异地链接服务器开发1. 服务器安装Cpolar2. 创建远程连接公网地址 四、使用固定TCP地址远程开发 本文主要介绍如何使用Pych…

分布式与一致性协议之PBFT算法(一)

PBFT算法 概述 前面提到了拜占庭将军问题之后,有人可能会感到困惑:口信消息型拜占庭问题直接在实际项目中是如何落地的呢?事实上,它很难在实际项目中落地,因为口信消息型拜占庭问题之解是一个非常理论化的算法,没有与…

C++类的概念以及用法

目录 面向过程和面向对象初步认识类的引入类的定义类的两种定义方式声明和定义全部放在类体中 声名定义分离 类的作用域成员变量命名规则建议访问限定符 类的封装类的实例化类对象模型类的对象大小的计算扩展 结构体内存对齐规则 感谢各位大佬对我的支持,如果我的文章对你有用,…