51单片机入门:I2C通讯协议

news2025/1/25 7:09:49

I2C通讯协议

I2C简介

串口通信只能在两个设备之间进行,如果是三个设备相互通讯,那么每个设备需要两组串口,实际上是3组相互独立的串口通信。如果是4个设备相互通信就更加麻烦了,最突出的问题就是线路连接比较复杂。

 为了解决这个难点,人们设计了一种总线通讯,总线通讯有很多种协议,例如:USB、SPI、CAN、IIC。重点介绍IIC通讯。IIC(Inter-Integrated Circuit)也可写作I2C,意思是芯片与芯片之间的通讯。是一种串行通信总线,使用多主从架构(模式)。例如我们的单片机是主机,而其他设备都是从机。

好处:节约了单片机IO口的资源,降低了PCB布线成本等。


通讯模式:多主从模式

通信设备之间的地位是平等的,分为主设备从设备,其中主设备一个、从设备多个。主设备要主导整个通信过程,从设备根据I2C协议被动的响应主设备;

在I2C通信中,没有规定谁做主设备、谁做从设备,是通信双方自己协商的。一个设备在同一时间只能做主设备或者从设备。有的设备可以通过软件配置来决定在此次通信时做主设备还是从设备。


通信特征

串行:只有一根数据线(SDA),每次传输一个bit位;

同步:主从设备工作频率相同,主设备通过SCL时钟线给从设备提供时钟频率;

半双工、低速率


I2C总线通信协议

1、主设备发送一个起始信号;

2、主设备接着发送8bit数据,其中高7位是从设备的地址,最后一位表示此次主设备是要读数据还是写数据;

3、和主设备发送的地址匹配的从设备发出一个ack响应信号

4、主/从设备将数据发送到SDA总线上,每次传输都是8bit数据;

5、主/从设备从SDA线上接收数据,并发送一个ACK响应信号;

6、重复发送和接收的过程,直到主设备发送停止信号,停止本次通信;


四个状态

空闲态:当SCL和SDA同时为高电平时,为空闲态。

起始状态:当主设备在I2C总线上发出起始信号,标志着开始通信。此时必须在时钟信号为高电平期间,数据信号完成由高到低的跳变。这样起始信号就发送完了。

忙态:主从设备正在通信。

停止状态:当主设备在I2C总线上发出停止信号,停止本次通信。当时钟信号为高时,数据信号需要由低到高的跳变。

 


数据线高低电平控制

如果某一时刻有两个设备要发送数据,例如从设备1发送了一个1(高电平)、设备2发送了一个0(低电平),最终数据线上是高电平还是低电平呢?

如下图,在芯片IO口的内部一般会有两颗MOS管,上面的MOS管导通就输出高电平、下面的MOS管导通就输出低电平。当我们把两个IO口都挂在一根总线上,如果一个芯片输出高电平,一个芯片输出低电平,那么电流就直接从电源流入到地。红色的线实际上就短路了,必定会有元器件的烧毁。

为了解决这个问题,I2C总线对于设备的IO口做了一些处理:去掉了上面的MOS管,同时在总线上加一个上拉电阻(取值通常为4.7K)与电源连接。因此总线默认为高电平状态(空闲态)。

芯片想输出低电平就导通MOS管,输出高电平只需要关闭MOS管即可(即:OD开漏输出)。


I2C时序结构

发送字节

SCL低电平时期,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,从机在高电平期间读取数据位。所以SCL高电平期间,SDA不允许有数据变化。依次循环上述过程8次,即可发送一个字节。

接收字节

SCL低电平期间,从机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化。(主机在接收之前,需释放SDA)

发送应答

在接收完一个字节后,主机在下一个时钟发送一位数据,0代表应答、1代表非应答;

接收应答

在发送完一个字节后,主机在下一个时钟接受一位数据,判断从机是否应答。0代表应答,1代表非应答。(主机在接收之前需释放SDA)


 (未完)

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

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

相关文章

请问空三前启动引擎,提示这个错误是什么情况?

答:在AppData-Local-GEngine目录下找到G3DEngineConfig.ini,检查ServerCheckCMD后面是否存在路径 ,正常是为空,异常是为存在路径,需要清空该路径,然后重新启动引擎即可 重建大师是一款专为超大规模实景三维…

Python 提取PDF表格数据并保存到TXT文本或Excel文件

目录 安装Python库 Python提取PDF表格数据并保存到文本文档 Python提取PDF表格数据并保存到Excel文档 PDF文件常用于存储和共享各种类型的文档,这些文档可能包括大量的数据表格。通过提取这些PDF表格数据,我们可以将其导入到Excel、数据库或统计软件等…

基于openEuler22.03 LTS环境的容器项目实训——分布式微服务项目部署

一、说明 本文配置环境为VMware虚拟机(4核CPU,8 GB内存,40GB磁盘),OS为openEuler 22.03 LTS ,虚拟机要求能联网。 二、安装docker环境 2.1 安装docker相关软件包 [rootnode01 ~]# dnf -y install docker…

PCIE V3.0物理层协议学习笔记

一、说明 PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,它原来的名称为“3GIO”,是由英特尔在2001年提出的,旨在替代旧的PCI,PCI-X和AGP总线标准。 PCIe属于高速串行点对点双通道高…

Ubuntu 安装 eclipse 的详细过程及工程创建和编译配置

目录 一、安装环境二、下载依赖 java jdk三、下载 eclipse四、安装4.1 java 环境4.2 eclipse 安装4.3 打开 eclipse 五、配置 eclipse5.1 新建 C 工程5.2 工具链 配置5.3 头文件路径5.4 链接库5.5 编译 一、安装环境 Ubuntu 版本:22.04.3 位数:64-bit 二…

