版权声明:本文为博主原创文章,遵循 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. badboy脚本录制工具的安装

    一.获取软件包 百度搜索badboy,或者直接访问官网:https://badboy.en.softonic.com/ 点击Download,下载安装包 或者从我的网盘提取: 链接:https://p ...

  2. 对Python中一些“坑”的总结及技巧

    一.赋值即定义 1.运行以下代码会出现报错 #!/usr/bin/env python #_*_conding:utf-8_*_ x = 100 def outer(): def inner(): x ...

  3. vue项目在git commit时,使用eslint检测

    用vue-cli3创建新项目可以自定义配置,选择eslint,所以eslint不需要配置, 项目根目录下面生成一个 .eslintrc.js文件,里面可以自定义配置eslint规则 现在在开发的时候, ...

  4. SQL实用技巧:如何分割字符串

    create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(col varchar(20)) as beg ...

  5. QT--电子时钟

    QT--电子时钟 简介: 使用了绘图事件.定时事件,有两个窗口,一个窗口用于设置时间(主窗口),一个是时钟窗口 1.主窗口 menu.h文件: #ifndef MENU_H #define MENU_ ...

  6. 10. 函数-lambda函数及高阶函数

    一.匿名函数解析 ​ 关键字lambda表示匿名函数,冒号前面的n表示函数参数,可以有多个参数.匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果. ​ 用匿名函数有 ...

  7. vue定义全局date过滤器(自定义JS文件模块和Moment.js库)

    自定义dateFormat.js文件模块 dateFormat.js /** * 时间字符串 转 时间戳 * @param {String} time_str 时间字符串(格式"2014-0 ...

  8. jQuery-跨域问题的处理

    调用登录接口时,后端一般会在调用登录接口成功后,在response中设置cookie,之后前端的每次请求都会自动地在请求头上加上后端设置好的cookie,这对前端来说是透明的. 当登录接口与登录后调用 ...

  9. python内置函数的使用(一)

    迭代器(iterator)和可迭代对象(iterable) 在python中,要实现要个对象可以进行遍历,也就是实现for循环,那么他必须是一个可迭代对象,例如string,tuple,list,di ...

  10. Glide缓存流程

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/cPLkefpEb3w12-uoiqzTig作者:连凌能 Android上图片加载的解决方案有多 ...