版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wzt_007/article/details/78622698
通信分为四大步骤,握手、数据交换、准备结束、正式结束

如以下场景:

两个陌生人是进行沟通,为了显得更有主次关系,选取老板和新员工进行沟通的场景,老板一般占有主动权,而且手中有新员工的基本信息,比如姓名,年龄,性别等。沟通开始:

老板:“XXX,欢迎你加入我们公司,为公司注入新的血液!”伸出握手姿势              —— 主握手

新员工:“承蒙厚爱,有幸加入我们公司,我觉得是一种光荣!”握手                      —— 握手成功

老板:“想必已经读过员工手册了吧,说说你对前两条的理解。”                            —— 执行沟通

新员工:“第一条……,第二条……”                                                                    —— 从应答

……

老板:“回答的很好,确实是我们迫切想招募的人,以后看你的精彩表现了!”        —— 主要求沟通结束

新员工:“一定不负厚望,必努力工作!”                                                            —— 从做好结束准备

老板离开                                                                                                             —— 沟通结束

主从器件

在通信的时候,总线上必须且只能有要有一个为主器件,其他的都为从器件
在总线上表现为主控的器件叫做主发送器/接收器(MASTER TRANSMITTER/RECEIVER),主器件只执行发送,不执行接收的,命名为主发送器(MASTER TRANSMITTER)

在总线上表现为被控的器件叫做从发送器/接收器(SLAVE RECEIVE/RTRANSMITTER),有些从器件只执行接收,不执行发送的,命名为从接受器(SLAVE RECEIVER)

一条I2C总线最多能挂多少个器件?

串行数据都是以一个字节一个字节的方式来衡量的,前几位用来表示地址(上述对话中的员工名字),地址的最后一位为读写操作位(READ/WRITTE位,简写为R/W,逻辑1表示读,逻辑0表示写),以最开始的一个字节作为地址来算的话,那么除去字节的最后读写标志位,就剩 8 – 1 = 7bit了,所以理论上以1个字节为地址来算的话,就可以分配2的7次方128个地址,就可以挂上128个器件(极端情况,假设这128个器件都是从机的话,就还需要挂一个主器件,合计就是128 + 1 = 129个器件了)。要是想挂更多的器件,那么就须得将地址位扩展,比如将前两个字节作为地址,去掉最后的一位读写标志位

以上是理论的算法,在实际的器件中,都是以第一个字节作为地址的,而且大部分的器件的地址高四位已经被根据不同功能的芯片分配了不同的编码(例如,AD/DA转换芯片PCF8591的前四位为1001,E2PROM芯片AT24C02的前四位为1010,具体的芯片就得查查手册了,这里只说明原理),那么同一种功能芯片(地址前4位都相同)最多只有 8 – 4 – 1 = 3位用来分配地址了,也就是最多可以挂2的3次方8个同种功能芯片。用一个问题来深化理解一下。

握手与结束

I2C协议有规定,在SCL和SDA均为高电平的前提下,检测到SDA有下降沿信号,则建立I2C的通信开始;同样的,在SCL为高电平,SDA为低电平的前提下,检测到SDA有上升沿信号,则I2C通信正式结束。

由图中虚线框中引出的:总线闲的时候,两根信号线都是高电平的。不管是通信建立和通信结束阶段,SCL都是高电平,SDA的变化控制着通信的建立与结束;在SCL为高电平的情况下,SDA信号的转变就对通信起着强制性作用,要么通信建立,要么通信正式结束,有且仅有这两种情况!也就是说,在数据交换的过程中,要对SCL这根信号线尤为注意,在数据变化的时候,一定要保证SCL是为低电平!让数据的变化在SCL的“安全”状态下进行,所以需要牢记一点,数据变化,时钟线低电平先行,如下图所示。

通信