其实解决问题的方法很简单

大家好!我是编码小哥,欢迎关注,持续分享更多实用的编程经验和开发技巧,共同进步! 本例是一个动态数组的例子,实现数据的增加、删除、根据索引修改数值、获取数值。 dynamic_array.c #include "dy…

redis-stack部署概要

第一步,下载redis-stack 下载链接:Downloads - Redis 第二步,redis安装包解压缩 gzip -d redis-stack-server-7.2.0-v10.rhel8.x86_64.tar.gz tar -xvf redis-stack-server-7.2.0-v10.rhel8.x86_64.tar 第三步,编辑etc下的redis…

centos无法联网解决方案(9步完成

1.打开终端,输入 su - root 进入到管理员模式(-的前后都有空格哈) 切换后,显示的就是root... 2.. ,输入命令ip addr 2. 切换当前目录 cd /etc/sysconfig/network-scripts/ 3.输入命令,打开文件 vi /etc…

【C/C++】设计模式——工厂模式:简单工厂、工厂方法、抽象工厂

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

高通QCS6490开发(四):FV01 AI开发板系统烧录

本期主要介绍如何在FV01开发板上烧录镜像 所用硬件有&#xff1a; FV01开发板和type C线 操作步骤如下&#xff1a; 首先连接电源线开机&#xff0c;然后通过Type C线连接FV01开发板和PC&#xff0c;接线如下&#xff1a; 1&#xff09;将设备通过如下命令进入到EDL紧急下载…

C++ 计时器

文章目录 一、简介二、实现代码2.1 windows平台2.2 C标准库 三、实现效果 一、简介 有时候总是会用到一些计时的操作&#xff0c;这里也整理了一些代码&#xff0c;包括C标准库以及window自带的时间计算函数。 二、实现代码 2.1 windows平台 StopWatch.h #ifndef STOP_WATCH_H…

开源的图形化Windows软件安装升级方案:WingetUI

WingetUI&#xff1a;简化数字生活&#xff0c;WingetUI让软件管理轻松便捷- 精选真开源&#xff0c;释放新价值。 概览 WingetUI是在GitHub上开发的一个实用工具&#xff0c;专为Windows用户设计&#xff0c;旨在为常见的命令行包管理工具&#xff08;如Winget、Scoop、Pip、…

计算机毕业设计hadoop+hive+hbase学情分析 在线教育大数据 课程推荐系统 机器学习 深度学习 人工智能 大数据毕业设计 知识图谱

毕 业 设 计&#xff08;论 文&#xff09;开 题 报 告 1&#xff0e;结合毕业设计&#xff08;论文&#xff09;课题情况&#xff0c;根据所查阅的文献资料&#xff0c;每人撰写不少于1000字的文献综述&#xff1a; 一、研究背景和意义 “互联网”和大数据带来了网络教育的蓬…

API数据对接:本地缓存与日志记录的重要性

关键词&#xff1a;数据治理项目、API接口、数据中心、第三方系统、数据异常、本地缓存、日志记录、数据整合、多源异构数据、数据处理效率 阅读建议&#xff1a; 对于数据治理、API接口和系统集成领域的专业人士&#xff0c;本文深入剖析了本地缓存和日志记录在确保系统稳定性…

信息系统项目管理师0601:项目立项管理 — 考点总结(可直接理解记忆)

点击查看专栏目录 项目立项管理 — 考点总结(可直接理解记忆) 1.项目建议书(又称立项申请)是项目建设单位向上级主管部门提交项目申请时所必须的文件,是对拟建项目提出的框架性的总体设想。在项目建议书批准后,方可开展对外工作(掌握)。 2.项目建议书应该包括的核心内…

系统架构师考试(一)

瀑布模型&#xff08;SDLC&#xff09; 特点&#xff1a; 1、严格区分阶段&#xff0c;每个阶段因果关系紧密相连 2、只适合需求明确的项目 需求分析之后会产出软件需求规格说明书SRS 但是这个模型失败概率到95%&#xff0c;有以下缺陷&#xff1a; 它只适合需求明确的项目…

Spring Boot | Spring Boot 中 自定义“用户退出控制“、获取“登录用户信息“

目录: 一、SpringBoot 中 自定义 "用户授权管理" ( 总体内容介绍 ) :二、 自定义 "用户退出控制" ( 通过 "HttpSecurity类" 的 logout( )方法来实现 "自定义用户用户登录控制" ) :1.基础项目文件准备2.实现 "自定义身份认证"…

Java入门基础学习笔记25——死循环和循环嵌套

死循环&#xff1a; 可以一直执行下去的一种循环&#xff0c;如果没有干预不会停下来。 死循环的写法&#xff1a; 例&#xff1a; package cn.ensource.loop;public class EndLessLoopDemo5 {public static void main(String[] args) {// 目标&#xff1b;掌握死循环的写法w…

GitHub配置SSH协议|什么是SSH

前言 之前用云服务器和GitHub的时候&#xff0c;因为比较懒一直没有配置过ssh。随着最近项目的迫在眉睫&#xff0c;通过Vs Code链接服务器和从GitHub白嫖代码的频率的大幅增加&#xff0c;拒绝接触新事物鼠鼠我只好转求ssh。此篇文章记录了我自己创建ssh密钥、配置ssh密钥的步…

什么是网络端口?为什么会有高危端口?

一、什么是网络端口&#xff1f; 网络技术中的端口默认指的是TCP/IP协议中的服务端口&#xff0c;一共有0-65535个端口&#xff0c;比如我们最常见的端口是80端口默认访问网站的端口就是80&#xff0c;你直接在浏览器打开&#xff0c;会发现浏览器默认把80去掉&#xff0c;就是…