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

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)


 (未完)

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

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

相关文章

现代加密技术(对称和非对称加密)

1.分类 现代加密技术:对称和非对称加密,对称加密即共享密钥,非对称加密是公钥加密算法。 2.基础总结 AES是什么算法? 分组加密算法,对称加密算法AES的分组长度是?固定128位AES密钥长度是多少?支…

Shell编程之数组

一.数组定义方法 1.数组名称(数值1 数值2 数值3 数值4 数值5)数组名称("字符串1" "字符串2" "字符串4" "字符串5" "字符串6")(或者使用单引号) 如何查看数组的元素&#xff1…

java代码混淆工具ProGuard混淆插件

java代码混淆工具ProGuard混淆插件 介绍 ProGuard是一个纯java编写的混淆工具,有客户端跟jar包两种使用方式。可以将程序打包为jar,然后用工具进行混淆,也可以在maven中导入ProGuard的插件,对代码进行混淆。 大家都知道 java代…

ADS Momentum 仿真设置

1、选择Momenttum Microwave。 2、Layout不需要操作。 3、Partitioning 不需要操作。 4、没有叠层的话需要新建叠层,过孔可以在叠层中右键添加。 5、注意确认端口的Gnd Layer。 6、设置仿真频率。 7、Output Plan。 8、Option。 最后运行仿真,等待结果即…

C++ static_cast学习

static_cast可实现, 1 基本类型之间的转换 2 void指针转换为任意基本类型的指针 3 用于有继承关系的子类与父类之间的指针或引用的转换 用于基本类型转化时,会损失精度类似于C语言的强制转化; 下面先看一下void指针的转换; …

49-Qt控件详解:ltemViewsltemWidgets

1.List View:清单视图 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QListView> //字符串列表模型 #include <QStringListModel> #include <QMessageBox> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEcl…

如何在Sui智能合约中验证是否为多签地址

通过多签合约实现多个用户可访问的安全账户。多签&#xff08;multi-sig&#xff09;钱包和账户通过允许多个用户在预定义条件下访问共享资产&#xff0c;或让单个用户实施额外的安全措施&#xff0c;从而增强密钥管理。例如&#xff0c;多签钱包可以用于管理去中心化自治组织&…

码农慎入 | 入坑软路由,退烧IDC,Homelab折腾记

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 俗话说&#xff0c;入门软路由&#xff0c;退坑IDC 这一期&#xff0c;我们将深入探讨一个许多科技爱好者…

【介绍下JSON,JSON是什么?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Folder Icons for Mac v1.9激活版:自定义文件夹图标

在追求个性和品味的今天&#xff0c;Folder Icons for Mac 让您的Mac桌面焕然一新。支持多种格式的图片和图标文件&#xff0c;满足您不同的审美需求。同时&#xff0c;软件提供丰富的图标库和模板&#xff0c;让您在定制文件夹图标时更加得心应手。Folder Icons for Mac 不仅能…

【React】如何让函数式组件也能使用state——useState(Hooks)

React的函数式组件不同于类式组件&#xff0c;函数式组件没有自己的 this&#xff0c;看似没有操作state的能力 但是React官方提供了一个Hooks叫useState&#xff0c;它解决了函数式组件和类式组件的差异&#xff0c;让函数式组件拥有了类式组件所拥有的 state &#xff0c;同时…

Golang | Leetcode Golang题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; func reverseBetween(head *ListNode, left, right int) *ListNode {// 设置 dummyNode 是这一类问题的一般做法dummyNode : &ListNode{Val: -1}dummyNode.Next headpre : dummyNodefor i : 0; i < left-1; i {pre pre.Next}cur :…

vue2人力资源项目9权限管理

页面搭建 <template><div class"container"><div class"app-container"><el-button size"mini" type"primary">添加权限</el-button><el-table-column label"名称" /><el-table-co…

DS高阶:跳表

一、skiplist 1.1 skiplist的概念 skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价值是一样的&#xff0c;可以作为key或者key/value的查找模型。skiplist是由William Pugh发明的&#xff0c;最早出现于他在1990年发…

商品服务:SPUSKU规格参数销售属性

1.Object划分 1.PO&#xff08;Persistant Object&#xff09;持久对象 PO就是对应数据库中某个表中的一条记录&#xff0c;多个记录可以用PO的集合。PO中应该不报含任何对数据库的操作 2.DO(Domain Object) 领域对象 就是从现实世界中抽象出来的有形或无形的业务实体。 3…

蓝队技术 | 使用Sysmon日志识别和分析Windows恶意活动

在这篇文章中&#xff0c;我们将演示如何使用Sysmon日志来分析和了解恶意软件的各种行为&#xff0c;其中包括如何通过Firefox从Dropbox下载、运行、并使用Windows工具进行安装。本文将介绍Sysmon日志中各种有用的Event ID&#xff0c;以及如何识别和分析Windows操作系统上的恶…

(五)Spring教程——Spring IoC容器(上)

在Spring框架中&#xff0c;Bean的实例化和组装都是IoC容器配置元数据完成的。Spring框架提供的容器主要是基于BeanFactory和ApplicationContext两个接口&#xff0c;一种是实现BeanFactory接口的简单容器&#xff0c;另一种是实现ApplicationContext接口的高级容器。 BeanFact…

嵌入式开发十五:STM32中断系统

STM32 中断非常强大&#xff0c;几乎每个外设都可以产生中断&#xff0c;因此这里我们单独来介绍它&#xff0c;为后面介绍外设中断做铺垫。 目录 一、中断的介绍 1.1 中断的概念 1.2 中断优先级: 1.3 中断的嵌套 1.4 内部中断和外部中断 1.5 中断响应和事件响应 1.6 …

【C语言】指针(二)

目录 一、传值调用和传址调用 二、数组名的理解 三、通过指针访问数组 四、一维数组传参的本质 五、指针数组 六、指针数组模拟实现二维数组 一、传值调用和传址调用 指针可以用在哪里呢&#xff1f;我们看下面一段代码&#xff1a; #include <stdio.h>void Swap(i…

2005-2022年全国及各省绿色信贷水平测算数据(含原始数据+计算过程+计算结果)

2005-2022年全国及各省绿色信贷水平测算数据&#xff08;含原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2005-2022年 2、来源&#xff1a;工业统计年鉴、统计年鉴、其中2017年采用插值法填补 3、范围&#xff1a;31省 4、方法说明&#xff1a;选取各省六大高…