I2C基础知识
常识
- 两条总线线路:串行数据总线SDA,串行时钟总线SCL
- 每个连接到总线的器件都有唯一的地址供其他设备寻址
- 每个连接到总线的器件都可以作为发送器和接收器
- 是多主机总线,如果两个或更多主机同时初始化,数据传输可以通过重提检测和仲裁防止数据被破坏
- 串行的8bit双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s
- 连接到相同总线的I2C数量只受到总线的最大电容400pF的限制
- I2C通信的数据以8bit为单位,每次发送完一个数据都要等待接收方的ACK信号
术语
- 发送器:发送数据到总线的器件
- 接收器:从总线接收数据的器件
- 主机:发送起始/终止信号和时钟信号的器件
- 从机:被主机寻址的器件
- 仲裁 :是一个在有多个主机同时尝试控制总线但只允许其中一个控制总线并使传输不被破坏的过程
- 同步:两个或多个器件同步时钟信号的过程
- SDA:数据线通信期间,SDA的电平改变只能发生在SCL在低电平期间
- SCL:时钟线
起始与终止
通信的起始条件和终止条件都必须在SCL是高电平的时候被触发,SCL为高SDA由高->低为起始条件(S,start),SCL为高SDA由低->高为终止条件(P,stop)
正是因为正常通信的过程中如果SCL是高电平,SDA不允许改变,所以这两种情况可以用来标识S和P
总线在start后被认为处于忙碌状态,在stop的某段时间后总线被认为再次处于空闲状态
除了S作为起始信号,I2C还有重启信号Sr,如果在处于忙碌状态的总线中发送Sr(restart)而不产生P(stop),总线会一直处于忙碌的状态。Sr的作用是保证一个主机不间断的占用总线,它既是前一次数据传输的结束,又是后一次数据传输的开始,可以用来保证一台主机不间断的掌控总线。eg:主机发送了读请求之后,从机进行了应答,接下来还有随之而来的写请求,为了主机的读写操作能连贯的执行完毕再释放总线,此时就需要Sr来保证该主机不间断掌控总线,因为一旦在读之后发出停止信号,总线就有可能被其他主机掌管,该主机的写操作就会被延迟。
寻址
主机首先检测总线是否处于空闲状态,如果空闲就首先发送一个从机地址(MSB)+控制位(LSB)。7位寻址的话就是1111 XXX
,高4位属于固定地址不可改变,如果器件没有CPU,则由厂家固化,有CPU的话就由器件的初始化代码指定(注意不能和总线上其他器件的地址重叠),低3位为引脚设定地址,可以由外部引脚来设定(并非所有器件都可以设定)。控制位即0
表示主机会写W
信息到从机,1
表示从从机中读R
数据。和其他数据一样,主机发完这个byte继续产生一个时钟周期,并释放SDA为高阻态(I2C的SDA和SCL都需要上拉电阻保持高阻态),等待从机的ACK信号。
应答
一个主机设备发送了希望读写的设备地址到总线之后,总线上的所有器件都会收到一个主机发送的地址并与自身比对,如果与自身的地址相同,表示自己就是主机打算通信的对象。接下来从机可以有三种行为:ACK,NACK,拉低SCL。
ACK就是从机在第9个时钟周期将SDA电平拉低,表示从机成功的接收了刚才的8bit数据,主机收到了从机的ACK信号就可以继续发数据,或者准备好接收从机的数据。
NACK就是从机在第9个时钟周期不响应,表示从机没有成功的接收到刚才的8bit,主机接收到这个信号就可以发送Sr或采取其他行为。如果最后一次通信中主机是接收方,主机就会回应一个NACK信号(不响应)通知从机表示通信结束,并发送P或Sr。
如果从机没有准备好应答,就可以将SCL钳位在低电平,这样就可以使主机进入等待状态,直到从机准备就绪接收接下来的数据再释放SCL,通信就可以继续了。
I2C基础知识的更多相关文章
- 使用寄存器点亮LED——前言基础知识
在点亮LED之前,我们需要具备一些基础知识: GPIO—general purpose intput output 是通用输入输出端口的简称,简单来说就是软件可控制的引脚,STM32芯片的GPIO引脚 ...
- 转:PCIe基础知识
PCIe基础知识 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zqixiao_09/article/details/51842542 PCIe ...
- 【STM32H7教程】第15章 STM32H7的GPIO基础知识(重要)
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第15章 STM32H7的GPIO基础知识(重要) ...
- 012 PCIe总线的基础知识
一.PCIe总线的基础知识 与PCI总线不同,PCIe总线使用端到端的连接方式,在一条PCIe链路的两端只能各连接一个设备,这两个设备互为是数据发送端和数据接收端.PCIe总线除了总线链路外,还具有多 ...
- .NET面试题系列[1] - .NET框架基础知识(1)
很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...
- RabbitMQ基础知识
RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- selenium自动化基础知识
什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
随机推荐
- 讲讲Android事件拦截机制
简介 什么是触摸事件?顾名思义,触摸事件就是捕获触摸屏幕后产生的事件.当点击一个按钮时,通常会产生两个或者三个事件--按钮按下,这是事件一,如果滑动几下,这是事件二,当手抬起,这是事件三.所以在And ...
- Nancy之结合tinyfox给我们的应用提供简单的数据服务
说到提供数据服务给我们的一些应用,估计用的最多的也就是json和xml这两种数据格式 实现的方法也是多种多样,web api,mvc的jsonresult和contentresult...等等 本文是 ...
- C# DataGridView中指定的单元格不能编辑
注意:DataGridView控件是从.NET Framework 2.0版本开始追加的. ReadOnly属性的使用 DataGridView内所有的单元格不能编辑 当DataGridView.Re ...
- java——获取从控制台输入的数据的方法
一.使用标准输入串System.in System.in.read(); //一次只读入一个字节数据,但是我们往往希望获得的是一个字符串或者一组数字 二.使用Scanner获得一个字符串或一组 ...
- Lind.DDD.API核心技术分享
回到目录 关于Lind.DDD框架里API框架的技术点说明 讲解:张占岭 花名:仓储大叔 主要框架:Lind.DDD 目录 关于Lind.DDD.Authorization 关于授权的原理 关于Api ...
- C#中 反射中的Assembly(装载程序集):
反射中的Assembly(装载程序集):可以通过Assembly的信息来获取程序的类,实例等编程需要用到的信息. String assemblyName = @"NamespaceRef& ...
- 十一个行为模式之迭代器模式(Iterator Pattern)
定义: 提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示.使得存储和遍历两个职责相互分离,提高系统的可扩展性. 结构图: Iterator:抽象迭代器类,定义了访问和遍历元素的接口,例如:ne ...
- 十一个行为模式之命令模式(Command Pattern)
定义: 将一个请求封装成对象,使得请求发送者和请求接受者之间相互隔离,消除两者之间的耦合.引入命令类,使得不同请求对客户参数化,并且可以对命令添加附件操作,如:排队.撤销.日志.组合等. 结构图: C ...
- apache反向代理
正向代理是客户端发送请求给代理服务器,代理服务器将请求发给实际处理的服务器 反向代理是客户端发送请求给服务器(实际上是个代理服务器),服务器将请求发给实际处理的服务器 情景 在一台服务器上开了apac ...
- jquery如何实现(textarea) placeholder自动换行?
思路:利用文本框的聚焦和失焦事件 1.HTML结构 <textarea id="text1"></textarea> 2.js方法 <script&g ...