在每次写数据的时候,每写一个字节数据(不论是必要的从器件地址数据、从器件控制数据,还是需要写到从机里的数据),从器件都有一个ACK(从器件的应答实现是将SDA线拉成低电平,所以在写完第8位数据以后,切记要把SCL的电平拉成低电平,等一小段时间以后,在将数据线拉高去读SDA的数据,原因在握手和结束讲了。读数据时,主器件每接收到从器件的一个字节数据,也都要回复一个ACK,主器件ACK有两种,一种表示收到数据,且准备接收下一次数据(0,ACK),一种是收到数据,但不准备接收下一次数据(1,NO ACK)

我总结的读写流程,如果有问题,欢迎大家指出

读:

start>>(主:地址)>>(从:first_Data)>>(主:ACK)>>(从:second_Data)>>(主:ACK)>>(从:third_Data)>>(主:NO ACK)>>stop

start>>(主:地址)>>(从:ACK)>>(主:first_Data)>>(从:ACK)>>(主:second_Data)>>(从:ACK)>>(主:third_Data)>>(从:ACK)>>stop
————————————————
版权声明:本文为CSDN博主「wzt_007」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wzt_007/article/details/78622698

I2C协议学习笔记的更多相关文章

  1. HTTP协议学习笔记(四)

    HTTP协议学习笔记(四) 与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率. 1.用单台虚拟主机实现多个域名 ...

  2. HTTP协议学习笔记(三)

    HTTP协议学习笔记(三) 1.状态码告知从服务器端返回的请求结果 状态码的职责是当客户端向服务端向服务端发送请求时,描述返回的请求结果.借助状态码,用户可以知道服务端是正常处理了请求,还是出现了错误 ...

  3. HTTP协议学习笔记(二)

    HTTP协议学习笔记(二) 1.HTTP报文 HTTP报文:用于HTTP协议交互的信息.请求报文:请求端(客户端)的HTTP报文叫做请求报文.响应报文:响应端(服务端)的HTTP报文叫做响应报文. H ...

  4. HTTP协议学习笔记(一)

    HTTP协议学习笔记(一) 1.HTTP协议用于客户端和服务端之间的通信 客户端:请求访问文本或图像等资源的一端服务端:提供资源响应的一端 在两台计算机之间使用HTTP协议通信时,在一条通信线路上必定 ...

  5. I2C总线协议学习笔记 (转载)

    1.I2C协议   2条双向串行线,一条数据线SDA,一条时钟线SCL.   SDA传输数据是大端传输,每次传输8bit,即一字节.   支持多主控(multimastering),任何时间点只能有一 ...

  6. TCP/IP协议学习笔记

    计算机网络基础知识复习汇总:计算机网络基础知识复习 HTTP协议的解析:剖析 HTTP 协议 一个系列的解析文章: TCP/IP详解学习笔记(1)-- 概述 TCP/IP详解学习笔记(2)-- 数据链 ...

  7. 【转】树莓派学习笔记——I2C Tools 学习笔记

    原文网址:http://blog.csdn.net/xukai871105/article/details/15029843 1.安装     I2C驱动载入和速率修改请查看博文[树莓派学习笔记——I ...

  8. IIC协议学习笔记

    "移植"的重要性:并非所有的电路都得自己设计,到了一定阶段,"移植"也是一种学习能力.--CrazyBingo 转眼间期末又到了,最近开始了所谓的期末总预习,比 ...

  9. RSA算法、SSL协议学习笔记

    最近学习计算机网络,涉及到SSL协议,我想起了去年密码学课程讲过的非对称加密RSA算法,结合阮老师的博客,写写学习笔记,这里再回忆一下. RSA算法 RSA算法是一种非对称密码算法,所谓非对称,就是指 ...

随机推荐

  1. 高级Java开发人员最常访问的几个网站

    这是高级Java开发人员最常访问的几个网站. 这些网站提供新闻,一般问题或面试问题的答案,精彩的讲座等.质量是优秀网站的关键因素,这此网站都有较高的质量内容.下面逐一介绍: 1. Stackoverf ...

  2. Prometheus学习系列(四)之Prometheus 配置说明

    前言 本文来自Prometheus官网手册 和 Prometheus简介 说明 Prometheus通过命令行和配置文件进行配置,命令行配置不能修改的系统参数(例如存储位置,要保留在磁盘和内存中的数据 ...

  3. Mysql字符串截取_获取指定字符串中的数据

    前言:本人遇到一个需求,需要在MySql的字段中截取一段字符串中的特定字符,类似于正则表达式的截取,苦于没有合适的方法,百度之后终于找到一个合适的方法:substring_index('www.sql ...

  4. CSS入门(定位之浮动定位、伪类之鼠标悬停、光标修改和透明度修改和列表样式)

    一.定位 所为定位,实际上就是定义元素框相对于其正常位置,应该出现在哪儿 定位就是改变元素在页面上的默认位置 分类: 普通流定位(元素默认的定位方式) 浮动定位 相对定位 绝对定位 固定定位 1.普通 ...

  5. Windows下RabbitMQ 的下载、配置、Java实现生产者和消费者例子

    RabbitMQ是一个轻量级的消息代理中间件,支持多种消息通信协议,支持分布式部署,支持运行于多个操作系统,具有灵活.高可用等特性.RabbitMQ支持多种协议,其中最为重要的是高级消息队列协议(AM ...

  6. 团队项目之Scrum4

    小组:BLACK PANDA 时间:2019.11.24 每天举行站立式会议 提供当天站立式会议照片一张 2 昨天已完成的工作 2 基本实现web富文本编辑功能 后台的编辑接口已经基本完成,还有一些b ...

  7. Flutter速记

    一.安装 参考https://www.jianshu.com/p/cda416e2fc0d         二.换图标   三.打包 参考:https://www.cnblogs.com/shuang ...

  8. C#&.Net干货分享- 构建Spire-Office相关Helper操作Word、Excel、PDF等

    先下载好如下的组件: 直接使用完整源码分享: namespace Frame.Office{    /// <summary>    /// Spire_WordHelper    /// ...

  9. 跨域问题,解决方案-Nginx反向代理

    跨域问题,解决之道 跨域问题,在日常开发过程中,是一个非常熟悉的名词.今天的话题,结合我之前的项目场景,讨论下<跨域问题,解决之道>. 跨域是什么 跨域问题,是由于JavaScript出于 ...

  10. Java大数类 BigInteger

    package bigint; /** * This class encapsulates a BigInteger, i.e. a positive or negative integer * wi ...