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

news2024/12/28 18:17:55

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配置失败,一般怎么排查

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt开发常见报错大全与解决办法

下面的报错是我日常开发经常遇到的,对着下面的解决方法一招搞定就行了。 我们没必要都去记住,只需要见方抓药即可。 目前版本有27个常见报错,持续更新中。 常见报错 翻译不起作用 你可能改了类名字,但是.ts文件里没有跟着改。 Cannot send events to objects owned by a…

多线程-线程安全

目录 线程安全问题 加锁(synchronized) synchronized 使用方法 synchronized的其他使用方法 synchronized 重要特性(可重入的) 死锁的问题 对 2> 提出问题 对 3> 提出问题 解决死锁 对 2> 进行解答 对4> 进行解答 volatile 关键字 wait 和 notify (重要…

线下研讨会 技术沙龙|乐鑫芯片与 ESP RainMaker® 为科技初创企业赋能

众多科技初创企业在智能硬件市场迅猛发展的背景下,对不断变化的需求展现出了高度的敏锐性,期望能够快速将其转化为切实的产品方案。然而,面对复杂繁重的软硬件集成任务,这些企业往往容易陷入研发瓶颈、资金短缺以及效率低下等多重…

Mybatis技术内幕-基础支撑层

整体架构 MyBatis 的整体架构分为三层, 分别是基础支持层、核心处理层和接口层。 基础支持层 基础支持层包含整个MyBatis 的基础模块,这些模块为核心处理层的功能提供了良好的支撑。 解析器模块 XPathParser MyBatis提供的XPathParser 类封装了XPat…

HackMyVM-Minimal

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 gobuster 文件包含漏洞 提权 web信息收集 main方法 question_1 question_2 question_3 prize.txt 软连接 信息收集 arp ┌──(root?0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: E…

centos7.9系统安全加固

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

pycharm报错Process finished with exit code -1073740791 (0xC0000409)

pycharm报错Process finished with exit code -1073740791 (0xC0000409) 各种垃圾文章(包括chatgpt产生的垃圾文章),没有给出具体的解决办法。 解决办法就是把具体报错信息显示出来,然后再去查。 勾选 然后再运行就能把错误显示…

图像分割各种算子算法-可直接使用(Canny、Roberts、Sobel)

Canny算子: import numpy as np import cv2 as cv from matplotlib import pyplot as pltimg cv.imread("../test_1_1.png") edges cv.Canny(img, 100, 200)plt.subplot(121),plt.imshow(img,cmap gray) plt.title(Original Image), plt.xticks([]), …

vue2+swiper——实现多图轮播+层叠轮播——技能提升

今天看到同事在写轮播图,由于是jq的写法,我没有过多参与,我只写vue的部分。。。虽然语言不一样,但是用法还是要会的。下面介绍通过swiper组件来实现轮播效果。 解决步骤1:安装swiper npm install swiper5.4.5 我这边…

数据分享—全国分省河流水系

河流水系数据是日常研究中必备的数据之一,本期推文主要分享全国分省份的水系和河流数据,梧桐君会不定期的更新数据,欢迎长期订阅。 数据预览 山东省河流水系 吉林省河流水系 四川省河流水系 数据获取方式 链接:https://pan.baidu.…

基于阿里云向量检索 Milvus 版与 PAI 搭建高效的检索增强生成(RAG)系统

阿里云向量检索 Milvus 版现已无缝集成于阿里云 PAI 平台,一站式赋能用户构建高性能的检索增强生成(RAG)系统。您可以利用 Milvus 作为向量数据的实时存储与检索核心,高效结合 PAI 和 LangChain 技术栈,实现从理论到实…

网络基础(三)——网络层

目录 IP协议 1、基本概念 2、协议头格式 2.1、报头和载荷如何有效分离 2.2、如果超过了MAC的规定,IP应该如何做呢? 2.3、分片会有什么影响 3、网段划分 4、特殊的ip地址 5、ip地址的数量限制 6、私有ip地址和公网ip地址 7、路由 IP协议 网络…

LINUX 精通 1——2.1.1 网络io与io多路复用select/poll/epoll

LINUX 精通 1 day12 20240509 算法刷题: 2道高精度 耗时 107min 课程补20240430 耗时:99 min day 13 20240512 耗时:200min 课程链接地址 前言 杂 工作5-10年 够用 费曼:不要直接抄,自己写;不要一个…

【微服务】spring aop实现接口参数变更前后对比和日志记录

目录 一、前言 二、spring aop概述 2.1 什么是spring aop 2.2 spring aop特点 2.3 spring aop应用场景 三、spring aop处理通用日志场景 3.1 系统日志类型 3.2 微服务场景下通用日志记录解决方案 3.2.1 手动记录 3.2.2 异步队列es 3.2.3 使用过滤器或拦截器 3.2.4 使…

安全工程师面试题

安全工程师面试题安全工程师是一个非常重要的职位,他们负责保护公司的网络和系统免受黑客和恶意软件的攻击。如果你想成为一名安全工程师,那么你需要准备好面试。下面是一… 1安全工程师面试题 安全工程师是一个非常重要的职位,他们负责保护…

【全开源】Java俱乐部系统社区论坛商城系统源码-奔驰奥迪保时捷大众宝马等汽车俱乐部

特色功能: 会员中心:会员中心可以帮助企业更好地管理客户,包括设置积分商城、会员卡充值、个人汽车档案等功能,对不同的会员群体展开有针对性的营销,并维护和积累自己的粉丝群体。信息服务:负责定期发布新…

后端项目开发笔记

Maven打包与JDK版本不对应解决方法 我这里使用jdk8。 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configurat…

【Docker】Ubunru下Docker的基本使用方法与常用命令总结

【Docker】docker的基本使用方法 镜像image与容器container的关系基本命令- 查看 Docker 版本- 拉取镜像- 查看系统中的镜像- 删除某个镜像- 列出当前 Docker 主机上的所有容器&#xff0c;包括正在运行的、暂停的、已停止的&#xff0c;以及未运行的容器- 列出当前 Docker 主机…

day05-面向对象内存原理和数组

day05 面向对象内存原理和数组 我们在之前已经学习过创建对象了,那么在底层中他是如何运行的。 1.对象内存图 1.1 Java 内存分配 Java 程序在运行时&#xff0c;需要在内存中分配空间。为了提高运算效率&#xff0c;就对空间进行了不同区域的划分&#xff0c;因为每一片区域…

leetcode——反转链表

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;创建三个指针n1,n2,n3&#xff0c;遍历原链表&#xff0c;通过三者之间的关系将链表反转。下面给出图示&#xff1a; 下面给出题解代码&#xff1a; typedef struct ListNode ListNode; struct List…